1.
Это основа игрового мира. Вся игра — это коллекция
сущностей (entities), которые взаимодействуют друг с другом.
- Entity (Энтити, Сущность) — это базовый объект в игре. У него есть:
- Уникальный ID (индекс в списке).
- Класс (тип: игрок, оружие, дверь, источник звука, свет).
- Параметры (properties/keyvalues) — например, для двери: цвет, скорость открытия, цель, к которой она ведет.
- Состояние (state) — позиция в мире, здоровье, флаги активности.
- Поведение (логика) — может быть описано скриптами, кодом на C++ или встроенной логикой движка.
Entity System (Система сущностей) — это
менеджер, который:
- Создает и уничтожает сущности.
- Хранит их все в организованном списке.
- Обновляет их состояние каждый кадр (вызывает метод Think() или Update).
- Обрабатывает взаимодействия между ними (через систему сообщений, столкновений, лучей).
- Сериализует их (сохраняет и загружает).
Аналог из реального мира: Представьте себе театр. Entity System — это
режиссер и сценарист в одном лице. Он знает всех актеров (игроки, враги), реквизит (оружие, бонусы), декорации (двери, лифты, кнопки), свет и звук. Он дает им команды и управляет их взаимодействием.
2.
Это
иерархия наследования. Представьте ее как матрешку:
- CBaseEntity (Базовый объект) — самая большая матрешка. Есть у ВСЕГО. Имеет позицию, модель, может думать. Дверь, оружие, игрок — все начинаются отсюда.
- CBaseCombatCharacter (Боевой персонаж) — матрешка поменьше. Добавляет к CBaseEntity здоровье, броню, возможность носить оружие, систему анимаций. Подходит для игроков И для NPC (врагов, союзников).
- CBasePlayer / CBasePawn (Базовый Игрок / Павн) — еще меньше. Конкретная реализация игрового персонажа, управляемого кем-либо (человеком или ботом). У него уже есть:
- Инвентарь и система оружия.
- Камера от первого/третьего лица.
- Ввод с мыши/клавиатуры (или ИИ для бота).
- HUD (интерфейс).
- Сетевой код для синхронизации с сервером.
А теперь ключевой момент: В современных движках (как Source 2 или Unreal Engine) произошло дальнейшее разделение:
- Pawn (Пешка, Павн) — это физическое представление игрока/персонажа в мире. Он имеет коллизию (тело), может двигаться, получать урон, взаимодействовать с физическими объектами. Pawn — это "тело".
- Player Controller (Контроллер игрока) — это "мозг". Он получает ввод от пользователя (нажатия клавиш, движение мыши) и решает, как на это должен реагировать Pawn. Контроллер также управляет камерой (которая не всегда привязана к телу Pawn) и интерфейсом.
Зачем такое разделение?
- Гибкость: Один контроллер может "вселяться" в разных павнов (например, в single-player вы можете временно управлять птицей или танком).
- Смерть/Возрождение: Когда игрока "убивают", его Pawn уничтожается (тело падает), но Player Controller остается живым. Через несколько секунд он создает нового Pawn (новое тело) в точке возрождения.
- Сетевой код: Контроллер часто существует "на стороне" игрока (клиент-сайден), а Pawn — это реплицируемый на всех клиентах объект на сервере.
- Специализация: Pawn заботится о физике и анимациях, а Controller — о логике управления и взаимодействии с UI.
Итог: Base Player (в классическом понимании) — это часто монолитная сущность, объединяющая и контроллер, и павна. Pawn — это более чистая, современная и гибкая концепция физического аватара.
3.
Получить ссылку на павна можно разными способами в коде игры. Например:
- На стороне клиента / в UI: Запрос у Player Controller его текущего управляемого Pawn.
- На стороне сервера: При создании игрока сервер сам создает экземпляр класса Pawn и привязывает его к контроллеру.
- В скриптах (Hammer, Unreal Blueprints): Через специальные узлы (типа Get Player Pawn или Get Actor Of Class).
- Из другого объекта: При столкновении или "лучевом трассировании" (raycast) вы получаете ссылку на сущность, с которой столкнулись, и можете проверить, является ли она Pawn.
Конкретный API зависит от движка (Source SDK, Unreal Engine C++/Blueprint).
4.
Это простое и важное различие:
- Entity List (Список сущностей) — это контейнер, хранилище. Просто массив, список или словарь всех активных сущностей в текущей игре. По сути, это база данных с указателями на объекты CBaseEntity. Его основная функция — хранить и позволять искать сущности по ID или типу.
- Аналог: Телефонная книга, в которой записаны все сотрудники компании (игрового мира).
- Entity System (Система сущностей) — это вся логика и менеджмент. Она использует Entity List как одну из своих структур данных. Но кроме этого она отвечает за:
- Создание сущности (аллокация памяти, добавление в список).
- Вызов Spawn() (появление) у сущности.
- Вызов Think() (обновление логики) у всех сущностей каждый кадр.
- Обработку коллизий между сущностями.
- Рассылку сообщений между сущностями (например, "игрок нажал на кнопку" -> сообщение кнопке -> сообщение двери, которую она открывает).
- Уничтожение сущностей (удаление из списка, освобождение памяти).
- Аналог: Вся система управления персоналом (HR) компании. Телефонная книга (Entity List) — лишь один из ее инструментов.
Итог: Entity List — это
часть Entity System. Список — это данные, а Система — это код, который этими данными управляет.