版本:Unity 6 (6000.0)
语言:英语
调用 iOS 原生插件
自动插件集成

从原生代码回调

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

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

使用 UnitySendMessage

UnitySendMessage 看起来像这样

UnitySendMessage("GameObjectName1", "MethodName1", "要发送的消息");

有三个参数

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

UnitySendMessage 具有以下限制

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

使用委托

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

要使用委托

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

然后,原生代码中的函数指针指向 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 原生插件
自动插件集成