pc8888888 发表于 2022-2-24 20:40

Unity + Web

HTTP Server

如果只是从 Http GET 数据或者 POST 数据的话,我们可以选取 Unity 自带的 UnityWebRequest 模块, 官方也给出了详细的例子,可以尝试 Python 端 启动 HTTP Server:
python3 -m http.server然后 :
using UnityEngine;
using UnityEngine.Networking;
using System.Collections;

public class MyBehaviour : MonoBehaviour {
    void Start() {
      StartCoroutine(GetAssetBundle());
    }

    IEnumerator GetAssetBundle() {
      UnityWebRequest www = UnityWebRequestAssetBundle.GetAssetBundle("http://localhost:8000");
      yield return www.SendWebRequest();

      if (www.result != UnityWebRequest.Result.Success) {
            Debug.Log(www.error);
      }
      else {
            AssetBundle bundle = DownloadHandlerAssetBundle.GetContent(www);
      }
    }
}
这也就可以看到成功运行。
Socket Server

但是如果是 Socket Server 的话, Unity 本身是没有 Socket 模块的,但因为 Unity 使用 C# 语言,所以看到有很多使用 .NET 的 Socket 模块的例子。
回忆一下上篇 Socket 编程

[*]socket 本质就是 file descriptor
[*]需要 server 和 client side
Server side 我可以依旧使用 Python, 但在 Unity Side,如果我上 GitHub 上搜 Unity Socket,发现很多 Unity + http://socket.io 的结果。比如很多类似 “http://socket.io client for unity3d.” 查了一下 http://socket.io 是 node.js server, http://socket.io 也太受欢迎了吧,我相信 client side 的代码应该是通用的,但是发现很多这样的 repo 上次更新都是几年前, 。最后我找到了 NativeWebSocket,不错,很活跃,加上我很喜欢 Native 这个词,而且 ReadMe 里面的例子也比较简单,看它的源码,用的是 System.Net.WebSockets,加上 async,都是一堆我需要更加了解的东西,但是测试安装可用,(^-^)V!算暂时解决了问题。
唯一有点美中不足的是不同于 JavaScript 或者 Python 的 client side,使用的例子是继承自 MonoBehaviour,然后给 start 标记上了 async, 在 Update 里面一直 DispatchMessageQueue,然后 receive 都是使用 callback,没有一个比如类似清晰的类似 Python 的 await send 和 await receive,或者是比如像别的 OOP 那样 new 一个 socket,这个例子明显是把它作为 Component attach 在了一个 GameObject 上,比如如果有比较清晰的的 await websocket.sends 和 await websocket.recv 的时候,测一个 round 的速度比较容易,使用 call back 的话我测试了一下 sendMessage 的速度:
// send message
watch = Stopwatch.StartNew();
watch.Start();

SendWebSocketMessage( command + text );

watch.Stop();
var elapsedMs = watch.Elapsed.TotalMilliseconds;
Debug.Log("Log Send Message total time in Milliseconds : " + elapsedMs);
在同一个 WiFi 里面,无论是同一个机器 client/server 或者使用不同的机器 client/server, 居然速度相差没有我想象的那么大,除了一开始那一条探路的 message,居然都在 0.3 ~ 10 Milliseconds,我在 Quest 上测试: 0.5 ~ 30 Milliseconds 之间,还是比较满意的。

[*]Retrieving text or binary data from an HTTP Server (GET)
[*]UnityWebRequest
[*]TCPTestClient.cs
[*]NativeWebSocket
[*]System.Net.WebSockets
[*]WebSockets support in ASP.NET Core
页: [1]
查看完整版本: Unity + Web