2012年5月11日金曜日

Unity Android Java Pluginの作り方についての要点だけ

UnityでJavaを使ったAndroidプラグインの作り方について、いまいちまとまった情報がないので、要点のみまとめ。あとで追記とかはするかもしれない。 とりあえず2つのケースを想定すれば良いと思う。
  1. Androidとは関係なく単純にJavaクラスをUnityスクリプトから利用したい場合
    例えば何かのパーサだったりとか、手持ちの便利ライブラリがJavaであるとか。これはAssets/Plugins/Androidに該当の.jarファイルを置けばOK(.dexでなく.classで良い)。その上で、Assets/Pluginsとかに置いたスクリプトから、new AndroidJavaClass("Javaクラス名")とかnew AndroidJavaObject("Javaクラス名")とかすればOK。それぞれJavaのクラス型およびインスタンス型に対応し、そこからメソッドを呼ぶ事ができる。(詳細はUnityのリファレンスを見ると良い。インスタンス変数、メンバ変数の取得、クラスメソッド、インスタンスメソッドなど行うことができる)

  1. Pluginを通じてAndroid OSの機能を利用する場合
    Android OSの色んな機能を使うときにはContextオブジェクトを使う訳だけど、これはUnityアプリの場合、ランタイムであるUnityPlayerActivityが持っていることになるので、まずはプラグインのJavaクラスをUnityPlayerActivityを継承したActivityにする必要がある。class MyUnityPlayerActivity extends UnityPlayerAcitvityこんな感じ。
    この中のメソッドは普通のAndroidJavaクラスとして作れば良い。

    その上で、Unityアプリの起動クラスをこのUnityPlayerActivityを継承したMyUnityPlayerActivityにする必要がある。これはAndroidManifest.xmlファイルのカスタマイズのやり方を使う。つまり.jarファイルと同様に、Assets/Plugins/Androidのフォルダに、MyUnityPlayerActivityクラスを起動Activityに設定したAndroidManifest.xmlファイルを置く。そうするとAndroidバイナリのビルド時にこちらを使うようになってくれる。ちなみにUnityのPlayer Settingsで設定したアプリアイコンを使うには、android:iconを@drawable/app_iconに変更する必要があることに注意。

    尚、このAndroidManifest.xmlを置き換えるやり方は独自のpermissionやActivityを追加したりするときにも使う。

    あとは1と同様にAndroidJavaClassおよびAndroidObjectを利用してプラグインを利用するスクリプトを書けば良い。独自の注意として、Activityは直接newできないのでMyUnityPlayerActivityにpublic static な MyUnityPlayerActivityを変数として持っておいて(onCreate時にMyUnityPlayerActivity.instance = thisとかやる)、そのうえでUnityスクリプト側からaAndroidJavaClass.GetStatic<AndroidJavaObject>("instance")みたいにすればActivityインスタンスを直接取ることができる。
尚、Unity 3.5を前提に書いています。もし間違い等あれば指摘してください。