C# 用于Unity的iOS插件

C# 用于Unity的iOS插件,c#,ios,plugins,unity3d,C#,Ios,Plugins,Unity3d,我知道为Unity创建插件的基本前提是为您希望从Unity中调用的所有类创建包装器。然而,我发现的所有文档和示例都需要相应的.cpp(如果是c++)或.mm(如果是objective-c)文件 但是,我正在尝试为一些不包含任何源文件的本机iOS代码创建一个插件。我只能访问四个头文件和一个.a文件 现在,因为我没有任何.mm文件需要包装,我有点困惑,我如何才能将这些文件引入统一,以便从内部调用它们。以前有人这样做过吗 有人能告诉我一些文档,或者任何可以帮助我将4个头文件和.a文件作为插件引入Uni

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

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

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

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


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

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

如中所述:

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

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

如中所述:

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项目中
  • 在编辑器播放器中测试时提供回退解决方案
    • 这里是另一个指南:

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

      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为真,我也看不到解决方案。