Java と Kotlin のプラグインコードから コードを呼び出す
Java と Kotlin のプラグインコードから Cスクリプトコードをコールます。
読み終わるまでの所要時間 9 分最終更新 2日前
Java と Kotlin のプラグインコードは、例えばAAndroidイイベントUnUnityド結果できます。結果コードこれを行うには、以下の 2 つの方法があります。
- でゲームオブジェクトにメッセージを送信します。
UnitySendMessage - AndroidJavaProxy のコールバックインターフェースから C# メソッドをコール
Java および Kotlin と同等の C# 実装については、C# スクリプトからの Java および Kotlin プラグインコードの呼び出し を参照してください。
ゲームオブジェクトへのメッセージの送信
UnitySendMessageプラグインは、ターゲットゲームオブジェクトの名前、コールするメソッドの名前、および文字列メッセージの 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# スクリプトで、 が呼び出すメソッドを追加します。スクリプトが、名前が最初の引数と一致するゲームオブジェクトにアタッチされていることを確認します。
UnitySendMessageusing 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); }}
以下の例は、
- ゲームオブジェクトの名前を、プラグインが送信するターゲット名と一致するように設定します。
- プラグインを呼び出します。プラグインは、を使用して、名前付きのゲームオブジェクトの
UnitySendMessageメソッドに文字列を返します。OnMessageReceived - プラグインが送信するメッセージを記録します。
UnitySendMessage- シグネチャを持つ C# メソッドのみコールできます。
void MethodName(string message) - コールは非同期で、遅延は 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# スクリプトで、 から派生したクラスを作成し、インターフェースを実装します。このクラスのインスタンスをプラグインに渡します。
AndroidJavaProxyusing 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()); }}
以下の例は、
- から派生した C#
AndroidJavaProxyクラスを作成し、基本コンストラクターにインターフェース名を渡します。GreetingCallbackはGreetingCallbackクラスにネストされているため、名前にはGreeter区切り文字$が使用されます。com.example.androidplugin.Greeter$GreetingCallback - インターフェースメソッドと一致するシグネチャを持つを実装します。Unity は、この C# 実装にインターフェースの呼び出しを自動的にルーティングします。
onGreeting - プラグインクラスの
Greeterを作成し、プロキシを渡してAndroidJavaObjectを呼び出します。その後、プラグインは C# 実装を実行するrequestGreetingを呼び出します。onGreeting
プラグインコードの記述の詳細については、Java および Kotlin ソースプラグイン を参照してください。