意外と載ってなかったので、覚書。
はじめに
- 本記事ではUnityプラグインによるアプリ起動時のトリガーとAppDelegate, UIViewControllerの取得方法を解説します。
- アプリ側でUIViewController取得してUIImagePickerControllerなどを追加したいとかそういう時に使います。
- Unity2017.2.0f3, XCode9を使用しています。
Unity側
- サンプルなのでキューブが表示されるだけのプロジェクトを作ります。
- 空のGameObjectを作りプロジェクトに追加します。
- スクリプトを新規作成し、GameObjectに紐付けます。
スクリプトは以下のような感じで。殆ど生成時のままです。
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が付いてくるの、いい加減修正されませんかねえ・・・(ぼやき
以上です。