Unity 对 C# 的支持包括 编译指令(directives) 的使用,您可以根据某些 宏定义(Scripting Symbols) 是否已定义 ,选择性地包含或排除某些代码的编译。
有关这些指令在 C# 中如何工作的更多信息,请参阅 C# 预处理器指令 。
Unity 提供了一系列内置宏定义,您可以在脚本中使用它们,选择性地包含或排除某些代码的编译。
例如,在 Windows 独立平台的项目构建中设置的宏定义是 UNITY_STANDALONE_WIN
。您可以使用一种特殊类型的 if 语句检查此符号是否已定义:
#if UNITY_STANDALONE_WIN
Debug.Log("Standalone Windows");
#endif
位于if
和 endif
前面的字符#
表示这些语句是编译过程中处理的指令,而不是运行时处理的指令。
在上述示例中,Debug 行仅在项目的 Windows 独立平台构建中被编译。在 Unity 编辑器或其他平台构建的编译时,它会被完全忽略。这与常规使用的 if .. then .. else
语句不同,后者仅在运行时绕过某些代码的执行。完整示例请参阅下文。
Unity 有一些内置的宏定义,根据所选 平台、编辑器版本 和 其他 系统环境场景,您可以选择性地编译或省略代码。有关这部分内置宏定义的详细信息,请参阅下文。
您还可以通过资源文件、通过脚本,或使用编辑器界面自定义宏,以便控制部分代码的编译。更多信息请参阅 自定义宏。
注意:Scripting symbols(宏定义) 有时也被称为 “define symbols”、“preprocessor defines” 或简称 “defines”。
Unity 会根据编辑环境和构建目标平台自动定义某些宏。具体如下:
Define | 功能 |
---|---|
UNITY_EDITOR | 用于从游戏代码中调用 Unity 编辑器脚本的宏定义。 |
UNITY_EDITOR_WIN | 用于 Windows 上编辑器代码的宏定义。 |
UNITY_EDITOR_OSX | 用于 macOS 上编辑器代码的宏定义。 |
UNITY_EDITOR_LINUX | 用于 Linux 上编辑器代码的宏定义。 |
UNITY_STANDALONE_OSX | 专用于 Mac OS X(包括 Universal、PPC 和 Intel 架构)代码编译或执行的宏定义。 |
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_OPENHARMONY | 用于OpenHarmony 平台的宏定义。 |
UNITY_LUMIN | 用于Magic Leap OS 平台的宏定义。您也可以使用 PLATFORM_LUMIN。请注意,Lumin 平台已不再支持。 |
UNITY_TIZEN | 用于Tizen 平台的宏定义。 |
UNITY_TVOS | 用于Apple TV 平台的宏定义。 |
UNITY_WSA | 用于通用 Windows 平台的宏定义。此外,当使用 .NET Core 和 .NET 脚本后端编译 C# 文件时,还会定义 NETFX_CORE。 |
UNITY_WSA_10_0 | 用于通用 Windows 平台的宏定义。此外,当使用 .NET Core 编译 C# 文件时,还会定义 WINDOWS_UWP。 |
UNITY_WEBGL | 用于WebGL平台的宏定义。微信小游戏平台下该宏也处于激活状态。 |
UNITY_WEIXINMINIGAME | (已过时)微信小游戏平台宏定义,团结引擎独有。 |
UNITY_MINIGAME | 用于小游戏平台的宏定义,团结引擎独有。 |
UNITY_OPENHARMONY | 用于鸿蒙平台的宏定义,团结引擎独有。 |
UNITY_ARM_LINUX | 用于ARM 架构 Linux 系统的宏定义,团结引擎独有。 |
UNITY_FACEBOOK | 用于Facebook 平台(WebGL 或 Windows 独立)的宏定义。 |
UNITY_ANALYTICS | 用于从游戏代码调用 Unity Analytics 方法的宏定义。需要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 中提供的宏定义示例:
Define | 功能 |
---|---|
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 。您可以用它来实现版本条件编译。
此外,团结引擎还包含以下版本宏定义:
Define | 功能 |
---|---|
TUANJIE_1 | 团结 1.0 发布版本的宏定义,在所有 1.Y.Z 版本中公开。 |
TUANJIE_1_1 | 团结 1.1.0 主版本的宏定义,在所有 1.1.Z 版本中公开。 |
TUANJIE_1_1_2 | 团结 1.1.2 次版本的宏定义。 |
以某一个版本为分界线,可以使用例如 TUANJIE_X_Y_OR_NEWER 的宏定义。
Unity 定义的其他宏定义如下:
Define | 功能 |
---|---|
CSHARP_7_3_OR_NEWER | 在构建支持 C# 7.3 或更高版本的脚本时定义。 |
ENABLE_MONO | 用于 Mono 的脚本后端 #define。 |
ENABLE_IL2CPP | 用于 IL2CPP 的脚本后端 #define。 |
ENABLE_TEXTURE_MANAGER | 用于 TextureManager 功能的宏定义,在小游戏平台有效。 |
ENABLE_VR | 当目标构建平台支持 VRVirtual Reality More info See in Glossary 时定义。并不表示当前启用了 VR,或已安装支持 VR 所需的插件和包。 |
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 兼容性级别构建脚本时定义。 |
NET_STANDARD_2_1 | 在 Mono 和 IL2CPP 上根据 .NET 标准 2.1 API 兼容性级别构建脚本时定义。 |
NET_STANDARD | 在 Mono 和 IL2CPP 上根据 .NET 标准 2.1 API 兼容性级别构建脚本时定义。 |
NETSTANDARD2_1 | 在 Mono 和 IL2CPP 上根据 .NET 标准 2.1 API 兼容性级别构建脚本时定义。 |
NETSTANDARD | 在 Mono 和 IL2CPP 上根据 .NET 标准 2.1 API 兼容性级别构建脚本时定义。 |
ENABLE_WINMD_SUPPORT | 在 IL2CPP 上启用 Windows 运行时支持时定义。有关更多详细信息,请参阅 Windows 运行时支持。 |
ENABLE_INPUT_SYSTEM | 在 Player Settings 中启用 Input System 包时定义。 |
ENABLE_LEGACY_INPUT_MANAGER | 在 Player Settings 中启用旧版 Input Manager 时定义。 |
UNITY_SERVER | 在 Build Settings 中启用 Server Build 设置时定义。 |
DEVELOPMENT_BUILD | 在构建启用了“开发构建”选项的播放器中运行脚本时定义。 |
WEIXINMINIGAME | 支持 AutoStreaming 功能,且能与微信 SDK 互动版本的 Editor 宏定义。团结引擎 和 Unity 2021.2.5f1c303 独有。 |
MINIGAME_SUBPLATFORM_WEIXIN | 小游戏微信子平台宏,仅在对应子平台被激活时生效。团结引擎独有。参考 小游戏构建配置-子平台激活。 |
MINIGAME_SUBPLATFORM_DOUYIN | 小游戏抖音子平台宏,仅在对应子平台被激活时生效。团结引擎独有。参考 小游戏构建配置-子平台激活。 |
MINIGAME_SUBPLATFORM_MINIHOST | 小游戏宿主子平台宏,仅在对应子平台被激活时生效。团结引擎独有。参考 小游戏构建配置-子平台激活。 |
MINIGAME_SUBPLATFORM_KUAISHOU | 小游戏宿主子平台宏,仅在对应子平台被激活时生效。团结引擎独有。参考 小游戏构建配置-子平台激活。 |
下面是如何使用预编译代码的示例。该示例根据为目标构建选择的平台打印一条消息。
首先,通过 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
}
}
如果您需要测试代码,请点击 Play Mode 。根据您选择的平台在 Unity 控制台中查看相关消息,以确认代码是否正常运行。例如,如果您选择了 iOS ,则应在控制台中看到消息 “Unity iOS”。
在 C# 中,可使用 CONDITIONAL
属性,这是一种更简洁、更不容易出错的函数剥离方式。请参阅 ConditionalAttribute 类以了解更多信息。
请注意,常见的 Unity 回调(例如:Start()、Update()、LateUpdate()、FixedUpdate()、Awake())不受此属性的影响,因为它们是直接从引擎调用的,并且出于性能原因,此属性不会考虑它们。
除了基本的 #if
编译器指令外,还可在 C# 中使用多路测试:
#if UNITY_EDITOR
Debug.Log("Unity Editor");
#elif UNITY_IOS
Debug.Log("Unity iOS");
#else
Debug.Log("Any other platform");
#endif