从Unity3D中的txt文件读取坐标

yqkkidmi  于 2023-01-21  发布在  其他
关注(0)|答案(2)|浏览(220)

我刚刚开始学习统一,我有一些麻烦继续我的练习。我需要移动2辆汽车使用坐标存储在一个. txt文件称为"positions.txt"。汽车必须在同一时间移动。在"笛卡尔"列表中有数字,必须分为4组(时间,x,y,z)。
我想为每辆车创建2个数组:时间数组和向量3数组。
首先,我需要读取文件并将数字存储在数组中。我发现了几个选项,我尝试了这一个没有成功:https://allison-liem.medium.com/unity-reading-external-json-files-878ed0978977我应该遵循哪种方法?
谢谢你。
文件"位置. txt"

[
  {
    "id":"car_1",
    "position":{
      "cartesian":[
        1,0,0,0,
        2,0,0,2,
        3,1,0,3,
        4,1,0,6,
        5,2,1,9,
        6,2,0,11,
        7,3,1,13,
        8,3,0,15,
        9,3,1,18,
        10,4,1,20]
    }
  },
  {
    "id":"car_2",
    "position":{
      "cartesian":[
        1,0,0,0,
        2,0,0,2,
        3,1,0,3,
        4,1,0,6,
        5,2,1,9,
        6,2,0,11,
        7,3,1,13,
        8,3,0,15,
        9,3,1,18,
        10,4,1,20]
    }
  }
]
wlwcrazw

wlwcrazw1#

首先,您有一个JSON,请参见Serialize and Deserialize Json and Json Array in Unity
我会推荐Newtonsoft Json. NET包,并做eidogg。

[Serializable]
public class Position
{
    // you can also go for array if you liked
    // in JSON it is the same
    public List<int> cartesian;
}

[Serializable]
public class Car
{
    public string id;
    public Position position;
}

然后

var json = File.RealAllText(FILEPATH);
// again could also go for array here
List<Car> cars = JsonConvert.DeserializeObject<List<Car>>(json);

然而,cartesian数组有点"愚蠢"--请记住,一旦将其作为列表/数组处理,就不会有换行符,并且每个集合开头的冗余索引(1、2、3、4 ......)也没有什么好的意义。
我想为每辆车创建2个数组:时间数组和向量3数组。
在我看来,这是没有意义的--如果某个信息显然属于耦合在一起的东西,那么将其拆分为单独的数组将是不好的。
无论采用哪种方法,在遍历列表/数组时都必须手动提取值

  • 以4个项目为一组
  • 忽略第一个-它似乎是一个冗余索引
  • 取最后三项并将它们填入向量的x,y,z中

例如

[Serializable]
public class Position
{
    // you can also go for array if you liked
    // in JSON it is the same
    public List<int> cartesian;

    public List<Vector3> GetPositions()
    {
        var count = cartesian.Count / 4;
        var result = new List<Vector3>(count);

        for(var resultIndex = 0; resultIndex < count; resultIndex++)
        {
            var cartesianIndex = resultIndex * 4;
            var position = new Vector3(cartesian[cartesianIndex + 1], cartesian[cartesianIndex + 2], cartesian[cartesianIndex + 3]);
            result.Add(position);
        }
    }
}

或者如果你真的需要第一个值,我会使用一个自定义类型,比如。

public readonly struct TimeFrame
{
    public int Time { get; }
    public Vector3 Position { get; }

    public TimeFrame(int time, Vector position)
    {
        Time = time;
        Position = position;
    }
}

然后进行相应调整

[Serializable]
public class Position
{
    // you can also go for array if you liked
    // in JSON it is the same
    public List<int> cartesian;

    public List<TimeFrame> GetPositions()
    {
        var count = cartesian.Count / 4;
        var result = new List<TimeFrame>(count);

        for(var resultIndex = 0; resultIndex < count; resultIndex++)
        {
            var cartesianIndex = resultIndex * 4;
            var time = cartesian[cartesianIndex];
            var position = new Vector3(cartesian[cartesianIndex + 1], cartesian[cartesianIndex + 2], cartesian[cartesianIndex + 3]);
            result.Add(new TimeFrame(time, position));
        }
    }
}
a64a0gku

a64a0gku2#

我看到你提到的那篇文章使用了Unity内置的JSON解析库,它不支持数组解析,正如https://stackoverflow.com/a/36244111/13489126的回答所指出的那样。
这就是为什么你的方法不起作用的原因。
我建议您使用Newtonsoft的Json解析器,而不是Unity的。

相关问题