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 无法从“字符串”转换为“整数”的主要内容,如果未能解决你的问题,请参考以下文章
从浮点字符串到 Int 的 Python 类型转换在创建列表时无法在 for 循环中工作