Unity3D :条件编译
推荐:将NSDT场景编辑器加入你的3D工具链
3D工具集:NSDT简石数字孪生
条件编译
Unity 对 C# 语言的支持包括指令的使用,这些指令允许您根据是否定义某些脚本符号有选择地在编译中包含或排除代码。
您可以在 Microsoft C# 预处理器指令页上更广泛地了解这些指令在 C# 中的工作方式。
Unity 具有一系列内置脚本符号,这些符号表示可在脚本中用于有选择地在编译中包含或排除部分代码的选项。
例如,在为 Windows 独立平台构建播放器时设置的内置脚本符号为 。您可以使用特殊类型的 if 语句检查此符号是否定义,如下所示:UNITY_STANDALONE_WIN
#if UNITY_STANDALONE_WIN
Debug.Log("Standalone Windows");
#endif
和前面的哈希 () 字符表示这些语句是“指令”,在编译过程中处理,而不是在运行时处理。#ifendif
因此,在上面的示例中,调试行仅包含在项目的 Windows 独立版本中进行编译。在编辑器或其他目标版本中编译时,将完全省略它。这与使用常规结构不同,后者只会在运行时绕过代码的某些部分的执行。有关完整示例,请参见下文。if .. then .. else
有许多内置脚本符号,允许您根据所选平台、编辑器版本和其他杂项系统环境方案有选择地编译或省略代码。下面列出了这些内置脚本符号。
此外,您可以使用编辑器 UI、脚本或通过资产文件定义自己的脚本符号,这允许您根据任意定义控制部分代码的编译。有关详细信息,请参阅自定义脚本符号。
注意:脚本符号有时称为“定义符号”、“预处理器定义”或简称为“定义”。
平台脚本符号
Unity 根据创作和构建目标平台自动定义某些脚本符号。具体如下:
定义 | 功能 |
---|---|
UNITY_EDITOR | 用于从游戏代码调用 Unity 编辑器脚本的脚本符号。 |
UNITY_EDITOR_WIN | Windows 上编辑器代码的脚本符号。 |
UNITY_EDITOR_OSX | Mac OS X 上编辑器代码的脚本符号。 |
UNITY_EDITOR_LINUX | Linux 上编辑器代码的脚本符号。 |
UNITY_STANDALONE_OSX | 用于编译或执行专门针对 Mac OS X(包括通用、PPC 和英特尔架构)的代码的脚本符号。 |
UNITY_STANDALONE_WIN | 用于编译/执行专门针对 Windows 独立应用程序的代码的脚本符号。 |
UNITY_STANDALONE_LINUX | 用于编译/执行专门针对 Linux 独立应用程序的代码的脚本符号。 |
UNITY_STANDALONE | 用于为任何独立平台(Mac OS X、Windows 或 Linux)编译/执行代码的脚本符号。 |
UNITY_WII | 用于编译/执行Wii控制台代码的脚本符号。 |
UNITY_IOS | 用于编译/执行 iOS 平台代码的脚本符号。 |
UNITY_IPHONE | 已弃用。 改用 UNITY_IOS。 |
UNITY_ANDROID | Android 平台的脚本符号。 |
UNITY_LUMIN | Magic Leap OS 平台的脚本符号。您也可以使用PLATFORM_LUMIN。 |
UNITY_TIZEN | Tizen 平台的脚本符号。 |
UNITY_TVOS | Apple TV 平台的脚本符号。 |
UNITY_WSA | 通用 Windows 平台的脚本符号。此外,NETFX_CORE是在针对 .NET Core 编译 C# 文件并使用 .NET 脚本后端时定义的。 |
UNITY_WSA_10_0 | 通用 Windows 平台的脚本符号。此外,WINDOWS_UWP是在针对 .NET Core 编译 C# 文件时定义的。 |
UNITY_WEBGL | WebGL 的脚本符号。 |
UNITY_FACEBOOK | Facebook 平台的脚本符号(WebGL 或 Windows 独立)。 |
UNITY_ANALYTICS | 用于从游戏代码调用 Unity 分析方法的脚本符号。版本 5.2 及更高版本。 |
UNITY_ASSERTIONS | 断言控制过程的脚本符号。 |
UNITY_64 | 64 位平台的脚本符号。 |
编辑器版本 脚本符号
Unity 会根据您当前使用的编辑器版本自动定义某些脚本符号。
给定版本号 X.Y.Z(例如 2019.4.14),Unity 会以以下格式公开三个全局脚本符号:UNITY_X、UNITY_X_Y 和 UNITY_X_Y_Z。
以下是 Unity 2019.4.14 中公开的脚本符号示例:
定义 | 功能 |
---|---|
UNITY_2019 | Unity 2019 发布版本的脚本符号,在每个 2019.Y.Z 版本中公开。 |
UNITY_2019_4 | Unity 2019.4 主要版本的脚本符号,在每个 2019.4.Z 版本中公开。 |
UNITY_2019_4_14 | Unity 2019.4.14 次要版本的脚本符号。 |
您还可以根据编译或执行给定代码部分所需的最早 Unity 版本有选择地编译代码。给定与上述 (X.Y) 相同的版本格式,Unity 会以 UNITY_X_Y_OR_NEWER 格式公开一个全局#define,您可以将其用于此目的。
其他脚本符号
Unity 定义的其他脚本符号包括:
定义 | 功能 |
---|---|
CSHARP_7_3_OR_NEWER | 在构建支持 C# 7.3 或更高版本的脚本时定义。 |
ENABLE_MONO | 用于 Mono 的脚本后端 #define。 |
ENABLE_IL2CPP | 用于 IL2CPP 的脚本后端 #define。 |
NET_2_0 | 在 Mono 和 IL2CPP 上根据 .NET 2.0 API 兼容性级别构建脚本时定义。 |
NET_2_0_SUBSET | 在 Mono 和 IL2CPP 上根据 .NET 2.0 Subset API 兼容性级别构建脚本时定义。 |
NET_LEGACY | 在 Mono 和 IL2CPP 上根据 .NET 2.0 或 .NET 2.0 Subset API 兼容性级别构建脚本时定义。 |
NET_4_6 | 在 Mono 和 IL2CPP 上根据 .NET 4.x API 兼容性级别构建脚本时定义。 |
NET_STANDARD_2_0 | 在 Mono 和 IL2CPP 上根据 .NET 标准 2.0 API 兼容性级别构建脚本时定义。 |
ENABLE_WINMD_SUPPORT | 在 IL2CPP 上启用 Windows 运行时支持时定义。 有关更多详细信息,请参阅 Windows 运行时支持。 |
ENABLE_INPUT_SYSTEM | 在 Player Settings 中启用 Input System 包时定义。 |
ENABLE_LEGACY_INPUT_MANAGER | 在 Player Settings 中启用旧版 Input Manager 时定义。 |
UNITY_SERVER | 在“生成设置”中启用“服务器内部版本”设置时定义 |
DEVELOPMENT_BUILD | 当脚本在启用了“开发构建”选项的播放器中运行时定义。 |
测试预编译代码
下面是如何使用预编译代码的示例。 该示例根据为目标构建选择的平台打印一条消息。
首先,通过 File > Build Settings 选择要测试代码的平台。 随后将显示 Build Settings 窗口; 从此处选择目标平台。

