构建 iOS 插件

本页详细说明了 iOS 平台的本地代码插件

为 iOS 创建带本地插件的应用程序

  1. 按以下方式在 C# 文件中定义外部方法:
    [DllImport ("__Internal")]
    private static extern float FooPluginFunction ();
  2. 设定 iOS 编辑器的构建目标
  3. 将本地代码源文件添加至生成的 XCode 工程“类”文件夹(工程更新不会覆盖此文件夹,但务必备份本地代码)。

如果使用 C++ (.cpp) 或 Objective-C++ (.mm) 实现插件,那么必须要确保您创建的功能使用 C linkage 方式声明,避免出现名称重整问题

extern "C" {
  float FooPluginFunction ();
} 

以 C 或 Objective-C 编写的插件无需此项操作,因为这些语言不使用名称重整。

从 C# 使用插件

iOS 本地插件只有在部署到实际设备之后才能被调用,因此,建议所有本地代码的类函数都使用一个额外的 C# 代码层包装。此代码应检查 Application.platform,而且仅在应用程序在设备上运行时调用本地类函数;应用程序在编辑器中运行时将返回虚值。查看 Bonjour 浏览器应用程序的案例。

从本地代码中调用 C# / JavaScript

Unity iOS 通过 UnitySendMessage:
UnitySendMessage("GameObjectName1", "MethodName1", "Message to send");

支持有限的本地管理回调功能。这项功能包括三个参数:目标游戏对象 (GameObject) 的名称、调用这一对象的脚本类函数以及传递给所调用类函数的信息字符串。

已知限制:

  1. 只有符合以下命名规则的脚本类函数才能被本地代码调用: function MethodName(message:string)
  2. UnitySendMessage 调用为异步,并且有一帧的延时。

自动插件集成

Unity iOS 以有限的方式支持自动插件集成。在资源 (Assets)/插件 (Plugins)/iOS 文件夹内所有扩展名为.a.m.mm.c.cpp 的文件都将自动合并到生成的 Xcode 工程。但是,合并通过将资源 (Assets)/插件 (Plugins)/iOS 中的文件符号链接至最终目的地来完成,这可能影响部分工作流程。.h 文件不包含在 Xcode 工程树内,但是它们将出现在目标文件夹中,从而实现 .m/.mm/.c/.cpp 文件编译。

注意:目前不支持子文件夹。

iOS 提示

  1. 在 iOS 中托管和非托管的调用非常占用处理器。尽量避免在一帧内调用多个本地类函数。
  2. 如上所述,使用调用设备本地代码的 C# 层包装本地类函数,并在编辑器中返回虚值。
  3. 本地类函数返回的字符串值应为 UTF-8 编码,并且分配在堆上。这种字符串可在 Mono 上进行自由编组调用。
  4. 如上所述,XCode 工程的“类”文件是很好的保存本地代码的位置,因为工程更新之后,它不会被覆盖。
  5. 另一个很好的储存本地代码的位置是资源 (Assets) 文件夹或其子文件夹。只需从 XCode 工程中将引用添加至本地代码文件:右击"类 (Classes)" 子文件夹并选择“添加 (Add)->现有文件 (Existing files)...”。

示例

Bonjour 浏览器实例

点击此处可查看使用本地代码插件的简单实例。

这一实例演示了如何在 Unity iOS 应用程序中调用 objective-C 代码。此应用程序实现了非常简单的 Bonjour 客户端。 此应用程序包括 Unity iOS 工程(Plugins/Bonjour.cs 是本地代码的 C# 接口,而 BonjourTest.js 则是实现应用程序逻辑的 JS 脚本)和应添加至内置 XCode 工程的本地代码(资源 (Assets)/ 代码 (Code))。

Page last updated: 2013-06-29