当前位置:   article > 正文

Unity与iOS交互(3)——常见交互示例_unity ios 交互

unity ios 交互

【前言】

前面两篇文章详细介绍了Unity与iOS交互的原理,相信仔细看了之后基本了解了,当然你可能需要花费好几个小时才能看明白。现在缺的就是具体的调用代码了,相信你其实可以自己一点点整理出来,但会花费不少时间趟坑,这里我们直接给出常见的交互代码示例。

【基础的交互】

传递基本数据类型和sring类型

  1. public class Sample : MonoBehaviour
  2. {
  3. [DllImport("__Internal")]
  4. static extern void PassIntAndString (int a, string b);
  5. }
  1. extern "C" void PassIntAndString(int a,const char* b)
  2. {
  3. NSLog(@"a = %d", a);
  4. NSString *str = [NSString stringWithUTF8String:b];
  5. NSLog(@"%@", str);
  6. }

传递基本数据类型的数组

有时候要传递的数据很多,例如一张图片的数据,这时候可能会用到数组

  1. public class Sample : MonoBehaviour
  2. {
  3. [DllImport("__Internal")]
  4. private static extern void SendImageData (int length, int[] data);
  5. }
  1. extern "C" void SendImageData(int length,int* data)
  2. {
  3. for (int i = 0; i < length; i++) {
  4. NSLog(@"imagedata %d : %d", i, data[i]);
  5. }
  6. }

通过MonoPInvoke让OC直接回调C#函数

一般来说,我们都会用UnitySendMessage来实现OC调用C#,即使是回调函数也一样。当然,UnitySendMessage涉及到查找transform会慢一些。如果对性能有要求,那就需要借助PInvoke来实现回调。使用UnitySendMessage时是线程安全的,使用PInvoke时要自己维护线程安全。

  1. public class Sample:MonoBehaviour
  2. {
  3. //回调参数必须有MonoPInvokeCallBack,而且是static的
  4. [MonoPInvokeCallback(typeof(CallBack))]
  5. public static int PassCallBack(string url) {
  6. }
  7. [DllImport("__Internal")]
  8. private static extern void SetCallBack(CallBack cb );
  9. [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
  10. public delegate int CallBack(string url);
  11. private void Set ()
  12. {
  13. SetCallBack (PassCallBack);//直接把函数指针传递过去
  14. }
  15. }
  1. #if defined(__cplusplus)
  2. extern "C"
  3. {
  4. #endif
  5. // C#设置过来的函数指针类型
  6. typedef int (*PassCallBack)(const char*);
  7. static PassCallBack callBack;
  8. void SetCallBack(PassCallBack cb) {
  9. callBack = cb;
  10. }
  11. #if defined(__cplusplus)
  12. }
  13. #endif
  14. void SetUrl(const char* url) {//回调
  15. if (callBack != nil) {
  16. callBack(url);
  17. }
  18. }

OC传递基本数据类型的数组给C#

  1. public class Sample:MonoBehaviour
  2. {
  3. //回调参数必须有MonoPInvokeCallBack,而且是static的
  4. [MonoPInvokeCallback(typeof(CallBack))]
  5. public static int PassCallBack(int length,IntPtr data) {
  6. byte[] buffer = new byte[length];
  7. Marshal.Copy(data, buffer, 0, length);//将数据拷贝出来
  8. }
  9. [DllImport("__Internal")]
  10. private static extern void SetCallBack(CallBack cb);
  11. [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
  12. public delegate int CallBack(int length,IntPtr data);
  13. private void Set ()
  14. {
  15. SetCallBack (PassCallBack);//直接把函数指针传递过去
  16. }
  17. }
  1. #if defined(__cplusplus)
  2. extern "C"
  3. {
  4. #endif
  5. // C#设置过来的函数指针类型
  6. typedef int (*PassCallBack)(int,void*);
  7. static PassCallBack callBack;
  8. void SetCallBack(PassCallBack cb) {
  9. callBack = cb;
  10. }
  11. #if defined(__cplusplus)
  12. }
  13. #endif
  14. void SendData(int length) {//回调
  15. NSMutableArray *mutableArray = [NSMutableArray array];
  16. NSArray *array = [NSArray arrayWithArray:mutableArray];
  17. if (callBack != nil) {
  18. callBack(length,array);
  19. }
  20. }

传递一个C#对象

传递对象有两种方式,一种是将对象序列化转为数组,相当于传递基本数据类型的数组,此处不 赘述,然后反序列化还原对象;另一种是将对象指针传递出去,类似传递函数指针。

对象指针传递

  1. using System.Runtime.InteropServices;
  2. public class Sample {
  3. [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
  4. public delegate void CallBack(IntPtr objectPtr);
  5. [DllImport("__Internal")]
  6. private static extern void PassObject(IntPtr objectPtr, CallBack callback);
  7. [MonoPInvokeCallback(typeof(CallBack))]
  8. private static void GetObject(IntPtr objectPtr) {
  9. GCHandle handle = (GCHandle) objectPtr;
  10. //从指针读取TestObjet
  11. TestObjet test = handle.Target as TestObjet;
  12. handle.Free ();
  13. }
  14. private static void Set() {
  15. TestObject test = new TestObject();
  16. IntPtr objectPtr = (IntPtr)GCHandle.Alloc (TestObject);
  17. PassObject (objectPtr, GetObject);
  18. }
  19. }
  20. public class TestObjet
  21. {
  22. public int a;
  23. public bool b;
  24. }

【复杂的交互】

iOS和Unity界面跳转

两个界面跳转实际是要替换显示画面,而在iOS上画面的显示是在UIWindow中的,修改UIWindow的rootViewController即可。

将Unity作为库整合到Android或iOS中

【参考】 

Unity3D与iOS的交互 - 简书

Unity - Manual: Building plug-ins for iOS

iOS 与 Unity 消息传递 (Swift 与 C#) - 简书 (jianshu.com) 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/神奇cpp/article/detail/748797
推荐阅读
相关标签
  

闽ICP备14008679号