UnityでAndroidNativePluginを作るときのお作法

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

実践 Android Developer Tools
実践 Android Developer Tools
posted with amazlet at 14.04.16
Mike Wolfson
オライリージャパン
売り上げランキング: 43,217