打包mac和ios用的Unity plugins

原生插件打包

Posted by Lgn on January 2, 2018

总结插件开发方式,提高底层原生调用的能力

Building a Plugin for Mac OS X

[DllImport ("PluginName")]
private static extern float FooPluginFunction ();

实验过了,可用例子里的cpp 也可以跟ios的一样,用一样的objc代码,只是上面的名字一定要用导出的bundle文件名

新建bundle项目

[XCode] --> [File] --> [NewProject
[macOS] --> [Framework & Library] --> [Bundle]

Building Plugins for iOS

[DllImport ("__Internal")]
private static extern float FooPluginFunction();

要实现重写Unity的启动程序,需在末尾加上:

//自动修改启动程序
IMPL_APP_CONTROLLER_SUBCLASS(MainDelegate)

原理在底部说明

##两种原生实现方式: 一、直接在Plugin/iOS目录下编写.m/.h文件,暴露接口直接调用

二、把独立实现的c/cpp/objc单独打包成静态库.a文件

打包流程: iOS开发手把手教你如何打包静态库.a文件

  • 1.建库 img

  • 2.设置release img

  • 3.选择真机进行运行,在运行后我们找到生成的.a文件右键选择show in finder就可以了 img

  • mac sample
  • ios sample


UnityAppController.h 里面有这样一个宏:

#define IMPL_APP_CONTROLLER_SUBCLASS(ClassName) \
@interface ClassName(OverrideAppDelegate)       \
{                                               \
}                                               \
+(void)load;                                    \
@end                                            \
@implementation ClassName(OverrideAppDelegate)  \
+(void)load                                     \
{                                               \
    extern const char* AppControllerClassName;  \
    AppControllerClassName = #ClassName;        \
}                                               \
@end                                            \

将这个宏加到 CustomAppController.mm 中,即可实现自动设置 AppControllerClassName : IMPL_APP_CONTROLLER_SUBCLASS (CustomAppController)

是不是很神奇呢! IMPL_APP_CONTROLLER_SUBCLASS 使用了两个 Objective-C 的特性,

  • 一是 category ,用来给已有的类扩展新的方法;
  • 二是 +(void)load 静态方法,它会在运行时 CustomAppController 类被加载到内存中时触发, 这个时间点比 int main() 函数还要早,所以能够提前“篡改” AppControllerClassName,达到我们的目的。