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 类。诸如 Start()
、Update()
、LateUpdate()
、FixedUpdate()
、Awake()
之类的常见 Unity 回调不会受到此属性的影响,因为它们是由引擎直接调用的,并且出于性能原因,它不会考虑它们。
在高级别进行条件编译的推荐方法是将您的脚本组织到具有关联的程序集定义文件的程序集中。如果您想要有条件地包含或排除的代码在一个程序集中,您可以配置程序集定义上的定义约束,例如,只有在项目中存在给定版本的包时才编译该代码。
您可以使用标准的 if
语句强制执行已编译代码的条件执行,而不是条件编译。例如,Unity 的 UNITY_64
脚本符号是 64 位体系结构的不可靠测试,因此最好执行以下操作
if (IntPtr.Size == 4)
{
// 32 bit code
}
else
{
// 64-bit code
}