Version: 6000.3
语言: 中文
自定义错误处理
从 JavaScript 调用 Unity C# 脚本函数

从 Unity C# 脚本调用 JavaScript 函数

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

了解文件类型以及如何设置 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 中的这个函数:lang-js AddNumbers: function (x, y) { return x + y; },

接受来自 C# 的整数值,无需转换:

int result = AddNumbers(5, 7);

您可以在 Emscripten 堆中作为指针传递其他数据类型。Emscripten 堆只是 JavaScript 内存中的一个大数组。

字符串

要将字符串转换为 JavaScript 字符串,请使用UTF8ToStringhelper 函数。

var stringMessage = UTF8ToString("Hello World");

要返回字符串值,请调用_malloc分配一些内存,而stringToUTF8helper 函数将 JavaScript 字符串写入内存。如果字符串是返回值,则IL2CPP Unity 开发的脚本后端,在为某些平台构建项目时,可以将其用作 Mono 的替代方案。更多信息
请参阅术语表
runtime 会自动为您释放内存。

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

阵 列

对于原始类型的数组,Emscripten 提供了不同的ArrayBufferViews放入其堆中,以获得不同大小的整数、无符号整数或内存浮点表示:HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64.

以下函数循环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数组,将原生纹理 ID 从 Unity 映射到 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变量。

unityInstanceUnity 引擎实例化成功后,例如:

  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# 代码调用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 调用 Unity C# 脚本函数