Version: Unity 6.0 (6000.0)
语言 : 中文
调用 iOS 的原生插件
自动插件集成

从原生代码回调

Unity iOS 支持有限的原生到托管回调功能,可通过以下两种方式实现:

提示:托管到非托管调用在 iOS 上是处理器密集型操作。尽量避免每帧调用多个原生方法。

使用 UnitySendMessage

UnitySendMessage 如下所示:

UnitySendMessage("GameObjectName1", "MethodName1", "Message to send");

有三个参数:

  • 目标游戏对象的名称
  • 用于调用该对象的脚本方法
  • 用于传递给被调用方法的消息字符串

UnitySendMessage 具有以下局限性:

  1. 原生代码只能调用签名如下所示的脚本方法:void MethodName(string message);
  2. UnitySendMessage 的调用是异步的,并且存在一帧的延迟。
  3. 如果多个游戏对象具有相同的名称,则在使用 UnitySendMessage 时可能会导致冲突。

使用委托

当使用委托时,C# 端的方法必须是静态的,并且必须使用 MonoPInvokeCallback 属性进行标记。

使用委托步骤如下:

  1. 将方法作为委托传递给外部方法。
  2. 在原生代码中实现一个 extern 方法,该方法接收一个指向具有相应签名的函数的指针。

原生代码中的函数指针将指向 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 编码,并在堆上分配内存。

其他资源

调用 iOS 的原生插件
自动插件集成