适用于Unity的iOS插件

时间:2013-10-31 10:54:04

标签: c# ios plugins unity3d

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

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

现在,因为我没有任何.mm文件来包装我有点困惑,我怎么能把这些文件引入Unity,以便我可以从内部调用它们。有没有人曾经这样做过?

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

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

3 个答案:

答案 0 :(得分:2)

您不需要源文件,只要您知道函数的声明,即使是头文件也不需要。

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

答案 1 :(得分:1)

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

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

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

2)确保.a文件是使用libstdc ++(GNU C ++标准库)编译的,因为Unity要求。

答案 2 :(得分:1)

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

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

你的工作有点容易,因为大多数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文件放在插件/ iOS中,你就会很好。

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