赞
踩
最近在开发的时候遇到的问题:在用ScriptableObject进行保存数据的时候,并不是所有的数据都能正常保存,这让人很是难受。所以我决定系统性地整理一下这个问题:
注:建议大家将自己的Unity文件保存方式设置为Text而不是二进制,这样用记事本打开保存的Assest文件就能明码查看内容。可以清楚地看见自己哪些数据保存了,而哪些没有。
可以通过上述方式再查看自己是否是用文本方式再保存文件;
首先,单纯的String、Bool 、Int之类的值都是能正常保存的。
引用的脚本、预制、资源当然也是能直接保存的。(他们会转换成文件ID)
然后是一些数据容器:
列表、数组(仅限一维数组)是可以直接保存的。
至于类,当然是要设置为可序列化才能保存(System.Serializable)。
其实这个才是关键的地方:二维数组、字典是不能直接保存的!
不论你在属性面板如何编辑,在脚本里面如何添加代码,二维数组和字典都是不能保存进Assest的。
需要注意的是,如果你用了Odin插件,或者你自己实现了二维数组/字典在属性面板上的显示方法,你自然是可以编辑的,但是并不一定能保存!
这里插句嘴,说下Odin插件。Odin Inspector可以序列化字典,但是在跨平台时这个字典未必能读出来。这种时候需要编写他的AOT Genteration,详见 : https://blog.csdn.net/cyf649669121/article/details/111795715 。
可能是Unity没有像字典这种键值对,或者多维数组的保存方式吧……反正这种类型就是不会保存成功的,切记!
其实也没啥好的解决方案,他本身不能保存,只有将其装换成能保存的类型。
例如字典,只能让他变成列表。你可以一列存键,一列存值,或者干脆放一起也可以。
至于二维数组,也是类似的方法:存一个大小,然后把值转成一维数组存下来。
虽然用蛋疼的方式解决了,我还是觉得这个ScriptableObject的保存机制很坑。当然也有可能是我没有找到正确的API导致的,如果有大佬知道更方便的办法、能直接保存的方法,欢迎留言告诉我~~
━(*`∀´*)ノ亻!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。