Version: 6000.3
语言: 中文
条件编译
Unity 脚本符号参考

Unity 中的条件编译

Unity 对 C# 语言的支持包括使用指令,这些指令允许您根据是否定义了某些脚本符号,有选择地在编译中包含或排除代码。有关这些指令在 C# 中如何工作的详细信息,请参阅 Microsoft 关于 C# 预处理器指令的文档。

Unity 有一系列预定义的符号,您可以在脚本一段代码,允许您创建自己的组件、触发游戏事件、随时间修改组件属性以及以您喜欢的任何方式响应用户输入。更多信息
请参阅术语表
有选择地从编译中包含或排除代码部分。例如,在 Windows 独立平台的项目生成中定义的符号是UNITY_STANDALONE_WIN.您可以检查是否使用特殊类型的if陈述:

#if UNITY_STANDALONE_WIN

  Debug.Log("Standalone Windows");

#endif

前面的哈希 () 字符##if#endif表示这些语句是在编译过程中处理的指令,而不是在运行时处理的指令。在前面的示例中,Debug 行仅包含在项目的 Windows 独立生成中进行编译。在 Unity 编辑器或其他目标构建中编译时,它会被完全省略。这与使用常规 if 语句不同,后者可能仅在运行时绕过某些代码部分的执行。

您可以使用#elif#else检查多个条件的指令:

#if UNITY_EDITOR

    Debug.Log("Unity Editor");

#elif UNITY_IOS

    Debug.Log("Unity iOS");

#else

    Debug.Log("Any other platform");

#endif

有几个预定义的符号,允许你根据所选平台编辑器版本和其他系统环境场景有选择地编译或省略代码。有关 Unity 预定义符号的完整列表,请参阅 Unity 脚本符号参考

你还可以使用编辑器、脚本或资产文件定义自己的脚本符号。有关详细信息,请参阅自定义脚本符号

注意:脚本符号也称为定义符号、预处理器定义或仅称为定义。

指令的替代方法

预处理器指令并不总是有条件地包含或排除代码的最合适或最可靠的方法。此处列出了替代方法。

Conditional属性

您可以使用 C#Conditional属性,这是一种更干净、不易出错的剥离函数的方式。有关详细信息,请参阅 ConditionalAttribute 类。常见的 Unity 回调,例如Start(),Update(),LateUpdate(),FixedUpdate(),Awake()不受此属性的影响,因为它们是直接从引擎调用的,并且出于性能原因,它不会考虑它们。

装配定义约束

在高级别进行条件编译的建议方法是使用关联的程序集定义文件在程序集中组织脚本。如果要有条件地包含或排除的代码位于程序集中,则可以在程序集定义上配置“定义约束”,例如,仅在项目中存在给定版本的包时编译代码。

条件执行

您可以使用标准强制执行已编译代码的条件执行,而不是条件编译if语句。例如,Unity 的UNITY_64脚本符号是 64 位体系结构的不可靠测试,因此最好改为执行以下作:

if (IntPtr.Size == 4)
{
    // 32 bit code
}
else
{
    // 64-bit code
}

其他资源

条件编译
Unity 脚本符号参考