AndroidNativePluginの作り方
ググると、いろんな記事がありそれぞれやり方が違ったので、なるべく新しい記事や動画を見て作ってみました。
以下の動画がシンプルで一番参考になったので、こちらとおり作ってみます。
eclipseでAndroid Application Projectを作成。
package名はあとあとUnityから呼び出すときに重要なので、それっぽく入力しておく。
targetなどのバージョンはこちらを読むと理解できる。
[Android] Androidアプリ開発における Target SDK, Minimum Required SDK, Compiler SDK の違い
Finishでプロジェクト作成。
メニューのデバッグボタンをクリックし、Android Applicationを選択、繋がっているAndroidデバイスを選んでOK。
Package Explorerからプロジェクトを右クリックし、Propertiesを選択。
PropertiesウィンドウでAndroidを選択、右のペインでIs Libraryにチェックを入れる。
すると上の画像のようにjarファイルが出来上がってる。
では、実際にJavaクラスを作成していく。
該当のパッケージに、Classを追加する。
ここでは、Hogeクラスを作成。
package com.test.androidnativeplugin; import android.util.Log; import com.unity3d.player.UnityPlayer; public class Hoge { // 引数あり public void FuncA(final String msg) { Log.d("Android", "call FuncA"); Log.d("Android", msg); } // 戻り値あり public String FuncB(final String msg) { Log.d("Android", "call FuncB"); return "Back" + msg; } // callbackあり public void FuncC(final String gameObjName, final String msg) { Log.d("Android", "call FuncC"); Log.d("Android", gameObjName); // 第一引数:GameObject名、第二引数:メソッド名 UnityPlayer.UnitySendMessage(gameObjName, "onCallBack", msg); } }
使いそうな3パターンを作ってみた。
ここからは、Unity上での作業。
以下のようにディレクトリを作成する。
Assets/Plugins/Android
ここにbinディレクトリにあるjarファイルを置く。
次は、
Assets/Plugins
に、Androidのメソッドを呼び出すクラスを作成する。
using UnityEngine; using System.Collections; public class HogeAndroidPlugin : MonoBehaviour { public static void CallFuncA (string msg) { #if UNITY_ANDROID AndroidJavaObject obj = new AndroidJavaObject("com.teamlab.androidnativeplugin.Hoge"); obj.Call("FuncA", msg); #endif } public static string CallFuncB (string msg) { string returnVal = null; #if UNITY_ANDROID AndroidJavaObject obj = new AndroidJavaObject("com.teamlab.androidnativeplugin.Hoge"); returnVal = obj.Call<string>("FuncB", msg); #endif return returnVal; } public static void CallFuncC (string msg) { #if UNITY_ANDROID AndroidJavaObject obj = new AndroidJavaObject("com.teamlab.androidnativeplugin.Hoge"); obj.Call ("FuncC", "Main", msg); #endif } }
それぞれのメソッドの中には、Android上での実行かどうかのプリプロセッサを書いている。
iOS側のプラグインを書く場合にも、同様にifで実行環境ごとに分けるのがいいだろう。
ここまででプラグインの準備は完了だ。
あとは、これを呼び出す処理をテスト的に書いてみよう。
EmptyなGameObjectを作成し、MainというC#クラスをアタッチする。
using UnityEngine; using System.Collections; public class Main : MonoBehaviour { void OnGUI () { if (GUI.Button (new Rect (0, 0, 100, 100), "Push Me")) { // FuncA HogeAndroidPlugin.CallFuncA (" call CallFuncA "); // FuncB string returnVal = HogeAndroidPlugin.CallFuncB (" call CallFuncB "); Debug.Log ("Unity: " + returnVal); // FuncC HogeAndroidPlugin.CallFuncC (" call CallFuncC "); } } public void onCallBack (string msg) { Debug.Log ("Call From Native. (" + msg + ")"); } }
特にFuncCは使うシチュエーションがありそうだが、使いすぎると保守がしにくくなりそうだ。
UnityからAndroidに処理がわたり、Androidで処理が終わったタイミングでUnityのコードをCallbackする。(でも便利!)
ここまでで、Androidでjarを作成し、AndroidのNativePluginをUnityから呼び出すコードが書けたわけだ。
あとはBuild & Runを実行するのみ!
ビルドが完了すると実機でUnityで作ったアプリが起動しているはず。
ひとつ問題なのが、デバッグがし難いという点。
eclipseでLogCatビューを表示しておいて、Unityというtagの部分を発見するとちゃんとログがでている。
04-16 16:33:21.374: D/Android(11900): call FuncA
04-16 16:33:21.374: D/Android(11900): call CallFuncA
04-16 16:33:21.384: D/Android(11900): call FuncB
04-16 16:33:21.384: I/Unity(11900): Unity: Back call CallFuncB
04-16 16:33:21.384: I/Unity(11900):
04-16 16:33:21.384: I/Unity(11900): (Filename: ./artifacts/AndroidManagedGenerated/UnityEngineDebug.cpp Line: 53)
04-16 16:33:21.384: D/Android(11900): call FuncC
04-16 16:33:21.384: D/Android(11900): Main
04-16 16:33:21.394: I/Unity(11900): Call From Native. ( call CallFuncC )
04-16 16:33:21.394: I/Unity(11900):
04-16 16:33:21.394: I/Unity(11900): (Filename: ./artifacts/AndroidManagedGenerated/UnityEngineDebug.cpp Line: 53)
参考リンク
Unity3D – Androidネイティブ開発のすすめ – Qiita
オライリージャパン
売り上げランキング: 43,217