Objective-C
iOS
Unity

UnityプラグインでviewDidLoadやUIViewControllerにあたるものの話

意外と載ってなかったので、覚書。

はじめに

  • 本記事ではUnityプラグインによるアプリ起動時のトリガーとAppDelegate, UIViewControllerの取得方法を解説します。
  • アプリ側でUIViewController取得してUIImagePickerControllerなどを追加したいとかそういう時に使います。
  • Unity2017.2.0f3, XCode9を使用しています。

Unity側

  • サンプルなのでキューブが表示されるだけのプロジェクトを作ります。
  • 空のGameObjectを作りプロジェクトに追加します。
  • スクリプトを新規作成し、GameObjectに紐付けます。

スクリーンショット 2017-11-20 16.07.24.png
こんな感じ

スクリプトは以下のような感じで。殆ど生成時のままです。
initializeView()というところがプラグインの入口になります。

viewController.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Runtime.InteropServices;

public class ViewController : MonoBehaviour {

    [DllImport("__Internal")]
    private static extern void initializeView();

    // Use this for initialization
    void Start () {
        #if UNITY_IOS
        initializeView ();
        #endif
    }

    // Update is called once per frame
    void Update () {

    }
}

Unityプラグイン

  • UnityのプロジェクトディレクトリにてAssets/Plugins/iOSディレクトリ内にファイルを配置すればUnityプラグインとなります。
  • 無い場合は手動で作ればUnity側で勝手に読み込んで認識してくれます。
  • ここではunity_plugin_ios.mmというファイルで作成します。
unity_plugin_ios.mm
extern "C" {
void initializeView() {
}
}

iOS側

  • UnityのソースをビルドしXCodeプロジェクトにエクスポートした後の話です。
  • Libraries/Plugins/iOS内にunity_plugin_ios.mmがあるのでそれを触ります。
unity_plugin_ios.mm
#import <Foundation/Foundation.h>
#import "UnityAppController.h"

extern "C" {
void initializeView() {
    UnityAppController *unityAppController = (UnityAppController*)[UIApplication sharedApplication].delegate;
    UIViewController *unityRootVC = unityAppController.window.rootViewController;

}
}
  • initializeView()がviewDidLoadと同程度のタイミングでコールされます。
  • unityRootVCにUIViewControllerが取得されます。

どうでもいいですが、エクスポートしたプロジェクトにlibiconv2.dylibが付いてくるの、いい加減修正されませんかねえ・・・(ぼやき
以上です。