选择要测试预编译代码的平台,然后单击 Switch Platform 向 Unity 告知您所需的目标平台。
创建脚本并复制/粘贴以下代码:
using UnityEngine;
using System.Collections;
public class PlatformDefines : MonoBehaviour {
void Start () {
#if UNITY_EDITOR
Debug.Log("Unity Editor");
#endif
#if UNITY_IOS
Debug.Log("iOS");
#endif
#if UNITY_STANDALONE_OSX
Debug.Log("Standalone OSX");
#endif
#if UNITY_STANDALONE_WIN
Debug.Log("Standalone Windows");
#endif
}
}
若要测试代码,请单击“播放模式”。通过在 Unity 控制台中检查相关消息来确认代码是否有效,具体取决于您选择的平台 - 例如,如果选择 iOS,则消息“Unity iOS”将设置为显示在控制台中。
在 C# 中,可使用 属性,这是一种更简洁、更不容易出错的函数剥离方式。 请参阅 ConditionalAttribute 类以了解更多信息。 请注意,常见的 Unity 回调(例如:Start()、Update()、LateUpdate()、FixedUpdate()、Awake())不受此属性的影响,因为它们是直接从引擎调用的,并且出于性能原因,此属性不会考虑它们。CONDITIONAL
除了基本的 编译器指令外,还可在 C# 中使用多路测试:#if
#if UNITY_EDITOR
Debug.Log("Unity Editor");
#elif UNITY_IOS
Debug.Log("Unity iOS");
#else
Debug.Log("Any other platform");
#endif
由3D建模学习工作室整理翻译,转载请注明出处!