一。unity文件结构。
asset / projectsetting / library 三个以及如果使用monodevelopment产生的obj,以及unity运行时产生的temp文件夹。以及其他的vs或者mono产生的工程文件如
等。
真正有用的文件都在asset和projectsetting中,其他都是可以用unity打开后自动生成的。所以版本控制只需要这两个文件夹。
project文件夹中存储的数据是: 存放工程设置。包括物理、标签、玩家设置等。换句话说,你在菜单Edit → Project Settings中做过的所有设置都放在这个目录下。
library文件夹中存储的数据是: Unity会把Asset下支持的资源导入成自身识别的格式,以及编译代码成为DLL文件,都放在Library文件夹中。导入过程中会将源资源转换为匹配Unity编辑器中选定的目标平台的格式。导入过程可能会牵涉一些重量级操作,例如纹理压缩。如果每次打开Unity编辑器时都要执行这些操作,那效率就太低了。为了解决这一问题,我们将资源导入的结果缓存在Library文件夹中。具体就是,导入进程的结果将会存储在以资源文件GUID头两位作为名称的文件夹中。这些文件夹位于 Library/metadata/ 目录下。各个不同的对象会被序列化后存储在一个二进制文件中,文件使用资源文件的GUID来命名。
asset即是工程中asset文件夹中的东西。
二。什么是序列化,什么是反序列化。作用是什么。
序列化是将对象转化为流。流分为字节流和字符流。对象转化为流,可以使对象数据在网上传输,和在硬盘读写。unity使用的mono机制几乎实现了所有.net类库,也包含.net的I/O库。filestream,stream,netstream等,都可以将对象流化并传输。反序列化,将字节流或者字符流转化为对象int,float,string等对象。
除了以上作用,在unity中序列化还有一个作用是在inspector中查看。凡是已经序列化的类都可以在inspector中查看。unity关于序列化的四个关键词是:SerializeField HideInInspector NonSerialized Serializable。默认情况下 public 的是序列化的 private等不显示在inspector中的不能序列化,如果要让private序列化就要用到 SerializeField.如果要序列化一个自定义类,就要用到Serialzable.在public class T 类前加关键字Serialzable,后就可以在其他类中引用并序列化了。gameobject加上序列化的脚本后,序列化数据都在gameobject的prefab中。
另一重要作用是游戏数据的序列化。我们要保存游戏进度,或者开始重建关卡都要用到序列化数据。此时如何把对象转化为可保存的数据流就很重要。方法有unity自带的scripsobject.或者转化为json,xml,csv等。这个以后再说。
三。资源和对象的区别。
资源是asset里的纹理,材质,模型等甚至包括脚本。资源都有一个关联的meta文件,此文件给出了资源的guid用于加载唯一定位。如果是纹理还会有纹理的格式信息等。还会有assetbundle信息。(这里会有assetbundle的问题)。资源更改成force text。你用记事本打开资源会看到资源的唯一ID,本地ID。如果是prefab,在文件夹中打开prefab会看到所有序列化的信息,这些信息来自各种组件以及自己写的序列化脚本。不是序列化的数据不会留下。
guid和id虽然保证了资源会被正确加载。但是效率低下。于是产生一个实例ID。unity维护着一个资源对应列表的缓存。如果运行时加载了新的资源,缓存表会记录下来。如果卸载了资源。缓存表会删除记录。产生的问题是,如果显存强行卸载了某个资源,而恰巧程序又卸载了这个资源。这样unity就再也无法再加载这个资源了。导致shader丢失或者网格丢失。
对象是对资源的引用,是运行时的概念。是对资源的实例化。