ドキュメント

Unity Engine

Unity Engine

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
を使用して、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# コード間で通信する方法の例を示しています。

JavaScript プラグインコード

以下のコードは、タイムアウトをスケジュールし、コールバックを実行する
.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++ プラグインコード

以下のコードは、以下の特徴を持つ 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}\""); }}

追加リソース