🏠 Главная

Условия в Юнити

Условия в Unity — это способ заставить объекты реагировать на события, проверять состояния и принимать решения в коде. С их помощью персонаж может прыгать только когда стоит на земле, враг — атаковать, если игрок рядом, а дверь — открываться по кнопке.

В проверке условий мы часто используем операции сравнения (например, ==, !=, >) и логические операции (такие как && и ||). Мы уже видели их в предыдущем уроке — теперь они помогут нам решать, что делать в зависимости от ситуации.

🔀 Условия: if и else

В 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. Это как меню: если выбрано одно — выполняем одно, если другое — выполняем другое.

В круглых скобках после 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). Иногда это делают специально, но чаще забывают — и получают неожиданные результаты.