当我尝试使用这个最好的 http2 插件发出数据时,它会以 jsonstring 的形式发出数据,但在后端,他们想要作为 jsonobject ,以及我尝试使用 json.net 和许多其他方式将其更改为 jsonOject 有多少次,它仍然作为 jsonstring 。如果不可能,那么任何人都可以告诉我如何在统一的 webgl 中使用套接字。如果有任何可能请告诉我
我正在尝试在 webgl 中使用套接字。我使用 unity 套接字 IO 和最好的 http2 套接字 IO,但在 webgl 中仍然面临许多发送和接收数据的问题。如果有任何可能的方式和答案请告诉我。我无法使用网络套接字,我只需要使用套接字版本 2
您似乎面临两个主要问题:
将数据作为 JsonObject 发送 最好的 HTTP/2 插件可能会默认将您的数据序列化为 JSON 字符串。您可以尝试创建自定义编码器1来根据您的需要处理序列化过程。不过,需要注意的是,后端应该能够将 JSON 字符串解析为 JSON 对象。
由于浏览器安全限制,在 WebGL 中使用 Socket.IO 和 Unity WebGL 不允许直接访问 IP 套接字2。但是,您可以使用 WebSockets 或 WebRTC(浏览器支持的两种最常见的网络协议)来解决这个问题3。 Unity 没有内置 API 允许您使用 WebSockets 或 WebRTC,但您可以使用 JavaScript 插件来实现 this245。
您可以按照以下步骤在 Unity2 中使用 WebGL 设置 Socket.IO:
在 Unity Assets 目录中创建一个“Plugins”文件夹(如果尚不存在)。 在 Plugins 文件夹中创建一个名为 socket_client.jslib 的新文件。此 .jslib 文件是您的浏览器脚本。 根据您的需要修改脚本的内容。请参阅相关的 Unity 脚本文档和 SocketIO 文档。 请记住,将项目构建为 WebGL 后,您将需要安装 socket.io 并使 Unity 实例可访问
这是一个代码示例
C#
using Newtonsoft.Json.Linq;
string jsonString = "{ \"key\": \"value\" }";
JObject jsonObject = JObject.Parse(jsonString);
Javascript
mergeInto(LibraryManager.library, {
Socket_Connect: function () {
if (typeof io !== 'undefined') {
this.socket = io('http://localhost:3000');
} else {
console.error('Socket.IO not loaded');
}
},
Socket_Emit: function (eventName, data) {
if (this.socket) {
this.socket.emit(Pointer_stringify(eventName), Pointer_stringify(data));
}
},
Socket_On: function (eventName) {
if (this.socket) {
this.socket.on(Pointer_stringify(eventName), function (data) {
// Handle data
});
}
}
});
在 Unity C# 脚本中,您可以使用 [DllImport("__Internal")] 调用这些函数:
using System.Runtime.InteropServices;
public class SocketIO : MonoBehaviour {
[DllImport("__Internal")]
private static extern void Socket_Connect();
[DllImport("__Internal")]
private static extern void Socket_Emit(string eventName, string data);
[DllImport("__Internal")]
private static extern void Socket_On(string eventName);
}
请随时提出任何问题,我希望这有帮助代码由Ipeleng Floyd Bela