Это инструкции компилятору, которые позволяют контролировать компиляцию частей кода. <br> **defines** - тип директивы препроцессора. Он позволяет создать условия, определяющие будет ли скомпилирован тот или иной участок кода. Можно использовать только условия в синтаксисе директивы препроцессора (if, elif, else, endif) ```csharp #if TEST1 #elif TEST2 #else public string GetName() { return "Kate"; } #endif ``` Если Define не определен, то код внутри условия проверяться не будет. Соответственно, будут игнорировать синтаксические ошибки кода. ```csharp //Define TEST1 не определен, поэтому код не будет скомпилирован. Компилятор такой код перекрасил в серый цвет. #if TEST1 pulic strng GetName( { rurn "Kate; #endif ``` С более полной информацией, касательно директив препроцессора, можно ознакомиться в официальной [документации.](https://learn.microsoft.com/ru-ru/dotnet/csharp/language-reference/preprocessor-directives) <br> ### Unity У Unity есть свои Define, которые позволяют видеть контекст при компиляции проекта. Например, запущена ли сборка в дебаг-режиме. Если сборка запущена в production, то Unity не определит define «Debug» и код не выполнится. ```csharp public void Example() { #if DEBUG Console.WriteLine("Debug version"); #endif } ``` Все остальные Define, которые есть у Unity, можно посмотреть в официальной [документации](https://docs.unity3d.com/Manual/PlatformDependentCompilation.html). ### ConditionalAttribute Класс Это Атрибут, который позволяет не компилировать метод/класс, если некий define не определен. ([Документация](https://learn.microsoft.com/ru-ru/dotnet/api/system.diagnostics.conditionalattribute?view=net-7.0)) ```csharp [Conditional("UNITY_IOS")] public void IOS(string s) => Drive(); ```