うにてぃブログ

UnityやUnreal Engineの記事を書いていきます

【Unity】C# から Android の機能を呼び出す

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)