木匣子

Web/Game/Programming/Life etc.

Unity3d 项目结构分析

Unity3d 在项目结构上,对特定的目录名赋予了不同的作用。本文作一些简单的记录。

Special Folders

Assets/

对应 Application.dataPath

放置在这个目录下的文件将显示在 Unity Editor 的 Project View 下面(隐藏文件及 meta 文件除外)。

Assets/**/Editor/

放在这(些)个目录下的脚本,只有在 Unity Editor 下会被启用,而不会被编译到最终的游戏中。但有些例外(见 Assets/Plugins)。

Assets/Plugins/

该目录放置一些跨平台的第三方 SDK 的项目资源,如 ulua,微信 SDK、友盟 SDK 等,通常是一些静态库。在打包项目的时候,会根据不同平台将该目录下的资源一起复制到应用的 Libraries 目录下。

Assets/Plugins/Editor/

* 特别需要注意的是:在 Assets/Plugins 中的 Editor 目录,除了 Assets/Plugins/Editor 不会被编译到游戏中以外,其它的 Assets/Plugins/**/Editor 不会被过滤。

Assets/Plugins 并不适合放 Unity 脚本,不要把它当作第三方脚本的目录,因为这些第三方脚本常常会带有 Editor 子目录,这会导致编译的时候由于引用了 UnityEditor 命名空间而报错。

如果一些第三方 SDK 带有 Editor 脚本,正确的位置应该是放在 Assets/Plugins/Editor 下。

Unity3d 5.X 之后,动态链接库形式的插件可以放在任意文件夹,并通过 Inspector 来指定平台。

Assets/StreamingAssets/

对应 Application.streamingAssetsPath

放在该目录下的所有文件,在打包的时候会被复制到游戏应用的特定目录下。如果要处理跨平台游戏,这里应该保持干净,只放一些共有文件。其它的文件可以通过 PostProcessBuild 编写代码根据不同平台复制文件到上述目录。

*/Resources/

放在这(些)个目录下的文件即使没有在场景中引用,也会被归档到 resources.assets 以及 sharedassets*.assets 里面。

这也是最常被误用的文件夹名称,然而值得庆幸的是并不是所有文件都会被归档,只有 Unity3d 常用的格式——像是声音、贴图、材质等,如果是其它文件需要满足这些扩展名才能被归档,如二进制文件可以命名为 *.bytes,以上这些格式将以 TextAsset 类型加载。

多个 Resources 文件夹可以并存于项目中,其中的资源通过 Resources.Load(path) 加载,(path 是相对于 Resources 的路径,不带扩展名),在 Unity Editor 中测试时,Unity 将在所有 Resources 文件夹检索这个资源,打包后则是在 *.assets 文件里检索。

Temp/

对应 Application.temporaryCachePath

比较少被注意到的文件夹,用于存放一些临时文件。在 Editor 脚本需要产生临时文件或中间文件的时候,可以放在这里。

另外可以使用 FileUtil.GetUniqueTempPathInProject() 获得一个可写的临时文件路径,也是放在这个目录下。

Application.persistentDataPath

这个目录指向游戏应用的可读写目录,通常游戏的存档或者热更包都在这里。并且里面的文件不会随着 APP 升级而丢失,除非是手动卸载游戏。

参考资料

Unity Manual: Special Folder Names
Unity Wiki: Special Folder Names in your Assets Folder
Unity Manual: Loading Resources at Runtime