2

我知道为 Unity 创建插件的基本前提是为要从 Unity 中调用的所有类创建一个包装器。但是,我发现的所有文档和示例都期望有一个相应的 .cpp(如果是 c++)或 .mm(如果是 Objective-c)文件。

但是,我正在尝试为一些不包含任何源文件的本机 iOS 代码创建插件。我只能访问四个头文件和一个 .a 文件。我从这里得到的。

现在,因为我没有要包装的任何 .mm 文件,我有点困惑如何将这些文件引入 Unity,以便我可以从内部调用它们。以前有人做过吗?

有人可以向我指出一些文档或任何可能对我有帮助的文件,以将 4 个头文件和 .a 文件作为插件引入 Unity 吗?

请记住,我没有可以访问的源文件。只有头文件本身。

4

3 回答 3

2

只要知道函数的声明,就不需要源文件,甚至不需要头文件。

为 iOS 构建插件中所述:

1.) 将您的 .a 文件放入 Assets/Plugins/iOS

2.)查看头文件以获取您需要的函数签名,例如

void RegisterUnityIPodCallbackListener (const char* gameObject, const char* method);

3.)RegisterUnityIPodCallbackListener通过以下方式在 C# 类中声明:

public class IPodHandler {
    [DllImport("__Internal")]
    private static extern void RegisterUnityIPodCallbackListener (string gameObject, string method);
    public static void MyRegisterUnityIPodCallbackListener () {
       if (Application.platform == RuntimePlatform.IPhonePlayer) {
           RegisterUnityIPodCallbackListener (GAME_OBJECT, METHOD);
       }
    }
}

4.) 在适当的位置致电:

IPodHandler.MyRegisterUnityIPodCallbackListener ("MyCallbackGameObject", "MyCallbackMethod");

常见的陷阱:

  • 您不应该在 Assets/Plugins/iOS 中构建目录结构,否则文件不会被复制到生成的 Xcode 项目中
  • 在编辑器播放器中进行测试时提供后备解决方案
于 2013-10-31T19:57:27.437 回答
1

您正在使用的 Estimote SDK 具有 ObjectiveC 类。ObjectiveC 中的函数不能通过 Unity 插件直接调用(C++ 类也可以)。原因是函数名称在编译时被管理。

Unity C# 类和库之间的接口必须是纯 C 接口。这就是为什么 .a 文件旁边经常有 .mm 或 .cpp 文件的原因。这些是在纯 C 包装器中包装 C++ 或 ObjectiveC 类。

你的工作稍微容易一些,因为大多数 Estimote 函数似乎都是类函数。所以你不需要编写包装函数来创建和删除 NSObjects。

这是我写的一个例子,一个围绕 TestFlightSDK 的纯 C 包装器。https://github.com/notoes/TestFlightUnity/blob/master/src/TestFlightCBinding.mm

请注意 extern "C" 块,强制文件代码在没有名称修改的情况下编译。一个 c 函数签名,然后是函数内的 ObjectiveC 调用。

因此,以 Esitmote ESTBeacon 类为例,connectToBeacon 调用可能如下所示:

extern "C" {
    void ESTBeacom_Connect()
    {
        [ESTBeacon connectToBeacon];
    }
}

.cs 函数看起来像这样:

class ESTBeacon {
    [DllImport ("__Internal")]
    private static extern void ESTBeacon_Connect();

    public static void Connect() {
        if( Application.platform == RuntimePlatform.IPhonePlayer )
            ESTBeacon_Connect()            
    }
} 

将 .cs、.mm 和 .a 文件放在 Plugins/iOS 中,一切都会好起来的。

使用此参考了解如何传递各种数据类型。http://www.mono-project.com/Interop_with_Native_Libraries

于 2013-11-01T08:46:57.137 回答
1

这是另一个指南:如何为 iOS 构建 Unity3d 插件

如果您收到诸如“未定义的架构符号...”之类的错误,请注意一些事项

1) 确保 .a 文件中使用的架构与您的架构相匹配(例如 armv7)

2) 确保使用 libstdc++(GNU C++ 标准库)编译 .a 文件,因为 Unity 需要这样做。

于 2013-11-01T07:45:35.597 回答