Version: 6000.3
语言: 中文
调用 iOS 的原生插件
自动插件集成

从本机代码回调

Unity iOS 支持使用以下方法之一的有限的原生到托管回调功能:

提示:托管到非托管调用在 iOS 上占用大量处理器。尽量避免每帧调用多个本机方法。

使用 UnitySendMessage

UnitySendMessage看起来像这样:

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

有三个参数:

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

UnitySendMessage有以下限制:

  1. 在本机代码中,只能调用与以下签名相对应的脚本方法:void MethodName(string message);.
  2. 调用UnitySendMessage是异步的,延迟为一帧。
  3. 如果两个或两个以上游戏对象Unity 场景中的基本对象,可以表示角色、道具、风景、相机、航路点等。游戏对象的功能由附加到它的组件定义。更多信息
    请参阅术语表
    具有相同的名称,这可能会导致冲突,当您使用UnitySendMessage.

使用委托

使用委托时,C# 端的方法必须是静态的,并用MonoPInvokeCallback属性。

要使用委托,请执行以下作:

  1. 将该方法作为委托传递给 extern 方法。
  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 的原生插件
自动插件集成