C# 用于Unity的iOS插件
我知道为Unity创建插件的基本前提是为您希望从Unity中调用的所有类创建包装器。然而,我发现的所有文档和示例都需要相应的.cpp(如果是c++)或.mm(如果是objective-c)文件 但是,我正在尝试为一些不包含任何源文件的本机iOS代码创建一个插件。我只能访问四个头文件和一个.a文件 现在,因为我没有任何.mm文件需要包装,我有点困惑,我如何才能将这些文件引入统一,以便从内部调用它们。以前有人这样做过吗 有人能告诉我一些文档,或者任何可以帮助我将4个头文件和.a文件作为插件引入Unity的东西吗C# 用于Unity的iOS插件,c#,ios,plugins,unity3d,C#,Ios,Plugins,Unity3d,我知道为Unity创建插件的基本前提是为您希望从Unity中调用的所有类创建包装器。然而,我发现的所有文档和示例都需要相应的.cpp(如果是c++)或.mm(如果是objective-c)文件 但是,我正在尝试为一些不包含任何源文件的本机iOS代码创建一个插件。我只能访问四个头文件和一个.a文件 现在,因为我没有任何.mm文件需要包装,我有点困惑,我如何才能将这些文件引入统一,以便从内部调用它们。以前有人这样做过吗 有人能告诉我一些文档,或者任何可以帮助我将4个头文件和.a文件作为插件引入Uni
请记住,没有我可以访问的源文件。只有头文件本身 您不需要源文件,只要知道函数的声明,就不需要头文件 如中所述: 1.)将.a文件放在Assets/Plugins/iOS中 2.)查看头文件以获得所需的函数签名,例如
void RegisterUnityIPodCallbackListener (const char* gameObject, const char* method);
3.)通过以下方式在C#类中声明注册表UnityIpodCallbackListener:
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项目中
- 在编辑器播放器中测试时提供回退解决方案
void RegisterUnityIPodCallbackListener (const char* gameObject, const char* method);
3.)通过以下方式在C#类中声明注册表UnityIpodCallbackListener:
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) 确保.a文件中使用的体系结构与您的相匹配(例如armv7)
2)确保L.STBD+++(GNU C++标准库)编译.A文件,因为统一要求.< /P> < P>这里还有另一个指南:
如果您遇到类似“未定义的架构符号…”之类的错误,请注意几点 1) 确保.a文件中使用的体系结构与您的相匹配(例如armv7)2)确保.AL文件是用LIbSTDC++ +(GNU C++标准库)编译的,因为Unity需要..P/>< P>。ObjectiveC中的函数不能通过统一插件(可以是C++ C++类)直接调用。原因是函数名不正确
Unity C#类和库之间的接口必须是纯C接口。这就是为什么在.a文件的旁边经常有.mm或.cpp文件。这些是在纯C包装中包装C++或ObjeVEC类。 您的工作会简单一些,因为大多数Estimote函数似乎都是类函数。因此,您不需要编写包装器函数来创建和删除对象 下面是我编写的一个示例,一个围绕TestFlightSDK的纯C包装器 请注意extern“C”块,它强制编译包含代码的文件,而不会损坏名称。一个c函数签名,然后在函数中调用ObjectiveC 因此,以EsitNote为例,connectToBeacon调用可以如下所示:extern "C" {
void ESTBeacom_Connect()
{
[ESTBeacon connectToBeacon];
}
}
class ESTBeacon {
[DllImport ("__Internal")]
private static extern void ESTBeacon_Connect();
public static void Connect() {
if( Application.platform == RuntimePlatform.IPhonePlayer )
ESTBeacon_Connect()
}
}
.cs函数将如下所示:
extern "C" {
void ESTBeacom_Connect()
{
[ESTBeacon connectToBeacon];
}
}
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中,您将一切正常
使用此参考了解如何传递各种数据类型 您正在使用的Estimote SDK具有ObjectiveC类。ObjectiveC中的函数不能通过统一插件(可以是C++ C++类)直接调用。原因是函数名不正确 Unity C#类和库之间的接口必须是纯C接口。这就是为什么在.a文件的旁边经常有.mm或.cpp文件。这些是在纯C包装中包装C++或ObjeVEC类。 您的工作会简单一些,因为大多数Estimote函数似乎都是类函数。因此,您不需要编写包装器函数来创建和删除对象 下面是我编写的一个示例,一个围绕TestFlightSDK的纯C包装器 请注意extern“C”块,它强制编译包含代码的文件,而不会损坏名称。一个c函数签名,然后在函数中调用ObjectiveC 因此,以EsitNote为例,connectToBeacon调用可以如下所示:
extern "C" {
void ESTBeacom_Connect()
{
[ESTBeacon connectToBeacon];
}
}
class ESTBeacon {
[DllImport ("__Internal")]
private static extern void ESTBeacon_Connect();
public static void Connect() {
if( Application.platform == RuntimePlatform.IPhonePlayer )
ESTBeacon_Connect()
}
}
.cs函数将如下所示:
extern "C" {
void ESTBeacom_Connect()
{
[ESTBeacon connectToBeacon];
}
}
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中,您将一切正常
使用此参考了解如何传递各种数据类型 2真的是一个要求吗?我想构建一个使用各种C++ 11特性的静态库,所以我一直使用LBC+ +(LVVM C++标准库,C++ 11支持)。但是,我无法链接最终的Unity XCode项目,如果#2为真,我也看不到解决方案。2真的是一个需求吗?我想构建一个使用各种C++ 11特性的静态库,所以我一直使用LBC+ +(LVVM C++标准库,C++ 11支持)。但是,我无法链接最终的Unity XCode项目,如果#2为真,我也看不到解决方案。