using UnityEngine; using NativeWebSocket; using System.Threading.Tasks; using Newtonsoft.Json.Linq; public class WebSocketClient : MonoBehaviour { private WebSocket websocket; private readonly string serverUrl = "ws://localhost:8010"; async void Start() { websocket = new WebSocket(serverUrl); websocket.OnOpen += () => { Debug.Log("Connection open!"); }; websocket.OnError += (e) => { Debug.LogError($"Error! {e}"); }; websocket.OnClose += (e) => { Debug.Log("Connection closed!"); }; websocket.OnMessage += (bytes) => { var message = System.Text.Encoding.UTF8.GetString(bytes); HandleMessage(message); }; await websocket.Connect(); } void Update() { #if !UNITY_WEBGL || UNITY_EDITOR websocket.DispatchMessageQueue(); #endif } private void HandleMessage(string jsonMessage) { try { var json = JObject.Parse(jsonMessage); string messageType = json["type"].ToString(); switch (messageType) { case "position_update": HandlePositionUpdate(json); break; case "collision_warning": HandleCollisionWarning(json); break; } } catch (System.Exception e) { Debug.LogError($"Error parsing message: {e.Message}"); } } private void HandlePositionUpdate(JObject json) { string objectId = json["objectId"].ToString(); string objectType = json["objectType"].ToString(); double longitude = json["longitude"].Value(); double latitude = json["latitude"].Value(); double heading = json["heading"].Value(); // 更新对应物体的位置和朝向 GameObject obj = GameObject.Find(objectId); if (obj != null) { Vector3 position = CoordinateConverter.ToUnityPosition(longitude, latitude); obj.transform.position = position; obj.transform.rotation = Quaternion.Euler(0, (float)heading, 0); } } private void HandleCollisionWarning(JObject json) { string object1Id = json["object1Id"].ToString(); string object2Id = json["object2Id"].ToString(); string warningLevel = json["warningLevel"].ToString(); double distance = json["distance"].Value(); // 显示碰撞警告效果 WarningManager.Instance.ShowWarning(object1Id, object2Id, warningLevel, distance); } private async void OnApplicationQuit() { await websocket.Close(); } }