找回密码
 立即注册
查看: 621|回复: 2

[笔记] 为什么unity只有将数据序列化之后才能显示再Inspector面板上?

[复制链接]
发表于 2021-4-13 09:31 | 显示全部楼层 |阅读模式
在Inspector面板中显示的数据可以在程序运行时动态的修改,而其他的数据在修改之后脚本都需要重新编译,这个原理还不清楚,但是由于数据序列化之后才能在面板中修改,我感觉和它有关系,但我想明白其中详细的原理。
发表于 2021-4-13 09:33 | 显示全部楼层
每当你修改脚本,编辑器右下就会转小圈圈,它提示你脚本在编译,编译后的脚本需要重新加载才有效。其实unity本身是一个cpp写出来得引擎,它只是封装了一层便于用户使用得脚本层,这里主要是指c#。c#是托管语言,它得内存分配对用户是透明得,你不需要显示的申请和释放内存。所以当你c#写好脚本后,需要让cpp引擎运行,就必须得有一条路让托管层面得代码数据与非托管层面得代码数据交互。所以当你的脚本重新加载,也就是assembly在reload后,引擎会把你脚本里的数据从托管层传输到非托管层。当一个脚本改变后,还涉及到了Assembly的卸载,这就需要把现有的Assembly用到的内存清除掉。有时还需要把cpp端修改的数据保存回Assembly。
[1]Serialization in Unity
[2]Unity Serialization
发表于 2021-4-13 09:36 | 显示全部楼层
简单来说,序列化对象-摧毁mono runtime-编译-运行新的mono runtime-反序列化对象。你能够存的数据就在这些可序列化对象的可序列化字段之中。

你可以创建一个类继承自ScriptObject,这样你的数据才能被Unity序列化,但是实际上你可以自定义内部序列化策略,比如使用json:

序列化: 把对象用json库序列化后存到ScriptObject子类的一个字符串字段里。

反序列化: 使用json库对目标字段进行反序列化,使用UnityEditor.EditorGUILayout等相关api把反序列化后的对象字段在inspector里显示。

由于这里用的是json序列化,所以这些类就可以不需要Serializable属性或继承Unity的类。
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-5-20 07:08 , Processed in 0.089600 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表