Unity解析WebSocket数据时报string转int错误及数值异常问题
问题修复方案
错误原因
- 事件绑定位置错误:
ws.OnMessage回调绑定放在Update方法中,每帧都会新增一次绑定,后续单条消息会触发多次回调,造成逻辑混乱 - 取值逻辑错误:
e.Data是WebSocket返回的原始字符串类型,直接用e.Data["position"]这类键索引操作,实际取到的是字符串对应下标位置的char字符,而非JSON中的字段值 - 类型转换错误:坐标值为带小数的浮点数,使用
int.Parse(仅支持转换整数格式字符串)会直接报错,就算强转也会丢失精度甚至得到完全错误的数值
修复后代码
using System.Collections; using System.Collections.Generic; using UnityEngine; using WebSocketSharp; using SimpleJSON; public class Enemy : MonoBehaviour { public Rigidbody2D rb; private Vector2 position; private float rotation; // 标记是否有新数据需要在主线程更新 private bool hasNewData = false; private WebSocket ws; void Start() { ws = new WebSocket("ws://localhost:8080"); // 事件绑定只做一次,放在Start里 ws.OnMessage += (sender, e) => { // 先把原始字符串解析为JSON对象 JSONNode data = JSON.Parse(e.Data); // 从解析后的JSON对象中取对应字段,转成float类型 position.x = data["position"]["x"].AsFloat; position.y = data["position"]["y"].AsFloat; rotation = data["rotation"].AsFloat; // 标记有新数据 hasNewData = true; }; ws.Connect(); } void Update() { // Unity API只能在主线程调用,所以在Update里判断有新数据再更新变换 if (hasNewData) { transform.position = position; rb.rotation = rotation; hasNewData = false; } } // 销毁时关闭WebSocket连接避免内存泄漏 void OnDestroy() { if (ws != null && ws.IsAlive) { ws.Close(); } } }
补充说明
如果需要更高精度的坐标值,可以把AsFloat替换为AsDouble,普通Unity场景用float精度足够满足需求。
内容的提问来源于stack exchange,提问作者robinnlmn
相关产品推荐
相关产品推荐

