找回密码
 立即注册
查看: 338|回复: 0

Unity + Web

[复制链接]
发表于 2022-2-24 20:40 | 显示全部楼层 |阅读模式
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
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-9-22 18:26 , Processed in 0.084161 second(s), 22 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表