UP | HOME

Special Folders

Table of Contents

这是一篇译文,原文地址:
(1) https://docs.unity3d.com/Manual/SpecialFolders.html
(2) https://docs.unity3d.com/Manual/ScriptCompileOrderFolders.html
(3) https://docs.unity3d.com/Manual/StreamingAssets.html

<!– more –>

Special folder names

在大多数情况下你可以为你创建的文件夹选择任何你喜欢的名称来组织你的项目。然而,有一些文件夹名称会被 Unity 解析为一种指示,这些文件中的内容应该以特殊的方式被对待。例如,编辑器脚本必须放置在名为“Editor”的文件夹中从而才能正常工作。Unity 所使用的特殊的文件夹名称列表在下面给出。

Assets

Assets 文件夹是主文件夹,其包含了可以被 Unity 项目使用的资源。项目视图中的内容直接和 Assets 文件夹下的内容对应。大多数 API 函数假定一切懂在 Assets 文件夹中,所以他们不需要显示地提及。然而,一些函数则需要 Assets 目录作为 pathname 的一部分被包含(例如,AssetDatabase 类中的特定函数)

Editor

Editor 目录(或者其子目录)下的所有脚本都被当作编辑器脚本而不是运行时脚本。在开发过程中,这些脚本被设计出来为 Unity 本身添加功能,而在最终完成的游戏中是不可用的。在项目中可以使用多个 Editor 文件夹,但是需要注意的是,给定 Editor 文件夹的确切位置会影响其中脚本相对于其他脚本的编译时机。在文档 No description for this link 中对此有详细描述。
注意:Unity 将不允许从 MonoBehaviour 派生的组件被赋予 GameObjects,如果该脚本在 Editor 文件夹中。

Editor default resources

编辑器脚本可以在使用资源文件时,用 EditorGUIUtility.Load 函数来按需加载。这个函数将会在一个名为 Editor Default Resources 的文件夹中查找资源文件。Editor Default Resources 文件夹应该被直接放在 Assets 文件夹中。

Gizmos

Unity 的 Gizmos 允许你加图形到场景视图中来帮助可视化设计,否则其将是不可见的(例如,灯光图标、摄像机图标等)。Gizmos.DrawIcon 函数会将一个图标放置到场景中来表示一个特殊对象或位置的标记。画这个图标使用的图片文件必须放置在一个叫做 Gizmos 的文件夹中,为了让 DrawIcon 函数可以定位。

~该目录可以不放在 Assets 目录下。~

Plugins

Unity 允许你添加插件到项目来扩充可使用的特性。插件通常是用 C/C++写的本机 DLLs。他们可以访问第三方代码库,系统调用以及其他的在 Unity 中没有提供的东西。Plugins 必须被放在一个叫做 Plugins 的目录下,这样才能被 Unity 检测到,并且就像 Editor 文件夹,这影响了其中脚本的编译。在文档 No description for this link 中对此有详细描述。在文档 Plugin Inspector 中包含了关于插件的平台控制。

Resources

通常,你在场景中创建资源的实例用于在游戏中使用,但是 Unity 也支持让你在需要的时候通过脚本来加载资源。为了这样做需要将资源放在 Resources 或其子目录下(你可以有任何数量的 Resources 文件夹并且可以放在项目的任何地方)。这些资源就可以通过 Resources.Load 函数来加载了。

Standard Assets

当你导入一个标准资源包(Menu:Assets->Import Package)时,资源会被放置在一个叫做“Standard Assets”的目录下。除了包含这些资源,这些文件夹也会对脚本编译顺序造成影响;在文档 Special Folders and Script Compilation Order 中对此有详细描述。

StreamingAssets

大多数游戏资源都会直接合并到内置 player 中,但是有些情况下,你希望资源可以是原始格式的一个分离的文件。例如,在 iOS 上播放一个视频,你必须从文件系统访问视频文件,而不是将它当作一个 MovieTexture 来使用。如果你将一个文件放到名称为 StreamingAssets 的文件夹中,它将被原样复制到目标机器,在那儿可以从一个特定的文件夹访问。在文档 Streaming Assets 中有进一步说明。

