Условная компиляция в Unity
Unityподдержки в целях развития C# язык включает использование руководящие принципы, которые позволяют вам избирательно включать или исключать код из компиляции, исходя из того, скриптовые символы Для получения дополнительной информации о том, как эти директивы работают в C#, обратитесь к документации Майкрософта на C# директивы препроцессора.
Unity имеет ряд предопределенных символов, которые вы можете использовать в своих скриптах для выборочного включения или исключения секций кода из компиляции. Например, символ, который определен в сборках проекта для автономной платформы Windows, это UNITY_STANDALONE_WIN. Вы можете проверить, определен ли этот символ с помощью специального типа инструкции if:
#if UNITY_STANDALONE_WIN
Debug.Log("Standalone Windows");
#endif
Символ решётки (#) перед #if и #endif указывает, что эти выражения являются директивами, которые обрабатываются во время компиляции, а не во время выполнения. В предыдущем примере строка Debug включается в компиляцию только в автономной сборке проекта для Windows. При компиляции в Unity Editor или для других целевых сборок она полностью исключается. Это отличается от использования обычных операторов if, которые могут лишь пропускать выполнение определённых участков кода во время работы приложения.
Вы можете использовать директивы #elif и #else для проверки нескольких условий:
#if UNITY_EDITOR
Debug.Log("Unity Editor");
#elif UNITY_IOS
Debug.Log("Unity iOS");
#else
Debug.Log("Any other platform");
#endif
Существует несколько предопределённых символов, позволяющих выборочно компилировать или исключать код в зависимости от выбранной платформы, версии Editor и других условий системной среды. Полный список предопределённых символов Unity см. в справочнике по символам скриптинга Unity.
Вы также можете определить свои собственные символы скриптов с помощью Редактора, с помощью скриптов или с помощью файла ассета. Дополнительные сведения см. в Пользовательские символы сценариев.
Примечание: Символы сценариев также называются символами определения, определениями препроцессора или просто определениями.
Альтернативы директивам
Директивы препроцессора не всегда являются наиболее подходящим или надежным способом условного включения или исключения кода. Здесь перечислены альтернативные подходы.
Атрибут Conditional
Вы можете использовать атрибут C# Conditional, который является более чистым, менее подверженным ошибкам способом удаления функций. Для более подробной информации см. ConditionalAttribute Class. Общие обратные вызова Unity, такие как Start(), Update(), LateUpdate(), FixedUpdate(), Awake() не затрагиваются этим атрибутом, поскольку они вызываются непосредственно из движка и, по причинам производительности, не принимаются в расчет.
Ограничения определения сборки
Рекомендуемый подход к условной компиляции на высоком уровне заключается в организации скриптов в сборки с соответствующими Файлы определений сборки. Если код, который требуется условно включить или исключить, находится в сборке, можно настроить Определение ограничений на определение сборки, например, чтобы компилировать код только тогда, когда в проекте присутствует определенная версия пакета.
Условная казнь
Вместо условной компиляции вы можете обеспечить условное выполнение скомпилированного кода с помощью стандартных инструкций if. Например, символ скрипта UNITY_64 Unity является ненадежным тестом для 64-битной архитектуры, поэтому предпочтительнее сделать следующее:
if (IntPtr.Size == 4)
{
// 32 bit code
}
else
{
// 64-bit code
}