Unity技术 Unity中的特殊目录
Unity技术 Unity中的特殊目录
简介
在项目开发中我们经常会创建很多不同的目录,以进行资源的管理,对于Unity项目中来,Unity规定了一些特殊的目录,其包含有不同的含义,有些与API的使用有关,有些会影响到脚本的编译顺序,本文将重点介绍Unity中的那些特殊的目录,以及脚本的编译顺序
声明
本文中的内容属于个人总结整理而来,个人水平有限,对于部分细节难免有理解错误及遗漏之处,如果您在阅读过程中有所发现,希望您能指正,同时文章中的部分内容也参考了其它大神的文章,如果文章中的内容侵犯了您的权益,表示非常歉意,请您指出,我将尽快修改。
如果您进行转载,请标明出处。
Unity技术 Unity中的特殊目录(http://www.liyubin.com/articles/2019/03/20/1553090549684.html)
Unity引擎中的特殊目录
-
Assets
Assets目录是Unity的主目录,unity中大量的API都是假定所有的内容是位于Assets目录中的
-
Library
由Unity自动生成管理的目录之一,此目录中包含有项目中使用的脚本编译后的DLL,使用的Unity的DLL,Package中代码相关,以及资源的唯一标识及处理结果等等,此目录完全由Unity在导入项目时生成,大多数情况下是不需要对此目录进行版本管理。
-
Logs
简易的日志目录,并非Unity运行时的日志目录,对于项目中的日志位于C:\User\XXXX\AppData\Local\Unity\Editor\*.log
-
Packages
PackageManager的配置文件目录
-
ProjectSettings
项目的配置基本上都存储于些目录中,此目录中的配置多数以.asset结尾,如果项目指定的Asset Serialization为Force Text的话,可以直接文本编辑器查看内容
-
Temp
Unity加载项目后生成的临时目录,项目关闭后,此目录也将会被删除。
-
Editor
项目开发中常用到的目录之一,此目录中的脚本将被视为编辑器脚本而不是运行时脚本,可以使用这些脚本在开发期制作各种各样的工具。Editor目录可以在Assets目录及子目录的任意位置,可以有任意多个
Editor目录中的脚本会对脚本的编译顺序有一定的影响。
Unity是不允许GameObject使用位置Editor中的MonoBehaviour脚本的
-
Editor Default Resources
Editor Default Resources目录用于编辑器的开发中,如果想要在编辑器脚本使用EditorGUIUtility.Load函数加载资源的话,只能将资源放于此目录中。此目录只能存在一个,并且位于项目根目录的Assets目录之下。
-
Gizmos
项目开发中经常会使得Gizmos进行一些辅助或者工具性的绘制,比如使用Gizmos.DrawIcon在场景中放置一个图标,充当特殊物体或者位置的标记。则需要绘制的图片资源必须放于名称Gizmos的目录中,Gizmos目录只能位于项目根目录Assets目录之下,只能有一个。
-
Plugins
Plugins目录只能位于Assets目录根之下,只能存在一个目录,一般情况下Plugins多用于放置扩展的DLL(多数情况下是由C/C++编写的),可以放置第三方代码,同时此目录的插件多与平台有关,也会影响脚本的编译顺序。
-
Resources
Resources是Unity项目最常使用的目录之一,对于放到Resources目录中的资源可以使用Resource.Load加载。Resources目录可以在Assets目录及子目录的任意位置,可以有任意多个,进行资源加载时使用的是相对于Resources目录的路径。
如果Resources目录是Editor目录的子目录,则其中的资源可以在Editor脚本中加载,但是不会构建到最终的发布版本中
-
Standard Assets
当导入Unity提供的Standard Asset Package时,会创建Standard Assets目录,此目录中的脚本对编译顺序是有一定的影响的。对于此目录只能位置项目的Assets的目录下,有且仅有一个此名称的目录
-
StreamingAssets
StreamingAssets目录只能位于项目的Assets目录的根目录下,整个项目中有且只能有一个此名称的目录。对于项目开发中某些资源不希望Unity处理,需要保持原来的文件格式的话(比如说视频类的文件,希望以视频流的形式播放时),只要将资源放置于此目录或者其子目录中即可。对于此目录中的资源只能使用特定的加载方式加载
在各个平台上需要得到StreamingAssets所在的目录可以使用Application.stramingAssetsPath,此目录在不同的平台下指向不同的目录,
-
Win/Mac
-
iOS
-
Android
path = "jar:file://"+Application.dataPath+"!/assets/";
在Android平台上文件包含在压缩的.jar文件中(其格式也zip基本相同),如果不使用WWW类进行资源的读取的话,需要使用其它的Jar存档工具来获得此文件
PS:如果.dll文件位于此目录中将不编译
-
-
Hidden Assets
Unity在导入资源时会忽略Assets目录及子目录下的一些资源,其忽略规则为:
- 隐藏目录
- 以"."开头的文件或者目录
- 以"~"开头的文件或者目录
- 命名为cvs的文件或者目录
- 以".tmp"为后缀的文件
特殊目录对脚本编译顺序影响
Unity根据脚本所在的目录不同,编译脚本由四个独立的阶段构成,Unity会为每个阶段单独的创建CS项目文件(.csproj)和预定义的程序集,如果没有符合对应编译阶段的脚本,则Unity将直接跳过。
当脚本引用不同编译阶段的类时,这些脚本的编译顺序就非常重要了,基本的规则是当前编译阶段是无法使用之后编译阶段中的内容的,早于当前阶段的内容完全可以使用。
Phase | Assembly Name | Script Files |
---|---|---|
1 | Assembly-CSharp-firstpass | 位于Standard Assets、Plugins目录中脚本 |
2 | Assembly-CSharp-Editor-firstpass | 位于Standard Assets、Plugins目录中的子目录Editor中脚本 |
3 | Assembly-CSharp | 其它非Editor目录中的脚本 |
4 | Assembly-CSharp-Editor | 其它在Editor目录中的脚本 |
PS:也可以自己定义程序集来组织项目中的脚本。