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
相关产品推荐
相关产品推荐

