Unity では C# から Java を呼び出すプラグインが含まれており
Unity から Android 固有の機能等の呼び出しを aar や java などを作成せずに利用することができる
単純な機能なら C# 側に処理を記述したほうが手軽なので便利です
※iOS の場合は C# から直接呼び出せないので .mm ファイルを作成してそれを呼び出す必要がある
そのために利用するのが下記クラスです
- AndroidJavaClass
- AndroidJavaObject
AndroidJavaClass はクラスとして、AndroidJavaObject はインスタンスとして扱います
上記リンクにも書かれていますが、キャッシュディレクトリを取得する際のコードは以下になります
Android の機能を呼び出すので、問題があったときのことを考え try catch で囲んでいます
using System; using UnityEngine; public class Java { public static string GetCacheDir() { var path = string.Empty; try { using (var player = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) using (var activity = player.GetStatic <AndroidJavaObject>("currentActivity")) using (var dir = activity.Call<AndroidJavaObject>("getCacheDir")) path = dir.Call<string>("getCanonicalPath"); } catch (Exception e) { Debug.LogError(e.Message); throw; } return path; } }
AndroidJavaClass は AndroidJavaObject を継承しているため、呼び出せるメソッドは同一です
public class AndroidJavaClass : AndroidJavaObject
よく利用するメソッド一覧
※ たまに戻り値があるのに記述を忘れてエラーが発生したりします
/// <summary> /// 戻り値の無い static メソッドを呼び出す /// </summary> public void CallStatic(string methodName, T[] args) /// <summary> /// static メソッドを呼び出す /// </summary> public void CallStatic<T>(string methodName, T[] args) /// <summary> /// 戻り値の無い メソッドを呼び出す /// </summary> public void Call(string methodName, params object[] args) /// <summary> /// メソッドを呼び出す /// </summary> public void Call<T>(string methodName, T[] args) /// <summary> /// フィールドから値を取得する /// </summary> public FieldType Get<FieldType>(string fieldName) /// <summary> /// フィールドに値を設定する /// </summary> public void Set<FieldType>(string fieldName, FieldType val) /// <summary> /// static なフィールドから値を取得する /// </summary> public FieldType GetStatic<FieldType>(string fieldName) /// <summary> /// static なフィールドに値を設定する /// </summary> public void SetStatic<FieldType>(string fieldName, FieldType val)