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_WINWindows 上编辑器代码的脚本符号。
UNITY_EDITOR_OSXMac OS X 上编辑器代码的脚本符号。
UNITY_EDITOR_LINUXLinux 上编辑器代码的脚本符号。
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_ANDROIDAndroid 平台的脚本符号。
UNITY_LUMINMagic Leap OS 平台的脚本符号。您也可以使用PLATFORM_LUMIN
UNITY_TIZENTizen 平台的脚本符号。
UNITY_TVOSApple TV 平台的脚本符号。
UNITY_WSA通用 Windows 平台的脚本符号。此外,NETFX_CORE是在针对 .NET Core 编译 C# 文件并使用 .NET 脚本后端时定义的。
UNITY_WSA_10_0通用 Windows 平台的脚本符号。此外,WINDOWS_UWP是在针对 .NET Core 编译 C# 文件时定义的。
UNITY_WEBGLWebGL 的脚本符号。
UNITY_FACEBOOKFacebook 平台的脚本符号(WebGL 或 Windows 独立)。
UNITY_ANALYTICS用于从游戏代码调用 Unity 分析方法的脚本符号。版本 5.2 及更高版本。
UNITY_ASSERTIONS断言控制过程的脚本符号。
UNITY_6464 位平台的脚本符号。

编辑器版本 脚本符号

Unity 会根据您当前使用的编辑器版本自动定义某些脚本符号。

给定版本号 X.Y.Z(例如 2019.4.14),Unity 会以以下格式公开三个全局脚本符号:UNITY_XUNITY_X_YUNITY_X_Y_Z

以下是 Unity 2019.4.14 中公开的脚本符号示例:

定义功能
UNITY_2019Unity 2019 发布版本的脚本符号,在每个 2019.Y.Z 版本中公开。
UNITY_2019_4Unity 2019.4 主要版本的脚本符号,在每个 2019.4.Z 版本中公开。
UNITY_2019_4_14Unity 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 窗口; 从此处选择目标平台。

选择Windows,Mac,Linux作为目标平台的“构建设置”窗口
选择Windows,Mac,Linux作为目标平台的“构建设置”窗口

选择要测试预编译代码的平台,然后单击 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建模学习工作室整理翻译,转载请注明出处!

上一篇:Unity3D :特殊文件夹和脚本编译顺序 (mvrlink.com)

下一篇:Unity3D :自定义脚本符号 (mvrlink.com)

NSDT场景编辑器 | NSDT 数字孪生 | GLTF在线编辑器 | 3D模型在线转换 | UnrealSynth虚幻合成数据生成器 | 3D模型自动纹理化工具
2023 power by nsdt©鄂ICP备2023000829号