 
    Условия в Unity — это способ заставить объекты реагировать на события, проверять состояния и принимать решения в коде. С их помощью персонаж может прыгать только когда стоит на земле, враг — атаковать, если игрок рядом, а дверь — открываться по кнопке.
        В проверке условий мы часто используем
        операции сравнения (например, ==,
        !=, >) и
        логические операции (такие как && и
        ||). Мы уже видели их в предыдущем уроке — теперь они
        помогут нам решать, что делать в зависимости от ситуации.
      
          В Unity (и вообще в C#) конструкция if позволяет
          выполнять код только если выполняется какое-то условие. А
          else — это то, что происходит, если условие не выполнено.
        
          В круглых скобках после if мы записываем
          условие. Это выражение, которое проверяется и даёт
          один из двух ответов: истина (true) или
          ложь (false). Если результат — истина, выполняется
          блок кода внутри фигурных скобок. Если ложь — код пропускается, либо
          срабатывает else, если он есть.
        
using UnityEngine;
public class CSharpScript : MonoBehaviour
{
  int health = 10;
  // Start вызывается один раз при запуске объекта
  void Start()
  {
        
  }
  // Update вызывается каждый кадр
  void Update()
  {
      if (health > 0)
    {
      // Игрок ещё жив
      Debug.Log("Вставай и сражайся!");
    }
      else
    {
    // Игрок мёртв
    Debug.Log("Game Over");
    }
  }
} 
  Здесь мы проверяем, больше ли здоровье нуля. Если да — выводим сообщение о том, что игрок ещё в бою. Если нет — значит, пора перезапускать уровень. Именно так работает большинство логики в играх.
          В Unity очень часто проверяют булевые переменные —
          например, isJumping, isDead,
          isGrounded. Это удобно, потому что такие переменные прямо
          говорят: включено что-то или нет, происходит или не происходит.
        
using UnityEngine;
public class CSharpScript : MonoBehaviour
{
  bool isDead = true;
  // Start вызывается один раз при запуске объекта
  void Start()
  {
      
  }
  // Update вызывается каждый кадр
  void Update()
  {
    if (isDead)
    {
      // Персонаж мёртв
      Debug.Log("Game Over");
    }
  }
}
Условия также можно вкладывать друг в друга для многоуровневой проверки. Это полезно, когда одно действие зависит сразу от нескольких факторов — например, персонаж может прыгнуть, только если он на земле и нажата нужная клавиша. Хотя в таком случае может быть проще использовать логические операторы, чтобы объединить несколько условий в одну строку.
using UnityEngine;
public class CSharpScript : MonoBehaviour
{
  bool isGrounded = true;
  bool jumpKeyPressed = true;
  // Start вызывается один раз при запуске объекта
  void Start()
  {
    
  }
  // Update вызывается каждый кадр
  void Update()
  {
    // Вложенные условия
    if (isGrounded)
    {
      if (jumpKeyPressed)
      {
        Debug.Log("Прыжок выполнен (вложенный if)");
      }
    }
    // То же самое, но с логическим оператором
    if (isGrounded && jumpKeyPressed)
    {
      Debug.Log("Прыжок выполнен (логическое И)");
    }
  }
}
          Когда у нас есть много возможных значений и нужно выбрать действие в
          зависимости от них — удобно использовать switch. Это как
          меню: если выбрано одно — выполняем одно, если другое — выполняем
          другое.
        
          В круглых скобках после switch мы указываем переменную
          или выражение, значение которого хотим проверить. Дальше идут
          case — возможные варианты этого значения. Если один из
          них совпадает, выполняется код внутри этого блока. Чтобы программа не
          пошла дальше, в конце каждого case пишем
          break;. Если ни один вариант не подошёл — срабатывает
          default.
        
using UnityEngine;
public class CSharpScript : MonoBehaviour
{
  string enemyType = "зомби";
  // Start вызывается один раз при запуске объекта
  void Start()
  {
    switch (enemyType)
    {
      case "зомби":
        Debug.Log("Зомби атакует!");
        break;
      case "робот":
        Debug.Log("Робот стреляет!");
        break;
      case "призрак":
        Debug.Log("Призрак исчезает!");
        break;
      default:
        Debug.Log("Неизвестный враг...");
        break;
    }
  }
  // Update вызывается каждый кадр
  void Update()
  {
  }
}
          💡Команда break; завершает выполнение текущего случая.
          Если её не поставить — выполнение продолжится и перейдёт ко всем
          следующим блокам, даже если они не подходят. Это называется
          "проваливание" (fall-through). Иногда это делают специально, но чаще
          забывают — и получают неожиданные результаты.