Version: 1.7
语言 : 中文
特殊文件夹和脚本编译顺序
Custom scripting symbols

条件编译

Unity 对 C# 的支持包括 编译指令(directives) 的使用,您可以根据某些 宏定义(Scripting Symbols) 是否已定义 ,选择性地包含或排除某些代码的编译。

有关这些指令在 C# 中如何工作的更多信息,请参阅 C# 预处理器指令

Unity 提供了一系列内置宏定义,您可以在脚本中使用它们,选择性地包含或排除某些代码的编译。

例如,在 Windows 独立平台的项目构建中设置的宏定义是 UNITY_STANDALONE_WIN。您可以使用一种特殊类型的 if 语句检查此符号是否已定义:

#if UNITY_STANDALONE_WIN

  Debug.Log("Standalone Windows");

#endif

位于ifendif 前面的字符# 表示这些语句是编译过程中处理的指令,而不是运行时处理的指令。

在上述示例中,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_XUNITY_X_YUNITY_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 窗口;从此处选择目标平台。

Build Settings window with Windows, Mac, Linux selected as the target platform
Build Settings window with Windows, Mac, Linux selected as the target platform

选择要测试预编译代码的平台,然后单击 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
特殊文件夹和脚本编译顺序
Custom scripting symbols