外界资源
资源(Asset)是硬盘中的文件,存储在Unity工程的Assets文件夹内。例如,纹理(Texture),材质(Material)和FBX文件等,它们都是资源。一些资源的数据格式是Unity原生支持的,例如材质。有些资源则需要转换为原生的数据格式后才能被Unity使用,例如FBX文件。
Unity对象
UnityEngine.Object,或者说以大写字母O开头的Object——对象,代表序列化数据的集合,表示某个资源的具体实例。它可以是Unity引擎使用的任何类型的资源,例如场景,预制体,网格,Sprite,音频剪辑或动画剪辑。所有的对象(Object)都是UnityEngine.Object基类的子类。
后缀为prefab,anim,controller,mask,unity等Unity对象默认都是由YAML(类似XML)来描述,对编辑器来说是可读可写的。也可以手动设置成用二进制和混合模式,但貌似这样就不能通过Inspector来编辑了。
Unity脚本中的类如GameObject,Transform等类的对象,都可以进行序列化和反序列化。Inspector能编辑东西的都是能序列化的,所有组件包括脚本,都可以由YAML描述。
.meta文件
资源导入Unity时,会经过序列化,并生成.meta文件,这个文件用来描述资源的一些信息,包括导入类型,物理位置,assetBundle信息等。
其中GUID提供了文件存储位置的抽象,文件GUID提供了文件存储位置的抽象,这样一个文件GUID就对应一个具体的文件,这个具体的文件存储在什么位置也就无关紧要了。因此我们才能随意移动这个文件而不破坏所有相关Object对这个文件的引用。
Unity负责维护一张文件路径与文件GUID之间关系的映射表。只要资源文件被读取或导入,这个映射关系就会被建立,映射会将资源的具体位置和资源的文件GUID进行关联。
脚本的字段需要满足什么条件才能被序列化?(必须同时满足)
-
public 类型,或者有 [SerializeField]
-
不是 static
-
不是 const
-
不是 readonly
-
类型必须是 Unity 可以序列化的类型
Unity 可以序列化哪类型?
-
自定义的,非 abstract 的类,且有 [Serializable]
-
有 [Serializable] 的结构体
-
UnityEngine.Object 的子类的引用
-
C#原生类型(int,float,double,bool,string, etc)
-
以上4种类型的数组Array
-
以上4种类型的列表List< T >
ScriptableObject
可以用于共享数据,当配置文件
- ScriptableObject的数据是存储在asset里的,因此它不会在退出时被重置数据,这类似Unity里面的材质和纹理资源数据,我们在运行时刻改变它们的数值就是真的改变了
- 这些资源在实例化的时候是可以被引用,而非复制
- 类似其他资源,它可以被任何场景引用,即场景间共享
- 在项目之间共享
- 没有其他多余的东西,例如多余的Component
参考资料:
Unity 序列化 总结 - 阏乐 - 博客园 https://www.cnblogs.com/devhyj/p/4342592.html
玩转Unity资源,对象和序列化(上) - 赵青青 - 博客园 https://www.cnblogs.com/zhaoqingqing/p/5823927.html
玩转Unity资源,对象和序列化(下) - 赵青青 - 博客园 https://www.cnblogs.com/zhaoqingqing/p/5825907.html
【Unity】ScriptableObject的介绍 - candycat - 优快云博客 https://blog.youkuaiyun.com/candycat1992/article/details/52181814