Unity SocketIo 使用想要在 webgl 中使用的最佳 http2 插件

问题描述 投票:0回答:1

当我尝试使用这个最好的 http2 插件发出数据时,它会以 jsonstring 的形式发出数据,但在后端,他们想要作为 jsonobject ,以及我尝试使用 json.net 和许多其他方式将其更改为 jsonOject 有多少次,它仍然作为 jsonstring 。如果不可能,那么任何人都可以告诉我如何在统一的 webgl 中使用套接字。如果有任何可能请告诉我

我正在尝试在 webgl 中使用套接字。我使用 unity 套接字 IO 和最好的 http2 套接字 IO,但在 webgl 中仍然面临许多发送和接收数据的问题。如果有任何可能的方式和答案请告诉我。我无法使用网络套接字,我只需要使用套接字版本 2

unity-game-engine sockets unity-webgl
1个回答
0
投票

您似乎面临两个主要问题:

  1. 使用 Unity 中的最佳 HTTP/2 插件将数据作为 JsonObject 而不是 JsonString 发送。
  2. 在 Unity 中使用 WebGL 中的 Socket.IO。

将数据作为 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 实例可访问

这是一个代码示例

  1. 将数据作为 JsonObject 发送如果您使用 Newtonsoft 的 Json.NET,您可以将字符串转换为 JObject,如下所示:

C#

using Newtonsoft.Json.Linq;

string jsonString = "{ \"key\": \"value\" }";
JObject jsonObject = JObject.Parse(jsonString);
  1. 在 Unity 的 WebGL 中使用 Socket.IO 下面是如何为 Socket.IO 设置 .jslib 文件的示例:

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

© www.soinside.com 2019 - 2024. All rights reserved.