抖音开放平台Logo
开发者文档
控制台
  • 体验抖音小游戏
  • 游戏引擎
  • Unity 引擎适配
  • WebGL 方案与优化
  • WebGL适配方案
  • 性能优化
  • 版本更新与资源部署
  • 能力适配
  • 加载外部js文件的支持
  • 使用新文件系统说明
  • 屏幕适配
  • 键盘输入法适配
  • 后端服务指引
  • 网络通信适配
  • 多点触控适配
  • 音频适配
  • Android WebGL2.0支持
  • 问题反馈
  • 方案概述与兼容性
  • BGDT 手册
  • 接入
  • C# API
  • Cocos/Laya/Egret引擎适配
  • 基础功能
  • 开放能力
  • 性能优化
  • 此文档描述小游戏开发时网络通信适配问题
    如果使用native方案,支持直接访问 IP 套接字来实现网络连接。无需额外适配。
    以下适配方案针对webgl方案:
    由于安全性的影响,JavaScript 代码没有直接访问 IP 套接字来实现网络连接。因此,该.NET 网络类(System.Net 命名空间中的一切,特别是System.Net.Sockets)在 WebGL 中不能工作。UnityEngine.Network* 类也是这样,编译 WebGL 时将找不到这些类。

    HTTP 通信

    Unity 支持在 WebGL 中使用 UnityWebRequest 类。

    使用方式

    以下为使用协程方式发送 GET、POST 请求到服务器的示例:
    IEnumerator Get(){UnityWebRequest webRequest = UnityWebRequest.Get("https://mysite.com");yield return webRequest.SendWebRequest();if (webRequest.isHttpError||webRequest.isNetworkError) Debug.Log(webRequest.error);else{ Debug.Log(webRequest.downloadHandler.text);}} IEnumerator Post(){WWWForm form = new WWWForm();//键值对 form.AddField("key", "value"); form.AddField("name","mafanwei"); form.AddField("blog","qwe25878");UnityWebRequest webRequest = UnityWebRequest.Post("https://mysite.com",form);yield return webRequest.SendWebRequest();if (webRequest.isHttpError||webRequest.isNetworkError) Debug.Log(webRequest.error);else{ Debug.Log(webRequest.downloadHandler.text);}}
    注意
      在 Unity WebGL 环境下禁止使用以下代码:
    while(!www.isDone) {}
    WebGL不支持多线程,所以不能阻止线程等待 UnityWebRequest 下载完成,否则您的应用程序将冻结。取而代之的做法是使用协程和 yield 语句等待下载完成。
      HttpWebRequest在WebGL下不支持,需要替换成UnityWebRequest

    TCP 网络通信

    如果游戏使用 TCP 进行网络通信,在 Unity WebGL 中开发者需要使用 WebSocket 进行替代。

    客户端

    支持 Unity WebSocket 的第三方插件比较多,可以从 Github 或 AssetStore 找到。这里以UnityWebSocket为例。
    // 命名空间 using UnityWebSocket; // 创建实例 string address = "ws://echo.websocket.org"; WebSocket socket = new WebSocket(address); // 注册回调 socket.OnOpen += OnOpen; socket.OnClose += OnClose; socket.OnMessage += OnMessage; socket.OnError += OnError; // 连接 socket.ConnectAsync(); // 发送 string 类型数据 socket.SendAsync(str); // 或者 发送 byte[] 类型数据(建议使用) socket.SendAsync(bytes); // 关闭连接 socket.CloseAsync();

    服务端

    如果服务端使用 TCP 接入,则需要使用 WSS<-->TCP 的代理层。解决方案也很多:
      改造原有TCP服务兼容wss服务
    使用TCP方案时,在处理数据包时,请注意数据的“粘包”问题,需要游戏服务器和客户端自行处理。

    UDP 网络通信

    如果游戏使用 UDP 进行网络通信,在 Unity WebGL 中开发者需要使用 SDK 提供的 API 进行替代。

    客户端

    此处以 C# SDK 提供的 UDPSocket API 为例:
    using TTSDK; // 创建 UDPSocket 实例 TTUDPSocket socket = TT.CreateUDPSocket(); // 绑定事件监听 socket.OnError(OnError); socket.OnClose(OnClose); socket.OnListening(OnListening); socket.OnMessage((res) => { Debug.Log("收到消息:" + res.message); }); // 绑定任意可用端口 int port = socket.Bind(); // 预先连接到指定地址 socket.Connect(new UDPSocketConnectOption { address = "xxx.xxx.xxx.xxx", port = xxxx }); // 向指定地址发送消息 socket.Send(new UDPSocketSendOption { address = "xxx.xxx.xxx.xxx", port = xxxx, message = new byte[] { 1, 2, 3, 4 } // 支持发送 byte[] 或 string 类型的数据 }); // 移除绑定的事件监听 socket.OffError(OnError); socket.OffClose(OnClose); socket.OffListening(OnListening); socket.OffMessage(OnMessage); // 关闭连接 socket.Close();
    由于 UDP 协议不可靠的特性,开发者在使用 UDP 通信时,需要注意自行处理丢包、乱序等问题。