・・・と思ったら詳しい説明がすでにあった(笑)
詳細を確認したい方は以下参考。
Androidネイティブ開発のすすめ
Unity公式:Android 用のプラグインをビルド
ここでは情報整理がてら簡単にまとめ。
// Android
public class AndroidPlugin extends UnityPlayerActivity {
public static final String TAG = AndroidPlugin.class.getSimpleName();
public void log(String mes) {
Log.d(TAG, mes);
}
}
----------------------------
// Unity
public static class AppUtil
{
public static void Log()
{
#if UNITY_ANDROID
using (AndroidJavaClass c = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
using (AndroidJavaObject o = c.GetStatic<AndroidJavaObject>("currentActivity"))
{
o.Call("log", "お前は、無力だ。");
}
#endif
}
}
// Android
package com.tempura;
public class AndroidPlugin {
public static final String TAG = AndroidPlugin.class.getSimpleName();
public void log(String mes) {
Log.d(TAG, mes);
}
}
----------------------------
// Unity
public static class AppUtil
{
public static void Log()
{
#if UNITY_ANDROID
using (AndroidJavaObject o = new AndroidJavaObject("com.tempura.AndroidPlugin"))
{
o.Call("log", "お前は、無力だ。");
}
#endif
}
}
// Unity
public static class AppUtil
{
public static readonly string Tag = typeof(AppUtil).Name;
public static void Log()
{
using (AndroidJavaClass c = new AndroidJavaClass("android.util.Log"))
{
c.CallStatic("d", Tag, "お前は、無力だ。");
}
}
}
方法1は UnityPlayerActivity を継承したクラスを作成して呼ぶ方法。
メリットとしては、方法2と違いクラス名を汎用的に記述出来るので、プログラムの変更に強い。また、UnityPlayerActivity を継承してるクラス=ネイティブプラグイン の図式が成り立つので、パッと見分かりやすい。
デメリットとしては、UnityPlayerActivity を継承してるので他のクラスを継承できない。
方法2は普通にJavaで定義したクラスを呼ぶ方法。
メリットとしては、UnityPlayerActivity を継承しないので、他のクラスを継承可能。あと単純に UnityPlayerActivity を継承してないので利用が手軽。
デメリットとしてはUnity側で使用する際にパッケージ名の指定が必要になるので、プログラムの変更に弱い。
方法3はUnityから直接Javaコードを呼ぶ方法。
メリットとしては、Javaのコードを書く必要がない(全てC#で完結!)。
デメリットとしては可読性が悪くなる。そもそもJavaのコードをC#で無理やり記述してるからね。。
自分が開発する時は、そのプロジェクト内で使用する個人のネイティブプラグインは方法1を使用して、ライブラリ群を作成する際は方法2を使用している。方法3は基本的に使用しない。理由としては、UnityPlayerActivity は1プロジェクトに1つしか継承出来ない代わりに、目印としては分かりやすく(主に他の人が見た時に)、そもそも個人のネイティブプラグインの量は多くないから1クラスにまとめるため。逆にライブラリ群を作成する際は、がっつりネイティブプラグインを作るし、UnityPlayerActivity はメインプロジェクトの方で使用する可能性があるので。方法3は可読性が悪くなっちゃうので、基本、方法1で処理してる。