Unity C#、JavaScript、C/C++/C# コード間のコールバックの作成
Learn how to use callbacks to communicate between your plug-in, browser, and Unity project.
読み終わるまでの所要時間 4 分最終更新 1ヶ月前
コールバックはウェブ開発の重要な部分です。コールバックを使用することで、Unity プロジェクトと JavaScript ブラウザー、JavaScript プラグイン、および C/C++/C# プラグインとの通信が向上するためです。Unity C# コード内で C/C++/C# コードまたは JavaScript コードから関数を呼び出したい場合があります。コールバックは、これを行うための効果的な方法です。
makeDynCall 関数を使用してコールバックを作成する
makeDynCall{{{ makeDynCall('vii', 'callback') }}}(1, 2)
- は、パラメーターのシグネチャです。例えば、コールバック関数は
'vii'型 (v) で、voidは両方とも整数 (ii) です。(1,2) - はコールバック関数の名前です。
'callback' - は、関数に渡す引数です。
(1, 2)
以下のコードは、関数 "onresponse" でコールバックを行い、Float (f) 型と複数の整数型の値を渡すコードの別の例です。
{{{ makeDynCall('vfii', 'onresponse') }}}(2.8, arg, 0);
スクリプトでのコールバックの使用
以下のスクリプトは、コールバック関数を使用して JavaScript、C++、C# コード間で通信する方法の例を示しています。
JavaScript プラグインコード
以下のコードは、タイムアウトをスケジュールし、コールバックを実行する ファイルの例です。
.jslibmergeInto(LibraryManager.library, { JsSetTimeout: function (message, timeout, callback) { // Create copy of message because it might be deleted before callback is run var stringMessage = UTF8ToString(message); var buffer = stringToNewUTF8(stringMessage); setTimeout(function () { {{{ makeDynCall('vi', 'callback') }}} (buffer); _free(buffer); }, timeout); }});
C++ プラグインコード
以下のコードは、以下の特徴を持つ C++ ファイルの例です。
- 外部 JavaScript 関数 () を呼び出します。
JsSetTimeout - タイムアウトが発生したときに JavaScript が呼び出すコールバック関数が含まれています。
// CallbackExample.cpp#include <stdio.h>typedef void (*OnTimeOutCallback)(char* message);extern "C"{ void JsSetTimeout(char* message, int timeout, OnTimeOutCallback callback);}void CCallback(char* message){ printf("C callback received \"%s\"\n", message);}extern "C" void SetCTimeout(){ JsSetTimeout("Hello World", 1000, CCallback);}
Unity C# コード
以下のコードは、C++ および JavaScript コールバックからメッセージを受信する C# Unity コードの例です。
using AOT;using System;using System.Text;using System.Runtime.InteropServices;using UnityEngine;public class CallbackExample : MonoBehaviour{ void Awake() { SetCSharpTimeout(); SetCTimeout(); } void SetCSharpTimeout() { JsSetTimeout("Hello World", 500, CSSharpCallback); } [DllImport("__Internal")] public static extern void SetCTimeout(); [DllImport("__Internal")] public static extern void JsSetTimeout(string message, int timeout, Action<string> action); [MonoPInvokeCallback(typeof(Action<string>))] public static void CSSharpCallback(string message) { Debug.Log($"C# callback received \"{message}\""); }}