开发 Unity3d 手机游戏的时候,不免要和第三方 SDK 打交道。于是总是需要实现自己的 AppController 来维护 SDK 的生命周期。
Unity3d 提供了一套插件机制,可以很方便地在项目中使用自己的 CustomAppController
继承并重写默认的 UnityAppController
的方法。
在 Unity 插件目录下创建以下文件:Assets/Plugins/iOS/CustomAppController.mm
注意: 文件名必须是 ___AppController,前缀可自选,但不能省略;否则在 Build 项目的时候,会被移动到错误的目录中去CustomAppController.h
头文件是可选的,不过通常直接把 @interface 直接放在 .mm 文件里就好。下面以微信 SDK 为例:
#import "UnityAppController.h"#import "WXAPI.h" @interface CustomAppController : UnityAppController < WXAPIDelegate >@end IMPL_APP_CONTRolLER_SUBCLASS (CustomAppController) @implementation CustomAppController - (BOol)application:(UIApplication*)application dIDFinishLaunchingWithOptions:(NSDictionary*)launchOptions{ [super application:application dIDFinishLaunchingWithOptions:launchOptions]; [WXAPI registerapp: @"_________"]; return YES;} - (BOol)application:(UIApplication*)application openURL:(NSURL*)url sourceApplication:(Nsstring*)sourceApplication annotation:(ID)annotation{ return [WXAPI handleOpenURL:url delegate:self];} - (BOol)application:(UIApplication *)application handleOpenURL:(NSURL *)url{ return [WXAPI handleOpenURL:url delegate:self];} - (voID)onResp:(BaseResp *)resp{ // do something} - (voID)onReq:(BaseReq *)req{ // do something} @end
在 Build iOS Project 的时候,Unity 会自动把 CustomAppController.mm
复制到 project/librarIEs/CustomAppController.mm
而原来的 UnityAppController.mm
则在 project/Classes/UnityAppController.mm
那么 Unity 是如何知道要使用我们定制的 CustomAppController 而不是使用默认的 UnityAppController 呢?
0x01 IMPL_APP_CONTRolLER_SUBCLASS很多文章在提到继承 UnityAppController 后,需要找到 project/Classes/main.mm
里面的:
const char* AppControllerClassname = "UnityAppController";
将其修改为:
const char* AppControllerClassname = "CustomAppController";
从而使 Unity 在启动的时候使用我们制定的 CustomAppController 类。
这样一来,每次 Build 项目都需要手动去修改这个常量,岂不是自找麻烦。其实完全可以利用 Objective-c 的特性来自动完成这个 *** 作。
注意到 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,达到我们的目的。
总结以上是内存溢出为你收集整理的Unity iOS定制 UnityAppController全部内容,希望文章能够帮你解决Unity iOS定制 UnityAppController所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)