【问题标题】:iOS Plug ins for Unity适用于 Unity 的 iOS 插件
【发布时间】:2013-10-31 10:54:03
【问题描述】:

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

但是,我正在尝试为一些不包含任何源文件的本机 iOS 代码创建插件。我只能访问四个头文件和一个 .a 文件。 Which I have gotten from here.

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

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

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

【问题讨论】:

    标签: c# ios plugins unity3d


    【解决方案1】:

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

    Building Plugins for iOS中所述:

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

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

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

    3.) 在 C# 类中声明 RegisterUnityIPodCallbackListener

    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 项目中
    • 在编辑器播放器中进行测试时提供后备解决方案

    【讨论】:

      【解决方案2】:

      这是另一个指南:How to build Unity3d Plugin for iOS

      如果您遇到诸如“未定义的架构符号...”之类的错误,请注意几点

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

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

      【讨论】:

      • #2 真的是必需品吗?我想构建一个使用各种 C++11 功能的静态库,所以我一直在使用 libc++(支持 C++11 的 LLVM C++ 标准库)。我无法链接最终的 Unity XCode 项目,如果 #2 为真,我也看不到解决方案。
      【解决方案3】:

      您正在使用的 Estimote SDK 具有 ObjectiveC 类。 ObjectiveC 中的函数不能通过 Unity 插件直接调用(C++ 类也可以)。原因是函数名是managled when you compile

      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 class 为例,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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-05
        相关资源
        最近更新 更多