在 Unity 工程中,有一些特殊的目录和脚本编译规则,这些规则决定了脚本的编译顺序、作用范围以及在编辑器和运行时的可用性。了解这些规则有助于开发者更好地组织代码和优化编译时间。以下是 Unity 工程中的一些特殊目录和脚本编译规则:
特殊目录
-
Editor
- 位置:可以在
Assets目录下的任何位置创建Editor文件夹。 - 作用:包含的脚本仅在 Unity 编辑器中编译和运行,不能在构建的游戏中运行。通常用于编辑器扩展、工具和自定义窗口。
- 示例:
Assets/Editor/MyEditorScript.cs
- 位置:可以在
-
Plugins
- 位置:可以在
Assets目录下的任何位置创建Plugins文件夹。 - 作用:包含的脚本会在早期编译阶段编译,通常用于第三方插件和库。这些脚本可以被其他脚本引用。
- 示例:
Assets/Plugins/MyPluginScript.cs
- 位置:可以在
-
Standard Assets 和 Pro Standard Assets
- 位置:可以在
Assets目录下的任何位置创建Standard Assets或Pro Standard Assets文件夹。 - 作用:包含的脚本会在中期编译阶段编译,通常用于标准资源包和共享代码。这些脚本可以被其他脚本引用。
- 示例:
Assets/Standard Assets/MyStandardScript.cs
- 位置:可以在
-
Resources
- 位置:可以在
Assets目录下的任何位置创建Resources文件夹。 - 作用:包含的资源可以在运行时通过
Resources.Load方法动态加载。注意,Resources文件夹中的所有资源都会被包含在构建中,因此应谨慎使用。 - 示例:
Assets/Resources/MyResource.asset
- 位置:可以在
-
StreamingAssets
- 位置:可以在
Assets目录下的任何位置创建StreamingAssets文件夹。 - 作用:包含的资源会原样打包到构建中,适用于需要在运行时直接访问的文件(如视频、音频等)。在运行时可以通过文件系统路径访问这些资源。
- 示例:
Assets/StreamingAssets/MyVideo.mp4
- 位置:可以在
-
Gizmos
- 位置:可以在
Assets目录下的任何位置创建Gizmos文件夹。 - 作用:包含的图像文件可以在编辑器中用于绘制自定义的 Gizmos(调试图形)。
- 示例:
Assets/Gizmos/MyGizmoIcon.png
- 位置:可以在
-
Editor Default Resources
- 位置:可以在
Assets目录下的任何位置创建Editor Default Resources文件夹。 - 作用:包含的资源可以在编辑器脚本中通过
EditorGUIUtility.Load方法加载。仅在编辑器中使用。 - 示例:
Assets/Editor Default Resources/MyEditorResource.asset
- 位置:可以在
-
WebGLTemplates
- 位置:可以在
Assets目录下的任何位置创建WebGLTemplates文件夹。 - 作用:包含的文件用于自定义 WebGL 构建的模板。
- 示例:
Assets/WebGLTemplates/MyTemplate/index.html
- 位置:可以在
脚本编译规则
Unity 的脚本编译过程分为多个阶段,不同阶段的脚本会被编译到不同的程序集(Assembly)中。以下是编译阶段和规则:
-
第一阶段:Editor 编译阶段
- 文件夹:
Editor - 描述:所有放在
Editor文件夹中的脚本会在第一阶段编译。这些脚本只能在 Unity 编辑器中运行,不能在构建的游戏中运行。 - 示例:
Assets/Editor/MyEditorScript.cs
- 文件夹:
-
第二阶段:第一批运行时编译阶段
- 文件夹:
Plugins - 描述:所有放在
Plugins文件夹中的脚本会在第二阶段编译。这些脚本会被编译到一个单独的程序集,可以被其他脚本引用。通常用于第三方插件和库。 - 示例:
Assets/Plugins/MyPluginScript.cs
- 文件夹:
-
第三阶段:第二批运行时编译阶段
- 文件夹:
Standard Assets、Pro Standard Assets - 描述:所有放在
Standard Assets和Pro Standard Assets文件夹中的脚本会在第三阶段编译。这些脚本会被编译到一个单独的程序集,可以被其他脚本引用。通常用于标准资源包和共享代码。 - 示例:
Assets/Standard Assets/MyStandardScript.cs
- 文件夹:
-
第四阶段:最终运行时编译阶段
- 文件夹:
Assets(除上述特定文件夹外的其他文件夹) - 描述:所有放在
Assets文件夹中的其他脚本(不在上述特定文件夹中的脚本)会在第四阶段编译。这些脚本会被编译到默认的程序集,通常用于项目的主要代码。 - 示例:
Assets/Scripts/MyGameScript.cs
- 文件夹:
编译顺序和依赖关系
- Editor 文件夹中的脚本最先编译,因为它们通常包含编辑器扩展和工具,这些工具可能会在其他脚本编译之前运行。
- Plugins 文件夹中的脚本接下来编译,因为它们通常包含第三方插件和库,这些库可能会被项目中的其他脚本引用。
- Standard Assets 和 Pro Standard Assets 文件夹中的脚本在第三阶段编译,因为它们通常包含标准资源和共享代码,这些代码可能会被项目中的其他脚本引用。
- 最后,Assets 文件夹中的其他脚本在第四阶段编译,因为它们通常包含项目的主要代码。
额外注意事项
-
Assembly Definition Files(.asmdef)
- 作用:通过使用 Assembly Definition 文件,可以更精细地控制脚本的编译过程和依赖关系。可以创建自定义程序集,减少不必要的重新编译。
- 示例:在
Assets/Scripts文件夹中创建一个MyGameAssembly.asmdef文件,将该文件夹中的脚本编译到一个单独的程序集。
-
预处理指令
- 作用:使用预处理指令(如
#if UNITY_EDITOR)可以控制代码在不同平台和编译阶段的可见性。 - 示例:
#if UNITY_EDITOR using UnityEditor; #endif public class MyScript : MonoBehaviour { void Start() { #if UNITY_EDITOR Debug.Log("This code runs only in the editor."); #endif } }
- 作用:使用预处理指令(如
-
编译条件
- 作用:可以在
Player Settings中设置编译条件(如Scripting Define Symbols),以控制代码的编译行为。 - 示例:在
Player Settings中添加MY_CUSTOM_DEFINE,然后在代码中使用:#if MY_CUSTOM_DEFINE Debug.Log("This code runs only when MY_CUSTOM_DEFINE is set."); #endif
- 作用:可以在
-
脚本执行顺序
- 作用:可以在
Project Settings > Script Execution Order中设置脚本的执行顺序,确保某些脚本在其他脚本之前或之后执行。 - 示例:将
MyInitializationScript设置为在默认时间之前执行,以确保它在其他脚本之前初始化。
- 作用:可以在
通过了解和利用这些特殊目录和编译规则,开发者可以更好地组织代码,优化编译时间,并确保代码在不同平台和编译阶段的正确性。
编译顺序
在 Unity 中,脚本的编译过程是按照特定的阶段顺序进行的,这个顺序是由 Unity 内部机制决定的,通常情况下是不能随意打乱的。
为什么不能随意打乱编译顺序
依赖关系:编译顺序确保了依赖关系的正确性。例如,Plugins 文件夹中的脚本可能会被 Standard Assets 文件夹中的脚本引用,因此 Plugins 文件夹中的脚本需要先编译。
编译优化:Unity 的编译顺序设计是为了优化编译时间和性能。打乱顺序可能会导致不必要的重新编译,增加编译时间。
编辑器扩展:Editor 文件夹中的脚本需要最先编译,因为它们通常包含编辑器扩展和工具,这些工具可能会在其他脚本编译之前运行。
1184

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



