Unity 无法从“字符串”转换为“整数”

Posted

技术标签:

【中文标题】Unity 无法从“字符串”转换为“整数”【英文标题】:Unity cannot convert from 'string' to 'int' 【发布时间】:2021-09-01 13:42:30 【问题描述】:

您好,我想解析从 websocket 服务器获取的数据,但它显示“无法从 'string' 转换为 'int'


当我这样做时,它给了我一个错误的号码 示例:

实际值:-11.6666342423411 它说的值:-1.166663424234E + 16
    void Update()
    
        ws.OnMessage += (sender, e) =>
        
            JSONNode data = JSON.Parse(e.Data);
            Debug.Log(data);
            // position.x = int.Parse(e.Data["position"]["x"]);
            // position.y = int.Parse(e.Data["position"]["y"]);
            // Debug.Log(position);
            // gameObject.transform.position = position;

            // float rotation = data["rotation"];
            // rb.rotation = rotation;
        ;
    
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using WebSocketSharp;
using SimpleJSON;

public class Enemy : MonoBehaviour

    public Rigidbody2D rb;

    Vector2 position;

    WebSocket ws;
    void Start()
    
        ws = new WebSocket("ws://localhost:8080");
        ws.Connect();
    

    void Update()
    
        ws.OnMessage += (sender, e) =>
        
            // JSONNode data = JSON.Parse(e.Data);
            Debug.Log(e.Data["position"]);
            // position.x = int.Parse(e.Data["position"]["x"]);
            // position.y = int.Parse(e.Data["position"]["y"]);
            // Debug.Log(position);
            // gameObject.transform.position = position;

            // float rotation = data["rotation"];
            // rb.rotation = rotation;
        ;
    


【问题讨论】:

e.Data["position"]中,字符串"position"必须是数组中的一个位置 @rustyBucketBay JSON.Parse 不返回数组,而是返回一个类似于字典的 JsonObject ... 【参考方案1】:

解析出来的是值

-116666342423411

因为int.Parse 默认不使用小数点...因为int 中没有小数点。然后它返回一个int,Unity 只是以科学符号显示它。


您更愿意使用float.Parse,因为您的值应该是浮点值。

或者实际上现在我看到你正在使用SimpleJson,你也可以简单地使用JsonNode.AsFloat,因为他们已经有一个实现。

或者,如果您也使用SimpleJSONUnity.cs (Extension file),那么您实际上可以只使用JsonNode.ReadVector2


然后您还想访问这些值,而不是在 e.Data 中,而是在您解析的 json 节点中

position.x = float.Parse(data["position"]["x"].Value);
position.y = float.Parse(data["position"]["y"].Value);

或者说

position.x = data["position"]["x"].AsFloat();
position.y = data["position"]["y"].AsFloat();

或(使用扩展)

position = data["position"].ReadVector2();

然后总的来说,让我立即告诉你,它不会像你拥有的那样工作!

您想附加监听器ONCE

而且大部分 Unity API 只能在 Unity 主线程中使用,OnMessage 很可能被称为异步。

你的代码应该是例如

public class Enemy : MonoBehaviour

    public Rigidbody2D rb;

    private readonly ConcurrentQueue<Action> _actions = new ConcurrentQueue<Action>();

    WebSocket ws;
    void Start()
    
        ws = new WebSocket("ws://localhost:8080");

        ws.OnMessage += (sender, e) =>
        
            // dispatch this into the main thread so it is executed in the next Update call
            _actions.Enqueue(() =>
            
                JSONNode data = JSON.Parse(e.Data);
            
                var x = float.Parse(data["position"]["x"].Value);     
                //var x = data["position"]["x"].AsFloat();
                var y = float.Parse(data["position"]["y"].Value);     
                //var y = data["position"]["y"].AsFloat();

                var position = new Vector2(x, y);
                //var position = data["position"].ReadVector2();

                Debug.Log($"Received position position.ToString("G8")");
                // NOTE: you should not set anything via Transform
                // otherwise you break the physics and collision detection
                rb.MovePosition(position);

                var rotation = float.Parse(data["rotation"].Value); 
                //var rotation = data["rotation"].AsFloat();
                rb.MoveRotation(rotation);
            );
        ;

        ws.Connect();
    

    void FixedUpdate()
    
        while(_actions.Count > 0 && _actions.TryDequeue(out var action))
        
            action?.Invoke();
        
    

【讨论】:

然后它告诉我不能在设置 x 和 y 的行中将字符串转换为 int @robinnlmn 你能告诉我你收到的 JSON 格式吗? "position":"x":-15.184359550476075,"y":-5.733031749725342,"rotation":-322.5946350097656,"id":"1" @robinnlmn 你能检查你的代码吗...我只是将它与 SimpleJson 和 WebSocket 的东西一起复制到一个新项目中并且没有错误... @robinnlmn 我的答案之一

以上是关于Unity 无法从“字符串”转换为“整数”的主要内容,如果未能解决你的问题,请参考以下文章

Pentaho Kettle 从字符串转换为整数/数字错误

从浮点字符串到 Int 的 Python 类型转换在创建列表时无法在 for 循环中工作

我无法理解字符串如何转换为整数的概念

无法将整数转换为字符串 [重复]

“字符串的一维数组”类型的值无法转换为“整数的一维数组”,因为“字符串”不是从“整数”派生的

匿名托管的 DynamicMethods 程序集:无法将类型“字符串”隐式转换为“整数”