本页面将介绍适用于 iOS 平台的原生代码插件。
在 C# 文件中定义 extern 方法,如下所示:
[DllImport ("__Internal")]
private static extern float FooPluginFunction();
将 Editor 设置为 iOS 构建目标。
将本机代码源文件添加到生成的 Xcode 项目的 Classes 文件夹中(更新项目时不会覆盖此文件夹,但不要忘记备份您的本机代码)。
如果使用 C++ (.cpp) 或 Objective-C++ (.mm) 来实现该插件,必须确保使用 C 链接来声明函数以免发生名称错用问题。
extern "C" {
float FooPluginFunction();
}
用 C 或 Objective-C 编写的插件不需要此声明,因为这些语言不存在名称错用。
iOS 原生插件只能在实际设备上部署时调用,因此建议使用额外的 C# 代码层封装所有本机代码方法。此代码应检查 Application.platform 并仅当应用程序在设备上运行时才调用本机方法;在 Editor 中运行应用程序时,可返回虚拟值。请参阅 Bonjour 浏览器示例应用程序来查看示例。
Unity iOS 通过 UnitySendMessage 支持有限的本机到托管回调功能:
UnitySendMessage("GameObjectName1", "MethodName1", "Message to send");
此函数有三个参数:目标游戏对象的名称、要在该对象上调用的脚本方法以及要传递给被调用方法的消息字符串。
已知限制:
function MethodName(message:string)
Unity iOS 在一定程度上支持自动插件集成。位于 Assets\Plugins\iOS 文件夹中的扩展名为 .a、.m、.mm、.c、.cpp 的所有文件都将自动合并到生成的 Xcode 项目中。但是,合并是通过将 Assets\Plugins\iOS 中的文件符号链接到最终目标来完成的,而这可能会影响某些工作流程。.h 文件不包含在 Xcode 项目树中,但会出现在目标文件系统中,从而允许编译 .m/.mm/.c/.cpp 文件。
注意:当前不支持子文件夹。
可以在此处找到使用原生代码插件的简单示例
此示例演示如何从 Unity iOS 应用程序 调用 objective-C 代码。该应用程序实现了一个非常简单的 Bonjour 客户端。 该应用程序包含 Unity iOS 项目(_Plugins\Bonjour.cs_ 是本机代码的 C# 接口,而 BonjourTest.cs 是实现应用程序逻辑的脚本)和应该添加到构建的 Xcode 项目中的本机代码 (Assets\Code)。