Unity iOS定制 UnityAppController

Unity iOS定制 UnityAppController,第1张

概述开发 Unity3d 手机游戏的时候,不免要和第三方 SDK 打交道。于是总是需要实现自己的 AppController 来维护 SDK 的生命周期。Unity3d 提供了一套插件机制,可以很方便地在项目中使用自己的 CustomAppController继承并重写默认的 UnityAppController的方法。0x00 CustomAppController在 Unity 插件目录下创...

开发 Unity3d 手机游戏的时候,不免要和第三方 SDK 打交道。于是总是需要实现自己的 AppController 来维护 SDK 的生命周期。

Unity3d 提供了一套插件机制,可以很方便地在项目中使用自己的 CustomAppController继承并重写默认的 UnityAppController的方法。

0x00 CustomAppController

在 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所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/998857.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存