Unity WebGL 抛出错误:“ReferenceError:运行时未定义”

Cha*_*nam 3 unity-game-engine websocket unity-webgl

我想导出适用于 WebGL 的 Unity 项目(Unity 版本 2021.2),但出现以下错误:

\n
\n

在此页面上运行 Unity 内容时发生错误。有关详细信息,请参阅您的浏览器 JavaScript 控制台。错误是:\nReferenceError:未定义运行时 unityFramework/_WebSocketConnect/instance.ws.onopen@http://localhost:55444/Build/WEbGL.framework.js:3:67866

\n
\n

我正在使用这个 Websocket 包(https://github.com/endel/NativeWebSocket),并且在 Unity 或 Windows 构建中一切正常。当我运行 WebGL 构建时,它确实与 websocket 连接,但随后出现错误。\n错误消息显示更多信息在我的控制台中,但 F12 上的控制台仅重复该错误:

\n

未捕获的 ReferenceError: 未定义运行时\nat WebSocket.instance.ws.onmessage (WEbGL.framework.js:3)\ninstance.ws.onmessage @ WEbGL.framework.js:3 \n

\n
\n

为了给出一个最小的可重现示例,我刚刚使用 Unity 2021.2 创建了一个空的 3D Core 项目,并导入了 NativeWebSocket 包(我从 GitHub 下载了该文件并手动安装了它:

\n
\n

将NativeWebSocket/Assets/WebSocket中的源复制到您的 Assets 目录中

\n
\n

然后你必须通过 kentakang 在https://github.com/endel/NativeWebSocket/pull/54上发布修复程序,否则构建将失败。

\n

然后我使用下面的代码(也来自 Github 页面)创建了一个新的 C# 脚本,并将其放在场景中的相机上。我将其导出为 WebGL 并收到了上述错误。

\n

当调用方法 websocket.OnOpen/OnError/OnClose/OnMessage 之一时会发生这种情况,因此您\xc2\xb4t甚至不需要正在运行的 websocket,因为随后调用了 websocket.OnError 并且 WebGL Build 抛出“运行时未定义”错误。或者,如果您还有正在运行的 Websocket 服务器(该服务器也包含在包中),则在调用 websocket.OnOpen 时会收到错误消息。

\n
using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing UnityEngine;\n\nusing NativeWebSocket;\n\npublic class Connection : MonoBehaviour\n{\n  WebSocket websocket;\n\n  // Start is called before the first frame update\n  async void Start()\n  {\n    websocket = new WebSocket("ws://localhost:2567");\n\n    websocket.OnOpen += () =>\n    {\n      Debug.Log("Connection open!");\n    };\n\n    websocket.OnError += (e) =>\n    {\n      Debug.Log("Error! " + e);\n    };\n\n    websocket.OnClose += (e) =>\n    {\n      Debug.Log("Connection closed!");\n    };\n\n    websocket.OnMessage += (bytes) =>\n    {\n      Debug.Log("OnMessage!");\n      Debug.Log(bytes);\n\n      // getting the message as a string\n      // var message = System.Text.Encoding.UTF8.GetString(bytes);\n      // Debug.Log("OnMessage! " + message);\n    };\n\n    // Keep sending messages at every 0.3s\n    InvokeRepeating("SendWebSocketMessage", 0.0f, 0.3f);\n\n    // waiting for messages\n    await websocket.Connect();\n  }\n\n  void Update()\n  {\n    #if !UNITY_WEBGL || UNITY_EDITOR\n      websocket.DispatchMessageQueue();\n    #endif\n  }\n\n  async void SendWebSocketMessage()\n  {\n    if (websocket.State == WebSocketState.Open)\n    {\n      // Sending bytes\n      await websocket.Send(new byte[] { 10, 20, 30 });\n\n      // Sending plain text\n      await websocket.SendText("plain text message");\n    }\n  }\n\n  private async void OnApplicationQuit()\n  {\n    await websocket.Close();\n  }\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n

有人知道如何修复这个错误吗?如有帮助,将不胜感激:)

\n

mar*_*rio 9

看来在 unity 2021.2 中变量 Runtime 不存在,可以用 Module['dynCall_*'] 替换。

在 webSocket.jslib 中将所有 Runtime.dynCall('*1', *2, [*3, *4]) 更改为 Module['dynCall_*1'](*2, *3, *4)

WebSocket.jslib 中的 example.ws.onopen 函数示例:

change Runtime.dynCall('vi', webSocketState.onOpen, [ instanceId ]);
for
Module['dynCall_vi'](webSocketState.onOpen, instanceId);
Run Code Online (Sandbox Code Playgroud)