Unity iOS 支持有限的原生到托管回调功能,可通过以下两种方式实现:
提示:托管到非托管调用在 iOS 上是处理器密集型操作。尽量避免每帧调用多个原生方法。
UnitySendMessage 如下所示:
UnitySendMessage("GameObjectName1", "MethodName1", "Message to send");
有三个参数:
UnitySendMessage 具有以下局限性:
void MethodName(string message);。UnitySendMessage 的调用是异步的,并且存在一帧的延迟。UnitySendMessage 时可能会导致冲突。
当使用委托时,C# 端的方法必须是静态的,并且必须使用 MonoPInvokeCallback 属性进行标记。
使用委托步骤如下:
原生代码中的函数指针将指向 C# 中的静态方法。
该方法的 C# 代码如下所示:
delegate void MyFuncType();
[AOT.MonoPInvokeCallback(typeof(MyFuncType))]
static void MyFunction() { }
[DllImport ("__Internal")]
static extern void RegisterCallback(MyFuncType func);
然后,接受回调的 C 代码如下所示:
typedef void (*MyFuncType)();
void RegisterCallback(MyFuncType func) {}
注意:确保从原生方法返回的字符串值采用 UTF–8 编码,并在堆上分配内存。