コールバックはウェブ開発の重要な部分です。コールバックを使用することで、Unity プロジェクトと JavaScript ブラウザー、JavaScript プラグイン、および C/C++/C# プラグインとの通信が向上するためです。Unity C# コード内で C/C++/C# コードまたは JavaScript コードから関数を呼び出したい場合があります。コールバックは、これを行うための効果的な方法です。
makeDynCall を使用して、JavaScript コードから C、C++、または C# コールバックを呼び出します。例えば、以下の JavaScript コードは関数 “callback” を呼び出します。
{{{ makeDynCall('vii', 'callback') }}}(1, 2)
'vii' は、パラメーターのシグネチャです。例えば、コールバック関数は void 型 (v) で、(1,2) は両方とも整数 (ii) です。'callback' はコールバック関数の名前です。(1, 2) は、関数に渡す引数です。以下のコードは、関数 “onresponse” でコールバックを行い、Float (f) 型と複数の整数型の値を渡すコードの別の例です。
{{{ makeDynCall('vfii', 'onresponse') }}}(2.8, arg, 0);
以下のスクリプトは、コールバック関数を使用して JavaScript、C++、C# コード間で通信する方法の例を示しています。
以下のコードは、タイムアウトをスケジュールし、コールバックを実行する .jslib ファイルの例です。
mergeInto(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++ ファイルの例です。
* 外部 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);
}
以下のコードは、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}\"");
}
}