版本:Unity 6 (6000.0)
语言:英语
设置 JavaScript 插件
从 JavaScript 调用 Unity C# 脚本函数

从 Unity C# 脚本调用 JavaScript 函数

你可以在 Unity C# 代码中使用 JavaScript 插件在 Unity 之外创建的代码集,用于在 Unity 中创建功能。在 Unity 中,你可以使用两种插件:托管插件(使用 Visual Studio 等工具创建的托管 .NET 程序集)和本机插件(特定于平台的本机代码库)。 更多信息
请参阅 词汇表
中的函数。由于可能需要与网页或 Web API 上的其他元素通信,因此在 Unity 中使用 JavaScript 代码可能很有用。

若要了解文件类型和如何设置 JavaScript 插件以便与 Unity 脚本允许你创建自己的组件、触发游戏事件、按时间顺序修改组件属性,并以任何你喜欢的方式响应用户输入的代码片段。 更多信息
请参阅 词汇表
交互,请参阅 设置 JavaScript 插件。若要了解如何与 C/C++/C# 插件交互,请参阅 从 Unity C# 脚本调用 C/C++/C# 函数

主题 描述
从 JavaScript 传递不同变量到 Unity 关于如何在 Unity 和 JavaScript 之间传递不同变量的提示。
在其自身范围内执行编译代码 关于如何改善 Unity 和 JavaScript 之间代码可见性的提示。
调用 JavaScript 函数的 Unity C# 示例代码 此示例代码演示了如何在 Unity 中调用 JavaScript 函数。
将 Unity 插件用作参考 显示了随 Unity 附带的插件列表,你可以将它们用作参考。

从 JavaScript 传递不同变量到 Unity

要将 JavaScript 与 Unity 集成,你需要在两者之间建立有效的通信。请遵循以下有关如何从 JavaScript 向 Unity 传递各种类型的数据的提示。

数字类型

你可以将简单的数字类型传递到 JavaScript 的函数参数中,而无需对其进行转换。

比如,JavaScript 中的此函数:js AddNumbers: function (x, y) { return x + y; },

接受来自 C# 的整数,而无需转换。

int result = AddNumbers(5, 7);

你可以在 Emscripten 堆中以指针的形式传递其他数据类型。Emscripten 堆仅仅是 JavaScript 内存中一个大数组。

字符串

若要将字符串转换为 JavaScript 字符串,请使用 UTF8ToString 辅助函数。

var stringMessage = UTF8ToString("Hello World");

若要返回字符串值,请调用 _malloc 以分配一些内存,并调用 stringToUTF8 辅助函数以将 JavaScript 字符串写入到内存中。如果字符串是返回值,那么 IL2CPP一种 Unity 开发的脚本后端,在为某些平台构建项目时,你可以使用它作为 Mono 的替代品。 更多信息
参见 词汇表
运行库会自动释放内存。

 var returnStr = "Hello World";
    var bufferSize = lengthBytesUTF8(returnStr) + 1;
    var buffer = _malloc(bufferSize);
    stringToUTF8(returnStr, buffer, bufferSize);

数组

对于原始类型数组,Emscripten 为其堆提供了不同的 ArrayBufferViews,用于不同大小的整数、无符号整数或内存的浮点表示:HEAP8HEAPU8HEAP16HEAPU16HEAP32HEAPU32HEAPF32HEAPF64

以下函数循环遍访 HEAPF32 数组并输出每个索引处的值。

PrintFloatArray: function (array, size) {
    for(var i = 0; i < size; i++)
    console.log(HEAPF32[(array >> 2) + i]);
  },

纹理

若要在中访问纹理 WebGL在 Web 浏览器中绘制 2D 和 3D 图形的一个 JavaScript API。Unity Web 构建选项允许 Unity 将内容发布为 JavaScript 程序,该程序使用 HTML5 技术和 WebGL 渲染 API 在 Web 浏览器中运行 Unity 内容。 更多信息
参见 词汇表
,Emscripten 提供了 GL.textures 数组,该数组将 Unity 中的本机纹理 ID 映射到 WebGL 纹理对象。你可以在 Emscripten 的 WebGL 上下文中调用 WebGL 函数,GLctx

例如,以下函数将来自 GL 纹理数组的 WebGL 纹理绑定到 2D 纹理。

 BindWebGLTexture: function (texture) {
    GLctx.bindTexture(GLctx.TEXTURE_2D, GL.textures[texture]);
  },

在其自身范围内执行编译代码

建议你在其自身的范围内执行所有构建代码。如果你在自己的范围内编写了代码,则可以在页面上嵌入内容,而不会与嵌入页面代码发生冲突,并且可以在同一页面上嵌入多个构建。

.jslib 插件中的代码

如果项目中的所有 JavaScript 代码都具有 .jslib 插件的形式,那么此 JavaScript 代码将在与编译版本相同的范围内运行,并且你的代码应与 Unity 早期版本中的代码以相同的方式工作。从 JavaScript 插件代码可直接看到的一些对象和函数包括:* Module * SendMessage * HEAP8 * ccall

从全局范围内调用 JavaScript 函数

如果你想从嵌入页面的全局范围内调用内部 JavaScript 函数,那么必须在 Web 模板 index.html 中使用 unityInstance 变量。

Unity 引擎实例化成功后,使用 unityInstance,例如

  var MyGameInstance = null;
  script.onload = () => {
    createUnityInstance(canvas, config, (progress) => { /*...*/ }).then((unityInstance) => {
      MyGameInstance = unityInstance;

然后,可以使用 MyGameInstance.SendMessage() 向生成发送消息,或使用 MyGameInstance.Module 访问生成模块对象。

调用 JavaScript 函数的 Unity C# 示例代码

以下 JavaScript 代码创建了一个名为 Hello 的函数。对于此示例,在 JavaScript 插件中使用此代码,以便可以在 Unity C# 脚本中调用它。

mergeInto(LibraryManager.library, {

  Hello: function () {
    window.alert("Hello, world!");
  },
});

然后,在 Unity 项目中使用此 C# 代码从 JavaScript 代码中调用 Hello 函数

using UnityEngine;
using System.Runtime.InteropServices;

public class NewBehaviourScript : MonoBehaviour {

    [DllImport("__Internal")]
    private static extern void Hello();

    void Start() {
        Hello();
    }
}

有关包含各种函数类型的更大代码示例,请参阅 代码示例:在 Unity 中调用 JavaScript 和 C/C++/C# 函数

将 Unity 插件用作参考

在 Unity 安装文件夹中有几个插件,可作为参考使用

  • PlaybackEngines/WebGLSupport/BuildTools/lib

  • PlaybackEngines/WebGLSupport/BuildTools/Emscripten/src/library*

其他资源

设置 JavaScript 插件
从 JavaScript 调用 Unity C# 脚本函数