🏠 Главная

Циклы в Юнити

Циклы в Unity — это способ повторять действия в коде: например, запускать врагов по очереди, перебирать предметы в инвентаре или ждать, пока что-то произойдёт. Они позволяют не копировать один и тот же код много раз, а сделать это автоматически, сколько нужно.

В C# и Unity есть несколько видов циклов: for, while, foreach. Каждый из них работает чуть по-своему, но суть одна: повторять, пока выполняется какое-то условие.

🔁 Цикл for

Цикл for — это способ повторить один и тот же код несколько раз. Мы говорим компьютеру: начни с какого-то значения, проверяй условие, и каждый раз меняй счётчик. Например: «повтори 10 раз», или «пройди по всем элементам от 0 до 5».

Такой цикл особенно удобен, когда мы заранее знаем, сколько раз нужно что-то сделать — например, создать 5 врагов, посчитать очки или нарисовать 10 платформ.

 
using UnityEngine;

public class CSharpScript : MonoBehaviour
{
  // Start вызывается один раз при запуске объекта
  void Start()
  {
    // Повторяем 5 раз
    for (int i = 0; i < 5; i++)
    {
      Debug.Log("Итерация №" + i);
    }
  }

  // Update вызывается каждый кадр
  void Update()
  {
    
  }
} 

В этом примере мы запускаем цикл for, который повторяется 5 раз. Переменная i начинается с 0, и каждый раз увеличивается на 1. Пока i меньше 5 — цикл продолжается, и мы выводим номер итерации в консоль.

Так работает большинство простых повторений в Unity: можно перебирать уровни, создавать объекты, проверять массивы и многое другое.

🔄 Цикл while

Цикл while выполняется, пока условие остаётся истинным. Это как проверка перед каждым шагом: если условие true — продолжаем, если false — выходим из цикла.

Такой цикл удобно использовать, когда не знаешь заранее, сколько раз нужно повторить: например, ждать, пока игрок дойдёт до цели, или пока не нажата кнопка выхода.

 
using UnityEngine;

public class CSharpScript : MonoBehaviour
{
  int energy = 3;

  // Start вызывается один раз при запуске объекта
  void Start()
  {
    // Пока энергия больше нуля — повторяем
    while (energy > 0)
    {
      Debug.Log("Осталось энергии: " + energy);
      energy--;
    }
  }

  // Update вызывается каждый кадр
  void Update()
  {

  }
} 

В этом примере цикл while повторяется, пока energy больше нуля. На каждом шаге мы выводим значение в консоль и уменьшаем energy на единицу.

Как только energy станет равной нулю — условие больше не выполняется, и цикл останавливается. Такой подход часто используют, когда количество повторений зависит от состояния — например, пока есть патроны или пока враг жив.

⚠️ Важно: Будь осторожен с циклами while в Unity!

Если условие никогда не станет false — цикл будет бесконечным, и Unity может зависнуть или крашнуться. Это особенно опасно, если цикл запускается в Update().

Всегда убедись, что внутри цикла меняется переменная, от которой зависит условие. Или поставь ограничитель — например, максимум 100 итераций, если не уверен.

 
using UnityEngine;

public class CSharpScript : MonoBehaviour
{
  int energy = 10;

  // Start вызывается один раз при запуске объекта
  void Start()
  {
    while (true)
    {
      if (energy <= 0)
      {
        Debug.Log("Энергия закончилась — выходим из цикла");
        break; // Прерываем цикл
      }

      Debug.Log("Осталось энергии: " + energy);
      energy--;
    }
  }

  // Update вызывается каждый кадр
  void Update()
  {

  }
} 

Здесь цикл while (true) выглядит как бесконечный, но внутри него есть проверка: если energy меньше или равна нулю — команда break прерывает выполнение цикла.

Это полезный приём, если цикл должен идти «до тех пор, пока...» — но ты не знаешь точно, когда это произойдёт. Главное — не забыть условие выхода!

🔂 Цикл foreach

Цикл foreach позволяет пройтись по всем элементам в коллекции: массиве, списке или любом другом наборе. Он автоматически берёт каждый элемент по очереди — не нужно считать вручную, как в for.

Это особенно удобно, когда тебе не важен номер элемента, а нужно просто перебрать всё подряд: всех врагов, все кнопки, все предметы в инвентаре.

 
using UnityEngine;

public class CSharpScript : MonoBehaviour
{
  string[] names = { "Аня", "Боб", "Соня", "Мистер Ёж" };

  // Start вызывается один раз при запуске объекта
  void Start()
  {
    foreach (string name in names)
    {
      Debug.Log("Имя: " + name);
    }
  }

  // Update вызывается каждый кадр
  void Update()
  {

  }
} 

В этом примере мы используем foreach, чтобы пройтись по массиву names. На каждом шаге переменная name автоматически получает следующее значение из массива — сначала "Аня", потом "Боб", потом "Соня", и, конечно, Мистер Ёж.

Такой подход удобен, когда нужно просто перебрать все элементы без счётчиков. foreach делает это просто и читабельно.