ドキュメント

Unity Engine

Unity Engine

Java と Kotlin のプラグインコードから コードを呼び出す

Java と Kotlin のプラグインコードから Cスクリプトコードをコールます。
読み終わるまでの所要時間 9 分最終更新 2日前

Java と Kotlin のプラグインコードは、例えばAAndroidイイベントUnUnityド結果できます。結果コードこれを行うには、以下の 2 つの方法があります。
  • UnitySendMessage
    でゲームオブジェクトにメッセージを送信します。
  • AndroidJavaProxy のコールバックインターフェースから C# メソッドをコール
Java および Kotlin と同等の C# 実装については、C# スクリプトからの Java および Kotlin プラグインコードの呼び出し を参照してください。
注
いずれかの方法をデバッグするには、AndroidJNIHelper.デバッグ を
true
に設定して、Unity が各コールに対して実行する JNI アクティビティを記録します。

ゲームオブジェクトへのメッセージの送信

UnitySendMessage
を使用して、Java または Kotlin プラグインコードから名前付きゲームオブジェクトのメソッドに文字列を送信します。これは、C# メソッドが文字列を受け取りますが、プラグインに値を返さない単方向のコールです。簡単な通知に使用します。
プラグインは、ターゲットゲームオブジェクトの名前、コールするメソッドの名前、および文字列メッセージの 3 つの引数で
UnitySendMessage
を呼び出します。
以下の Java 例では、
UnitySendMessage
を実装しています。
パッケージ com.example.androidplugin;import com.unity3d.player.UnityPlayer;public class MessageSender { public static void sendToUnity(String gameObjectName) { UnityPlayer.UnitySendMessage(gameObjectName, "OnMessageReceived", "Hello from Java"); }}
以下の Kotlin 例では、
UnitySendMessage
を実装しています。
パッケージ com.example.androidpluginimport com.unity3d.player.UnityPlayerobject MessageSender { @JvmStatic fun sendToUnity(gameObjectName:string UnityPlayer.UnitySendMessage(gameObjectName, "OnMessageReceived", "Hello from Kotlin") }}
C# スクリプトで、
UnitySendMessage
が呼び出すメソッドを追加します。スクリプトが、名前が最初の引数と一致するゲームオブジェクトにアタッチされていることを確認します。
using UnityEngine;public class MessageReceiver :MonoBehaviour{ void Start() { gameObject.name = "MessageReceiver"; using var sender = new AndroidJavaClass("com.example.androidplugin.MessageSender"); sender.CallStatic("sendToUnity", gameObject.name); } void OnMessageReceived(string message) { Debug.Log("Message from plug-in: " + message); }}
以下の例は、
  1. ゲームオブジェクトの名前を、プラグインが送信するターゲット名と一致するように設定します。
  2. プラグインを呼び出します。プラグインは、
    UnitySendMessage
    を使用して、名前付きのゲームオブジェクトの
    OnMessageReceived
    メソッドに文字列を返します。
  3. プラグインが送信するメッセージを記録します。
注
この例では、C# がプラグインを直接呼び出してメッセージをトリガーするため、Android イベントなしでサンプルを実行できます。実際のプロジェクトでは、プラグインはボタンのタップやライフサイクルのコールバックなどの Android イベントに反応して
UnitySendMessage
を呼び出します。
UnitySendMessage
には以下の制限事項があります。
  • シグネチャ
    void MethodName(string message)
    を持つ C# メソッドのみコールできます。
  • コールは非同期で、遅延は 1 フレームです。
  • 同じ名前の複数の GameObjects は競合の原因になります。
文字列以外のデータを送信するには、JSON 文字列にシリアライズします。詳細は、Java/Kotlin および C# コードでサポートされるデータ型 を参照してください。

コールバックインターフェースフェースを通して Cメソッドをコール

AndroidJavaProxy を使用して、C# で Java または Kotlin インターフェースを実装します。プラグインがインターフェースでメソッドを呼び出すと、Unity は C# 実装を実行します。このアプローチは、型付きコールバック、または構造化データまたは戻り値を渡す場合に使用します。
プラグインのインターフェースとそれを呼び出すクラスを定義します。以下のプラグインコードは、C# にメッセージを返すためにインターフェースメソッドを呼び出します。

Java プラグインコード

パッケージ com.example.androidplugin;public class Greeter { public interface GreetingCallback { void onGreeting(String message); } public void requestGreeting(GreetingCallback callback) { callback.onGreeting("Hello from Java"); }}
### Kotlin plug-in code
パッケージ com.example.androidpluginクラス Greeter { インターフェース GreetingCallback { fun onGreeting(message:string } fun requestGreeting(callback:GreetingCallback) { callback.onGreeting("Hello from Kotlin") }}
C# スクリプトで、
AndroidJavaProxy
から派生したクラスを作成し、インターフェースを実装します。このクラスのインスタンスをプラグインに渡します。
using UnityEngine;public class GreetingExample :MonoBehaviour{ クラス GreetingCallback :AndroidJavaProxy { public GreetingCallback() : base("com.example.androidplugin.Greeter$GreetingCallback") { } void onGreeting(string message) { Debug.Log("Greeting from plug-in: " + message); } } void Start() { using var greeter = new AndroidJavaObject("com.example.androidplugin.Greeter"); greeter.Call("requestGreeting", new GreetingCallback()); }}
以下の例は、
  1. AndroidJavaProxy
    から派生した C#
    GreetingCallback
    クラスを作成し、基本コンストラクターにインターフェース名を渡します。
    GreetingCallback
    は
    Greeter
    クラスにネストされているため、名前には
    $
    区切り文字
    com.example.androidplugin.Greeter$GreetingCallback
    が使用されます。
  2. インターフェースメソッドと一致するシグネチャを持つ
    onGreeting
    を実装します。Unity は、この C# 実装にインターフェースの呼び出しを自動的にルーティングします。
  3. Greeter
    プラグインクラスの
    AndroidJavaObject
    を作成し、プロキシを渡して
    requestGreeting
    を呼び出します。その後、プラグインは C# 実装を実行する
    onGreeting
    を呼び出します。
注
この例では、プラグインは Unity のメインスレッドでインターフェースメソッドを呼び出します。プラグインが背景スレッドからメソッドを呼び出す場合、C# の実装も背景スレッドで実行されます。この場合、AndroidApplication.InvokeOnUnityMainThread を使用して、メインスレッドで Unity API 呼び出しを実行します。
プラグインコードの記述の詳細については、Java および Kotlin ソースプラグイン を参照してください。

追加リソース