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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 00:57:02