Что должен содержать класс сцены при реализации игры?

«Что должен содержать класс сцены при реализации игры?» — вопрос из категории ООП, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Класс сцены (Scene) в игровом движке служит контейнером и менеджером для всех игровых объектов и систем на определенном уровне. Его типичная структура включает:

  • Коллекция игровых объектов (GameObjects): Обычно это список, словарь или иерархическое дерево для хранения всех сущностей на сцене.
  • Методы жизненного цикла:
    • Load() / Initialize() – загрузка ресурсов и начальная настройка.
    • Update(float deltaTime) – обновление логики всех объектов (движение, AI, ввод).
    • Render() / Draw() – отрисовка всех визуальных компонентов.
    • Unload() – очистка ресурсов при переходе на другую сцену.
  • Состояние сцены: Флаги или перечисление (например, Running, Paused, Completed).
  • Системы: Ссылки на менеджеры физики, коллизий, звука и событий, которые работают в контексте этой сцены.
  • Камера (Camera): Объект, определяющий вид и проекцию для рендеринга.

Пример минимального класса на C#:

public class Scene
{
    private List<GameObject> _gameObjects = new List<GameObject>();
    public Camera MainCamera { get; set; }
    public SceneState State { get; private set; } = SceneState.Running;

    public void AddObject(GameObject obj) => _gameObjects.Add(obj);

    public void Update(float deltaTime)
    {
        if (State != SceneState.Running) return;
        foreach (var obj in _gameObjects)
            obj.Update(deltaTime);
    }

    public void Render()
    {
        foreach (var obj in _gameObjects.Where(obj => obj.IsVisible))
            obj.Render(MainCamera?.ViewMatrix);
    }
}

В современных движках (Unity, Unreal) используется компонентная система (ECS или ее вариации), где GameObject — это просто контейнер для компонентов (Transform, MeshRenderer, Rigidbody), а сцена управляет их обновлением и взаимодействием.