Hidden Assets

在导入处理过程中 Unity 完全忽略 Assets 文件夹(或其子目录)中的下列文件和文件夹:

  • 以 ‘.’ 开始的文件和文件夹
  • 以 ‘~’ 结尾的文件和文件夹
  • 名为 ‘cvs’ 的文件和文件夹
  • 包含 ‘tmp’ 后缀的文件和文件

这是为了防止导入特定的由操作系统创建的或其他应用创建的临时文件

Special Folders and Script Compilation Order


在大多数情况下你可以为你项目中的文件夹选择任何你喜欢的名称,但是 Unity 保留了一些文件夹名称来指示其内容有特殊目的。这些文件夹中的一些会对脚本的编译有影响。从本质上讲,脚本的编译一共有 4 个分开的阶段,脚本将在那个阶段被编译是由它的父文件夹所决定的。

这在一个脚本必须引用其他脚本定义的类的情况下很显著。基本的规则是任何当前不能被引用的将在随后的阶段被编译。任何在当前阶段或更早阶段编译的是完全可用的。

另一种情况发生在,当使用一种语言写的脚本必须引用使用另一种语言写的类时(例如,一个 UnityScript 文件声明了一个 C#脚本定义的类的变量)。这里的规则是被引用的类必须在更早的阶段被编译。

编译的所有阶段如下:

  • 阶段 1: Standard Assets/Pro Standard Assets/Plugins 文件夹下的运行时脚本被编译
  • 阶段 2: 在顶层文件夹 Standard Assets/Pro Standard Assets/Plugins 下的 Editor 文件夹中的编辑器脚本被编译
  • 阶段 3: 所有不在 Editor 文件夹下的脚本被编译
  • 阶段 4: 所有剩余的脚本(例如,在 Editor 文件夹下的脚本)被编译

一个常见的例子是 UnityScript 文件需要引用一个定义在 C#文件中的类。你可以通过下面方法到底这个目的,将 C#文件放置到 Plugins 文件夹中并且将 UnityScript 放置在一个非特殊的文件夹中。如果你不这么做,你讲会获得一个错误,提示 C#类不能被找到.

Note:
Standard Assets 文件夹只在 Assets 根目录下才可用。

Streaming Assets


大多数游戏资源都会直接合并到项目当其被构建的时候。然而,有时候将文件放到目标机器的普通的文件系统上从而可以通过路径名来访问它将非常有用。这种情况的一个例子是部署一个视频文件到 iOS 设备上。通过 PlayMovie 函数播放的原始视频文件必须可以在文件系统的一个地方可用。

任何被放到 Unity 项目中 StreamingAssets(大小写敏感)文件夹下的文件将被一字不差地复制到目标机器。你可以使用 Application.streamingAssetsPath 属性来获取该文件夹。最好是通过 Application.streamingAssetsPath 来获取 SteamingAssets 文件夹,因为它将总是指向应用程序运行平台上的正确路径。

在每个平台上该文件夹的路径都是不同的。请注意这些路径都是大小写敏感的:

  • 在桌面电脑(Mac OS 或 Windows)上文件的路径可以通过下面的代码来获取
 path = Application.dataPath + "/StreamingAssets";
  • 在 iOS 平台上使用
 path = Application.dataPath + "/Raw";
  • 在 Android 平台上使用
 path = "jar:file://" + Application.dataPath + "!/assets/";

在 Android 平台上,文件都被包含在一个.jar 压缩文件中(该文件本质上讲和标准的 zip 压缩文件格式相同)。这意味着如果你不使用 Unity 的 WWW 类来获取文件,你需要额外的软件来查看.jar 文档的内部并获取这个文件。

注意:

  1. StreamingAssets 文件夹下的.dll 文件不参与编译。
  2. 文件夹名称为“StreamingAssets”中间没有空格。