Newtonsoft 序列化 Vector3类型数据报错

错误:
Self referencing loop detected for property 'normalized' with type 'UnityEngine.Vector3'. Path '[0].coor'.

错误原因:

NewtonSoft has a hard time serializing structs (Vector3 is defined as a struct). More specifically that struct has a property normalized that actually returns a Vector3 also, that Vector3 also has a normalized property and so on, so what happens is NewtonSoft is trying to serialize that new Vector3 everytime and you end up in an infinite loop.
 

解决方案1:
My workaround for this was to create a custom class for this purpose:

[System.Serializable]
public class SerializableVector3{
    public float x;
    public float y;
    public float z;
 
    [JsonIgnore]
    public Vector3 UnityVector{
        get{
            return new Vector3(x, y, z);
        }
    }
 
    public SerializableVector3(Vector3 v){
        x = v.x;
        y = v.y;
        z = v.z;
    }
 
    public static List<SerializableVector3> GetSerializableList(List<Vector3> vList){
        List<SerializableVector3> list = new List<SerializableVector3>(vList.Count);
        for(int i = 0 ; i < vList.Count ; i++){
            list.Add(new SerializableVector3(vList[i]));
        }
        return list;
    }
 
    public static List<Vector3> GetSerializableList(List<SerializableVector3> vList){
        List<Vector3> list = new List<Vector3>(vList.Count);
        for(int i = 0 ; i < vList.Count ; i++){
            list.Add(vList[i].UnityVector);
        }
        return list;
    }
}

Whenever you serialize a class make sure to convert all your Vector3 to SerializableVector3 and vice-versa when you deserialize. I use the ISerializable interface (System.Runtime.Serialization) for this purpose among other things.

JsonSerializationException: Self referencing loop detected - Unity Forum

解决方案2:

ReferenceLoopHandling setting

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Unity中使用Newtonsoft.Json保存Vector类型需要进行以下步骤: 1. 首先,确保你已经在Unity项目中添加了Newtonsoft.Json库。你可以从Unity Asset Store或者Github上下载这个库。 2. 在你需要保存Vector的脚本中,首先引入Newtonsoft.Json命名空间。 ```c# using Newtonsoft.Json; ``` 3. 定义一个Vector类型的变量并给它赋值。 ```c# Vector3 vector = new Vector3(1, 2, 3); ``` 4. 使用JsonConvert.SerializeObject方法将Vector对象转换为JSON字符串。 ```c# string json = JsonConvert.SerializeObject(vector); ``` 5. 将生成的JSON字符串保存到文件中,你可以使用File.WriteAllText方法来实现。 ```c# string filePath = "vector.json"; File.WriteAllText(filePath, json); ``` 6. 如果需要加载保存的Vector,我们可以使用JsonConvert.DeserializeObject方法将JSON字符串转换回Vector对象。 ```c# string loadedJson = File.ReadAllText(filePath); Vector3 loadedVector = JsonConvert.DeserializeObject<Vector3>(loadedJson); ``` 这样,你就可以成功地使用Newtonsoft.Json保存和加载Vector类型了。 注意:在使用Newtonsoft.Json库时,需要确保你已经正确安装并添加了相关引用,以便能够引用正确的命名空间和方法。 ### 回答2: Unity可以使用Newtonsoft.Json来保存Vector类型Newtonsoft.Json是一个流行的JSON序列化和反序列化库,可以轻松地将对象转换为JSON格式并保存。 要保存Vector类型,首先需要安装Newtonsoft.Json库。您可以在Unity Asset Store或Newtonsoft官方网站上找到并下载该库。 安装完毕后,可以使用以下代码将Vector类型转换为JSON字符串并保存: ```csharp using UnityEngine; using Newtonsoft.Json; public class SaveManager : MonoBehaviour { private Vector2 savedVector; private void Start() { // 假设此处是要保存的Vector2 Vector2 vectorToSave = new Vector2(1f, 2f); // 将Vector2对象转换为JSON字符串 string jsonString = JsonConvert.SerializeObject(vectorToSave); // 保存JSON字符串到文件或其他位置 // 这里仅示范输出到控制台 Debug.Log(jsonString); // 反序列化JSON字符串为Vector2对象 savedVector = JsonConvert.DeserializeObject<Vector2>(jsonString); // 输出反序列化后的Vector2 Debug.Log(savedVector); } } ``` 在上面的示例中,我们使用JsonConvert.SerializeObject方法将Vector2对象转换为JSON字符串,并使用Debug.Log输出到控制台。我们还使用JsonConvert.DeserializeObject方法将JSON字符串反序列化Vector2对象,并将其打印到控制台。 通过上述步骤,您可以使用Newtonsoft.Json保存Unity中的Vector类型。 ### 回答3: Unity是一款强大的游戏开发引擎,它提供了许多实用的功能来简化开发过程。其中一个重要的功能就是数据序列化与反序列化。为了保存和加载Vector类型数据,我们可以使用Newtonsoft.Json库。 首先,我们需要将Newtonsoft.Json库导入到Unity项目中。这可以通过在Unity Asset Store中下载并导入Newtonsoft.Json插件来完成。 接下来,在我们需要保存Vector类型数据的脚本中,我们需要引入Newtonsoft.Json命名空间。命名空间的引入可以通过以下代码实现: ```csharp using Newtonsoft.Json; ``` 然后,我们可以使用JsonConvert.SerializeObject方法将Vector类型数据转换为JSON字符串,并将其保存到文件中。下面是一个示例代码: ```csharp Vector3 vectorData = new Vector3(1.0f, 2.0f, 3.0f); string json = JsonConvert.SerializeObject(vectorData); File.WriteAllText("vectorData.json", json); ``` 上述代码将一个名为vectorData.json的文件保存到项目目录中。该文件中包含了Vector3类型数据。 最后,如果我们想要加载保存的Vector类型数据,我们可以使用JsonConvert.DeserializeObject方法将JSON字符串转换回Vector类型。以下是一个示例代码: ```csharp string json = File.ReadAllText("vectorData.json"); Vector3 loadedVectorData = JsonConvert.DeserializeObject<Vector3>(json); ``` 上述代码将通过读取vectorData.json文件中的JSON字符串,并将其转换为Vector3类型的loadedVectorData变量。 使用Newtonsoft.Json库保存和加载Vector类型数据是非常简单的。我们只需要导入库,将Vector类型数据转换为JSON字符串并保存,然后反过来将JSON字符串转换回Vector类型数据即可。这些步骤可以帮助我们在Unity中轻松地保存和加载Vector类型数据

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值