最新文章
泰课在线 | 微信拼团成功后如何获取课程?
08-09 17:57
Unity教程 | 使用ARKit为iOS开发AR应用
07-31 17:23
Unity Pro专业版7折订阅四选一工具包之VR开发与艺术设计
07-28 11:47
网友使用虚幻UE4实现CAVE 多通道立体渲染的沉浸式环境
07-27 11:57
VR晕动症调查:未来5年内大部分VR晕动症将得到解决
07-27 11:26
AMD CEO:未来3-5年最重要 希望5年达1亿VR用户
07-27 10:44
Unity默认目录(中英文对照)
隐藏文件夹(Hidden Folders)
以 “.” 开头的文件夹(例如:“.UnitTests/”、“.svn/” )会被 Unity 忽略。这些文件夹中的任何资源都不会被导入,脚本也不会被编译,并且不会在 Project 视图中显示。
标准资源文件夹(Standard Assets)
该文件夹中的脚本总是最先被编译。根据脚本语言的不同,这些脚本会被输出到 Assembly-CSharp-firstpass、Assembly-UnityScript-firstpass 或 Assembly-Boo-firstpass 项目中。具体可参考 Script Compile Order Folders。
Standard Assets 文件夹内的脚本会比其他脚本更早编译。因此,将脚本放置在该文件夹中,C# 脚本就能访问 .js 脚本,反之亦然。
Pro 标准资源文件夹(Pro Standard Assets)
此文件夹与 Standard Assets 类似,但其内部文件专为 Unity 的 Pro 版本设计。这意味着这里的资源会利用仅 Pro 版本支持的特性,如渲染纹理和屏幕空间效果。
同样,该文件夹中的脚本会更早编译,使得 Pro Standard Assets 文件夹外部的其他脚本(任何语言)都能访问它们。
编辑器文件夹(Editor)
以 Editor 命名的文件夹具有特殊用途,它允许其中的脚本访问 Unity Editor 的脚本 API。如果脚本使用了 UnityEditor 命名空间中的任何类或功能,则必须将其放置在名为 Editor 的文件夹中。
Editor 文件夹中的脚本不会包含在游戏构建中,它们仅在 Unity Editor 中使用。在项目中可以存在多个 Editor 文件夹。
需要注意的是,如果 Editor 文件夹不在其他特殊文件夹内,它可以位于项目目录的任意层级;但如果它位于 “Standard Assets”、“Pro Standard Assets” 或 “Plugins” 文件夹内,则必须是这些文件夹的直接子文件夹,否则将不会被处理。例如,“My Extension/Scripts/Editor” 是可行的路径;但如果放在特殊文件夹中,路径必须是 “Standard Assets/Editor/My Extension/Scripts”、“Pro Standard Assets/Editor/My Extension/Scripts” 或 “Plugins/Editor/My Extension/Scripts”。
插件文件夹(Plugins)
“Plugins” 文件夹用于存放任何希望脚本能够访问的原生插件,这些插件会自动包含在游戏构建中。需要注意的是,该文件夹必须是顶级 Assets 文件夹的直接子文件夹。
在 Windows 系统中,原生插件以 .dll 文件形式存在;在 Mac OS X 系统中,是 .bundle 文件;在 Linux 系统中,则是 .so 文件。
与 Standard Assets 文件夹类似,Plugins 文件夹中的脚本会更早编译,允许外部的其他脚本(任何语言)访问它们。
Plugins/x86
如果为 32 位或通用(32 位和 64 位)平台构建游戏,且该子文件夹存在,其中的任何原生插件文件都会自动包含在游戏构建中。若该文件夹不存在,Unity 会在其父级 Plugins 文件夹中查找原生插件。
Plugins/x86_64
如果为 64 位或通用(32 位和 64 位)平台构建游戏,且该子文件夹存在,其中的任何原生插件文件都会自动包含在游戏构建中。若该文件夹不存在,Unity 会在其父级 Plugins 文件夹中查找原生插件。
如果要进行通用构建,建议同时创建 x86 和 x86_64 子文件夹,并将 32 位和 64 位版本的原生插件分别放置在相应的子文件夹中。
Plugins/Android
在此文件夹中放置希望包含在 Android 项目中的任何 Java .jar 文件,用于基于 Java 的插件。若使用基于 Android NDK 的插件,.so 文件也会被包含进来。具体可参考 Plugins For Android。
Plugins/iOS
这是一种有限且简单的方法,可自动将任何 .a、.m、.mm、.c 或 .cpp 文件作为符号链接添加到生成的 Xcode 项目中。具体可参考 Plugins For iOS。
如果需要更多控制如何自动将文件添加到 Xcode 项目,应使用 PostprocessBuildPlayer 特性,这样就无需将这些文件放置在 Plugins/iOS 文件夹中。具体可参考 Build Player Pipeline。
资源文件夹(Resources)
Resources 文件夹是一个特殊文件夹,允许在脚本中通过文件路径和名称访问资源,而不是使用通常推荐的直接引用方式(在脚本中作为变量,通过在 Unity Editor 中进行拖放操作)。
因此,使用该文件夹时需谨慎。放置在 Resources 文件夹中的所有资源都会包含在游戏构建中(即使最终未被使用),因为通过脚本使用这些资源时,Unity 无法确定哪些基于 Resources 的资源被使用,哪些未被使用。
项目中可以存在多个 Resources 文件夹,因此不建议在不同的 Resources 文件夹中放置同名资源。
游戏构建完成后,所有 Resources 文件夹中的资源都会打包到游戏的资源存档中。这意味着在最终构建中,Resources 文件夹在技术上已不存在,尽管代码仍可通过项目中的路径访问这些资源。具体可参考 Loading Resources at Runtime。
需要注意的是,当资源作为 MonoBehaviour 脚本的变量被访问时,这些资源会在该 MonoBehaviour 脚本实例化时(即其游戏对象或预制体出现在场景中)加载到内存中。如果资源过大,可能不希望以这种方式加载。此时,可以将这些大资源放置在 Resources 文件夹中,通过 Resources.Load 方法加载。不再使用这些资源时,可以调用 Object.Destroy 方法销毁对象,然后调用 Resources.UnloadUnusedAssets 方法释放内存。
另外,Resources 文件夹可以位于根目录或子目录中,只要名称为 Resources 即可。例如,“/xxx/xxx/Resources” 和 “/Resources” 是等效的,项目中可以存在任意数量的 Resources 文件夹。Resources 文件夹中的资源无论是否使用,都会打包到 .apk 或 .ipa 文件中。
资源加载方法说明
- Resource.Load:在编辑时和运行时都可以通过该方法直接读取资源。
- AssetDatabase.LoadAssetAtPath():该方法可以读取 Assets 目录下任意文件夹中的资源,但只能在编辑时使用。其路径格式必须为 “Assets/xx/xx.xxx”,并且要包含文件的后缀名。
在电脑上开发时,建议尽量使用 Resource.Load() 或 Resources.LoadAssetAtPath() 方法。如果在手机上需要将一部分资源打包成 assetbundle,另一部分资源使用 Resource.Load() 加载,可以在自动化打包脚本中,在打包前使用 AssetDatabase.MoveAsset() 方法将已打包成 assetbundle 的原始文件从 Resources 文件夹中移出,打包完成后再移回,这样可以避免最终运行包中包含多余的文件。
编辑器默认资源文件夹(Editor Default Resources)
该文件夹的功能类似于 Resources 文件夹,但仅用于编辑器脚本。如果编辑器插件需要加载资源(如图标、GUI 皮肤等),同时确保这些资源不会包含在用户的游戏构建中,可使用此文件夹(若将这些文件放在普通的 Resources 文件夹中,构建游戏时这些资源会包含在内)。
由于编辑器脚本不是 MonoBehaviour 脚本,无法使用常规的资源访问方式(如通过 Inspector 进行拖放操作),“Editor Default Resources” 提供了一种便捷的解决方案。
要访问 “Editor Default Resources” 文件夹中的资源,需要使用 EditorGUIUtility.Load 方法。与 Resources.Load 不同的是,EditorGUIUtility.Load 方法需要指定要加载资源的文件名扩展名。例如,应使用 “myPlugin/mySkin.guiskin” 而不是 “myPlugin/mySkin”。
要释放 EditorGUIUtility.Load 占用的内存,可以调用 Object.Destroy 方法销毁对象,然后调用 EditorUtility.UnloadUnusedAssets 方法。
据了解,项目中只能存在一个 “Editor Default Resources” 文件夹,且必须是顶级 Assets 文件夹的直接子文件夹。
示例代码:
TextAsset text = EditorGUIUtility.Load("test.txt") as TextAsset;
Debug.Log(text.text);
小工具文件夹(Gizmos)
Gizmos 文件夹用于存放供 Gizmos.DrawIcon 方法使用的纹理或图标资源。放置在该文件夹中的纹理资源可以通过名称调用,并在编辑器中作为小工具绘制在屏幕上。
Web 播放器模板文件夹(WebPlayerTemplates)
该文件夹用于替换 Web 构建时使用的默认网页。此文件夹中的脚本不会被编译,并且必须是顶级 Assets 文件夹的直接子文件夹。
流式资源文件夹(StreamingAssets)
该文件夹中的文件会原样复制到构建文件夹中,不会进行任何修改(移动和网页版除外,这些文件会嵌入到最终构建文件中)。这些文件的路径因平台而异,但可以通过 Application.streamingAssetsPath 方法访问。具体可参考 Streaming Assets。
不同平台下该文件夹的位置和访问方式如下:
- 桌面计算机(Mac OS 或 Windows):
path = Application.dataPath + "/StreamingAssets"; - iOS:
path = Application.dataPath + "/Raw"; - Android:
path = "jar:file://" + Application.dataPath + "!/assets/";
需要注意的是,该文件夹中的资源也会打包到 .apk 或 .ipa 文件中。与 Resources 文件夹不同的是,Resources 文件夹会压缩文件,而 StreamingAssets 文件夹中的文件会原封不动地打包,并且该文件夹是只读的,程序运行时只能读取不能写入。其在不同平台下的路径不同,但可以使用 Application.streamingAssetsPath 方法根据当前平台选择对应的路径。
由于 Application.persistentDataPath 目录是应用程序的沙盒目录,在打包之前该目录并不存在,直到应用程序在手机上安装完成后才会创建。
另外,StreamingAssets 目录下的资源不会压缩,因此会占用较大空间。例如,应用程序安装在手机上占用 100M 容量,若在 StreamingAssets 文件夹中放置一个 100M 的 assetbundle 文件,安装后手机上的应用程序将占用 200M 容量。