【Unity实战】SO反序列化正确姿势
此篇博文算是【C#实战】Newtonsoft.Json基类子类解析_newtonsoft.json不能转化子类-CSDN博客的一个补充,因为我发现ScriptableObject并不是传统的new()就能解决的问题。
SomeClass must be instantiated using the ScriptableObject.CreateInstance method instead of new SomeClass.
很明显,Unity不推荐使用new来弄一个实例。
前后对比如下:
// Before
private T GetItem<T>(JObject obj)
{
return obj.ToObject<T>();
}
// After
private Item GetItem(JObject obj)
{
Item item = ScriptableObject.CreateInstance<Item>();
JsonUtility.FromJsonOverwrite(obj.ToString(), item);
return item;
}
这里使用了JsonUtility,这是Unity自带的Json序列化、反序列化库,对SO有特殊的处理。如果之前用的是Newtonsoft,可以写个自定义的JsonConverter,然后用JsonUtility去覆盖新建出来的SO实例。
有同志问为什么不用之前的泛型而是指定具体的类型,主要是CreateInstance不能和泛型使用,编译不会通过,看似没有泛型相关的实现。
So emm,如果读者有泛型的实现方法,欢迎评论区留言,感激不尽。