版本:Unity 6 (6000.0)
语言:英语
将静态库编译为 Unity 插件
Unity Web 构建中的 JavaScript 接口

在 Unity C#、JavaScript 和 C/C++/C# 代码之间创建回调

回调是 Web 开发的一个重要组成部分,因为它们可以让 Unity 项目更好地与 JavaScript 浏览器、JavaScript 插件Unity 外部创建的,可以创建 Unity 功能的代码集。可用于 Unity 的插件有两种:托管插件(使用 Visual Studio 等工具创建的托管 .NET 程序集)和本机插件(特定于平台的本机代码库)。 更多信息
请参阅 词汇表
以及 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”执行回调,并传入一个浮点数 (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 接口