【Asset和Object的区别】
Unity将Assets文件夹下的文件称为"Asset",翻译成中文的意思是资源,为了便于理解,本文不翻译。一个文件就是一个Asset,我们知道这些文件是存储在硬盘上的。
UnityEngine.Object是Asset的实例,A是B的实例所表示的意思是,将B的数据复制一份得到A,所以经常将实例叫克隆,这和类的实例化的意思差不多,两者区别是Asset的实例是完全复制不修改,类的实例化会修改某些字段的值。Object(的数据)存储在内存上。
【Asset的分类】
可以将Asset分为不同的类型,如纹理、音频、模型、材质、预制体等。不同类型的Asset有不同的格式,也即不同文件的格式不同。
有些文件格式是行业内的标准格式,如音频的mp3、wav格式,纹理的png、jpg格式,文本的txt等。
有些文件格式是Unity自己定义的格式,也即原生格式(native),如材质的mat格式、预制体的prefab格式、场景的unity格式、Meta文件的meta格式、网格的mesh格式等等。
有些文件格式在Unity中不能直接使用,如模型的fbx格式。fbx格式的模型被导入时会被转换成原生格式的。
这些文件格式都是Unity支持的文件格式,也即这些文件都是Unity支持的Asset类型。而Unity原生格式的文件又叫做Native File,其他的文件(其他各种软件导出的文件)又叫做Source File。
【Asset的导入】
Source File需要被导入到Unity中才能被使用,这一操作由AssetImporter完成。
如果我们将一张图片拖到Unity的Project窗口下,表示想将纹理类型的Asset导入到Unity中。Unity会自动将图片导入,我们通常能觉察的现象是打开Windows的资源管理器时,发现多了一个与图片同名的.meta文件,看到这个文件就表示图片已经被导入了。
如果我们直接将图片拖到Windows资源管理器中的文件夹中,这时没有.meta文件,也即这张图片还没有被导入Unity工程中。随后,打开Unity界面,这张图片才会被导入。
对比之下,我们可以知道,Unity的资源导入是自动调用的。Unity会自动扫描Assets文件夹,如果有增删改的情况,就开启调用。如果我们的工程过大,有时候不能自动开启调用,需要我们按快捷键Ctrl+R 手动开启调用。
我们还可以通过AssetImporter API 处理资源导入,每个类型Asset都有对应的Importer。
Assets文件下的文件在导入后会被处理为适用于游戏的内部数据,这些内部数据能被CPU、GPU等硬件更快速处理,其被保存在Library文件夹下,而不会对原来的文件做任何修改。所以,我们会看到Library文件夹的大小只比Assets文件夹小一点。第一次加载工程时,会为所有的文件生成对应的内部数据,所以打开过程会很慢。之后打开工程会读取Library文件夹中的数据,所以打开更快。如果将Library文件夹删除,那么重新打开工程时需要重新加载生成对应的内部数据。因此,Library文件夹在多人协作时不必上传。
【两类特殊的对象】
Asset导入处理的结果是生成Object,有的Asset只能生成一个Object,如纹理Asset;有的Asset可以生成多个Object,如3D模型Asset。我们在Project窗口看到的各种文件都是Object,而不是Asset。选择一个Object,在Inspector窗口下,在"Inspector"处右键选择“Debug”模式,可以看到这个Object的Instance ID。当Asset实例生成Object时,同时会给Object一个Instance ID。
我们在这里看到的对象类型都是Unity内置,有两类特殊的对象:
- ScriptObject 为可以让我们方便的定义自己的数据类型。这些类型可以被Unity本地序列化和反序列化,并可在Inspector窗口中进行操作。我们一般用ScriptObject存储数据。
- MonoBehaviour 我们都很熟悉。其可以挂在GameObject对象下,GameObject对象可以被存储为Prefab对象。需要强调的是.cs文件是一个MonoScript类型的Asset。MonoBehaviour中有一个对MonoScripts的引用,MonoScript里仅包含定位特定脚本类的信息,两者都不包含可执行代码。
【MonoScript】
一个MonoScript含有三个字符串:程序集名称,类名称,命名空间(assembly name, class name, and namespace)
在构建项目时,Unity 将 Assets 文件夹中的所有独立脚本文件编译为 Mono 程序集。Plugins 文件夹外的 C# 脚本放置在 Assembly-CSharp.dll 中,Plugins 文件夹中的脚本放置在 Assembly-CSharp-firstpass.dll 中。
这些程序集以及预构建的程序集DLL文件都包含在最终构建的应用程序中,这些所有程序集被MonoScript引用,他们在应用程序启动的时候被全部加载。因此,脚本资源不能在程序运行时动态加载。
所以我们可以通过MonoScripts找到具有可执行代码的脚本。
因此,AssetBundle\Scene\Prefab文件(对象)中的MonoBehaviour 组件都不包含可执行代码,这样就可以让不同的MonoBehaviour引用特定的共享类,即便这些MonoBehaviour不在同一个AssetBundle中。

384

被折叠的 条评论
为什么被折叠?



