Version: Unity 6.0 (6000.0)
言語 : 日本語
静的ライブラリを Unity プラグインとしてコンパイルする
Unity Web ビルドの JavaScript インターフェース

Unity C#、JavaScript、C/C++/C# コード間のコールバックの作成

コールバックはウェブ開発の重要な部分です。コールバックを使用することで、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}\"");
    }
}

追加リソース

静的ライブラリを Unity プラグインとしてコンパイルする
Unity Web ビルドの JavaScript インターフェース