我知道为Unity创建插件的基本前提是为Unity中要调用的所有类创建一个包装器。但是,我发现的所有文档和示例都预期会有相应的.cpp(如果是c ++)或.mm(如果是objective-c)文件。
但是我正在尝试为一些不包含任何源文件的本机iOS代码创建插件。我有权访问的是四个头文件和一个.a文件。 Which I have gotten from here.
现在,因为我没有任何.mm文件来包装我有点困惑,我怎么能把这些文件引入Unity,以便我可以从内部调用它们。有没有人曾经这样做过?
有人可以向我指出一些文档,或任何可能对我有帮助的东西,将4个头文件和.a文件作为插件引入Unity吗?
请记住,我没有可访问的源文件。只有头文件本身。
答案 0 :(得分:2)
您不需要源文件,只要您知道函数的声明,即使是头文件也不需要。
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");
常见的陷阱:
答案 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