← Назад к вопросам

Как работает стек?

1.3 Junior🔥 213 комментариев
#Управление памятью

Комментарии (3)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Стек в Unity и C#

Стек (Stack) — это структура данных, работающая по принципу LIFO (Last-In, First-Out) — «последним пришёл, первым ушёл». Это означает, что элементы добавляются и извлекаются только с одного конца — вершины стека.

Основные операции со стеком

  • Push — добавление элемента на вершину стека.
  • Pop — удаление и возврат элемента с вершины стека.
  • Peek — возврат элемента с вершины стека без его удаления.
  • IsEmpty — проверка, пуст ли стек.

Реализация в C# и использование в Unity

В C# стек можно использовать через универсальный класс System.Collections.Generic.Stack<T>.

using System.Collections.Generic;
using UnityEngine;

public class StackExample : MonoBehaviour
{
    private Stack<string> _actionHistory = new Stack<string>();

    void Start()
    {
        // Push: Добавляем действия в историю
        _actionHistory.Push("Переместил персонажа в точку А");
        _actionHistory.Push("Поднял меч");
        _actionHistory.Push("Атаковал врага");

        Debug.Log($"Всего действий в истории: {_actionHistory.Count}");

        // Peek: Смотрим последнее действие, не удаляя его
        string lastAction = _actionHistory.Peek();
        Debug.Log($"Последнее действие (Peek): {lastAction}");

        // Pop: Отменяем действия в обратном порядке (LIFO)
        while (_actionHistory.Count > 0)
        {
            string undoneAction = _actionHistory.Pop();
            Debug.Log($"Отменяем действие: {undoneAction}");
        }
    }
}

Практическое применение стека в разработке игр на Unity

  1. Система отмены действий (Undo/Redo)
    *   Каждое действие игрока (перемещение объекта, изменение свойства) сохраняется в стек.
    *   При нажатии «Отменить» — извлекается последнее действие и выполняется обратная операция.

  1. Управление состояниями игры и UI
    *   Стек идеально подходит для меню и окон. При открытии нового меню текущее состояние «пушится» в стек. При закрытии — «попится» и восстанавливается предыдущее состояние.
```csharp
private Stack<GameState> _gameStateStack = new Stack<GameState>();

public void OpenPauseMenu()
{
    _gameStateStack.Push(CurrentState); // Сохраняем текущее состояние (Gameplay)
    CurrentState = GameState.Paused;
}

public void ClosePauseMenu()
{
    if (_gameStateStack.Count > 0)
    {
        CurrentState = _gameStateStack.Pop(); // Восстанавливаем Gameplay
    }
}
```

3. Обход алгоритмов и поиск путей

    *   Стек является основой для **нерекурсивного обхода графов и деревьев** по стратегии **Depth-First Search (DFS, поиск в глубину)**.
    *   Это используется в генерации лабиринтов, анализе карты проходимости или проверке связанности зон.

  1. Система достижений или квестов
    *   Для цепочек заданий, где следующее открывается только после завершения предыдущего.

  1. Стек вызовов (Call Stack) в отладке
    *   Хотя это и системная концепция, понимание стека вызовов критически важно для отладки ошибок `NullReferenceException` или анализа производительности в **Unity Profiler**.

Важные особенности и сравнение

  • Стек vs Очередь (Queue): Очередь работает по принципу FIFO (First-In, First-Out) и больше подходит для обработки событий по порядку (например, система диалогов).
  • Производительность: Операции Push, Pop и Peek выполняются за константное время O(1), что делает стек очень эффективным.
  • Ограничения: Главный недостаток — отсутствие прямого доступа к элементам в середине стека. Если такая необходимость есть, возможно, лучше подойдет список (List<T>).

Заключение

Понимание стека — это фундаментальный навык для разработчика Unity. Это не просто абстрактная структура данных, а практический инструмент для решения множества типовых игровых задач: от создания отзывчивых интерфейсов до реализации сложной игровой логики. Умение выбрать стек там, где он уместен (LIFO-логика), напрямую влияет на чистоту, поддерживаемость и производительность кода.

Как работает стек? | PrepBro