You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity中如何实现API实时数据获取与展示?附现有代码求助

实现Unity实时从API同步数据的方案

方案1:定时轮询(最快实现,无需修改API)

这是最容易落地的方式,让Unity每隔固定时间重复请求API,对比新旧数据后再更新本地逻辑,避免无效刷新。

基于你现有代码修改的实现:

// 可在Inspector面板调整的轮询间隔(单位:秒)
[SerializeField] private float pollInterval = 2f;
// 存储上一次获取的数据,用于对比更新
private Root _lastFetchedData;

IEnumerator StartContinuousPolling()
{
    while (true)
    {
        yield return FetchDataCoroutine();
        // 等待指定间隔后发起下一次请求
        yield return new WaitForSeconds(pollInterval);
    }
}

IEnumerator FetchDataCoroutine()
{
    string url = "http://127.0.0.1:8000/new";
    using (UnityWebRequest request = UnityWebRequest.Get(url))
    {
        yield return request.SendWebRequest();
        
        if (request.isNetworkError || request.isHttpError)
        {
            Debug.Log($"请求失败:{request.error}");
            yield break;
        }
        
        Root newData = JsonConvert.DeserializeObject<Root>(request.downloadHandler.text);
        // 仅当数据有变化时执行更新逻辑
        if (_lastFetchedData == null || !_lastFetchedData.one.Equals(newData.one))
        {
            _lastFetchedData = newData;
            Debug.Log($"数据已更新:{newData.one}");
            // 在这里添加你的UI/业务逻辑更新代码,比如:
            // outputArea.text = newData.one;
        }
    }
}

// 在初始化时启动轮询
void Start()
{
    StartCoroutine(StartContinuousPolling());
}

注意:间隔不要设置过小,避免给服务器造成不必要的压力,根据业务需求调整即可。

方案2:Server-Sent Events(SSE,高效单向推送)

如果你的后端API支持SSE(服务器主动推送数据更新),可以实现真正的实时同步,无需定时请求。Unity中可通过监听数据流实现:

IEnumerator ListenToSSEStream()
{
    string sseUrl = "http://127.0.0.1:8000/new/sse"; // 后端提供的SSE端点
    using (UnityWebRequest request = UnityWebRequest.Get(sseUrl))
    {
        // 设置SSE请求头
        request.SetRequestHeader("Accept", "text/event-stream");
        request.SendWebRequest();
        
        // 持续读取流数据
        while (!request.isDone)
        {
            if (request.downloadHandler.data.Length > 0)
            {
                string rawSSEData = request.downloadHandler.text;
                // 解析SSE格式数据(通常以data: 前缀开头)
                foreach (var line in rawSSEData.Split('\n'))
                {
                    if (line.StartsWith("data:"))
                    {
                        string jsonContent = line.Substring(5).Trim();
                        Root newData = JsonConvert.DeserializeObject<Root>(jsonContent);
                        Debug.Log($"收到服务器推送:{newData.one}");
                        // 执行更新逻辑
                    }
                }
                // 清空已处理的内容,避免重复解析
                request.downloadHandler.text = string.Empty;
            }
            yield return null;
        }
        
        if (request.isNetworkError || request.isHttpError)
        {
            Debug.Log($"SSE连接异常:{request.error}");
        }
    }
}

这种方式只有服务器有数据更新时才会推送,比轮询更高效,但需要后端API支持SSE协议。

方案3:WebSocket(双向实时通信)

如果需要双向交互(比如Unity向服务器发送指令,服务器实时返回结果),WebSocket是最佳选择。Unity 2020+自带WebSocket类,示例代码:

private WebSocket _webSocket;

async void Start()
{
    _webSocket = new WebSocket(new Uri("ws://127.0.0.1:8000/ws"));
    await _webSocket.ConnectAsync();
    
    // 开启独立线程接收消息
    _ = ReceiveWebSocketMessages();
}

async Task ReceiveWebSocketMessages()
{
    byte[] buffer = new byte[1024];
    while (_webSocket.State == WebSocketState.Open)
    {
        var receiveResult = await _webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
        if (receiveResult.MessageType == WebSocketMessageType.Text)
        {
            string jsonData = Encoding.UTF8.GetString(buffer, 0, receiveResult.Count);
            Root newData = JsonConvert.DeserializeObject<Root>(jsonData);
            Debug.Log($"WebSocket收到数据:{newData.one}");
            // 执行更新逻辑
        }
    }
}

// 销毁时关闭WebSocket连接
void OnDestroy()
{
    _webSocket?.CloseAsync(WebSocketCloseStatus.NormalClosure, "客户端关闭连接", CancellationToken.None);
}

WebSocket需要后端实现对应的服务,适合对实时性要求极高的场景。


内容的提问来源于stack exchange,提问作者Saber_32

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 17:32:42