読者です 読者をやめる 読者になる 読者になる

ほげほげ(仮)

仮死状態

UnityのiOSでAppDelegateに処理を追加する

Xcode Unity

最近、UnityからiOSビルドについてばっかりやってます。Unity自体は分かりません。

UnityからiOSビルドした時にAppDelegateに処理を追加する方法です。

UnityAppController

UnityからiOSビルドした時にUnityAppController.hUnityAppController.mmが生成されますが、こいつがAppDelegateと同様の処理をやっています。

iOSビルドした後にこのファイルを編集しても良いのですが、ビルドするたびに編集するのはアホくさいのでそれを何とかします。

main.mm

main.mmというファイルも生成されてますが、こいつがエントリポイントになってます。

このファイルの中に

const char* AppControllerClassName = "UnityAppController";

という箇所があり、そこでAppDelegateに相当するクラスを指定しています。

さらに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                                           \

これらを使ってAppDelegateに処理を追加していきます。

UnityAppControllerをオーバーライド

UnityAppControllerをオーバーライドして新しいクラスを作成します。下の例ではMyAppController.mmとして作成します。

#import "UnityAppController.h"

@interface MyAppController : UnityAppController
@end

@implementation MyAppController
- (void)preStartUnity
{
    // なんか処理
}

- (void)applicationWillEnterForeground:(UIApplication *)application
{
    [super applicationWillEnterForeground:application];
    // なんか処理
}
@end

IMPL_APP_CONTROLLER_SUBCLASS(MyAppController)

クラス定義のあとにIMPL_APP_CONTROLLER_SUBCLASSマクロで起動されるクラスを書き換えています。(すいません、この辺なぜこうなるのかはイマイチ分かってません。)

この場合、preStartUnityapplicationWillEnterForegroundのメソッドをオーバーライドしています。

preStartUnityUnityAppControllerの中を見てもらえれば分かると思うのですが、UnityAppController.mmでは何もしていなくてdidFinishLaunchingWithOptionsで呼び出されているだけです。

通常のiOSアプリと同様にdidFinishLaunchingWithOptionsで処理したい内容を書くような感じです。

applicationWillEnterForegroundのようなiOSではよく使うメソッドにも処理を追加できます。

Unityプラグイン追加

先ほど作ったファイルをUnityのほうのAssets/Plugins/iOSへ追加します。

これでビルドのたびにUnityAppControllerを編集するようなことはせずに処理を追加することができます。

まとめ

ネイティブ連携はすごく面倒くさい。