Система катсцен | Девблог 2 часть | Eclipse Of Energy
Что за система такая?
Катсцена (или cinematic) — это управляемая игрой последовательность событий, во время которой игрок временно теряет контроль над персонажем: камера и герой «играют» сценарий, показывается диалог, появляются и уходят NPC.
В нашей игре катсцены решают сразу несколько задач:
- Сюжетная подача - Создание интро, катсцен, диалоги с НПС
- Динамичные сцены — спавн персонажей «на глазах» у игрока, их перемещение по сцене, появление и исчезновение.
- Игровой прогресс — прямо из катсцены можно выдать предмет, добавить квест, завершить его или вручить оружие.
Как все устроено?
Система построена на трёх слоях:
Действия - CutsceneAction
Базовый «кирпичик» — это ресурс CutsceneAction с полем type (enum). Каждое действие описывает одно атомарное событие сцены:
enum ActionType {
WAIT,
MOVE_ACTOR,
CALL_METHOD,
SHOW_TEXT_OVER_ACTOR,
MOVE_ACTOR_BY_POINTS,
SPAWN_ACTOR,
REMOVE_ACTOR,
ADD_ITEM,
ADD_QUEST,
COMPLETE_QUEST,
GIVE_WEAPON
}
| # | Действие | Назначение | Ключевые поля |
|---|---|---|---|
| 0 | WAIT | Пауза в N секунд | duration |
| 1 | MOVE_ACTOR | Движение актёра вдоль Path2D | actor_path, path_node, move_speed |
| 2 | CALL_METHOD | Вызов любого метода на узле | target_path, method_name, args, wait_for_signal |
| 3 | SHOW_TEXT_OVER_ACTOR | Показать реплику над актёром | text_actor_path, text_to_show, wait_for_completion |
| 4 | MOVE_ACTOR_BY_POINTS | Движение по списку точек | actor_path, points, points_speed |
| 5 | SPAWN_ACTOR | Создать NPC/объект | spawn_id, scene_path, spawn_position, parent_path, skin |
| 6 | REMOVE_ACTOR | Удалить актёра | remove_target |
| 7 | ADD_ITEM | Выдать предмет в инвентарь | item_resource_path, item_amount |
| 8 | ADD_QUEST | Добавить квест | quest_resource_path |
| 9 | COMPLETE_QUEST | Завершить квест с наградой | complete_quest_id |
| 10 | GIVE_WEAPON | Выдать оружие в слот | weapon_resource_path, weapon_slot |
Действия можно хранить двумя способами:
- Инлайн — прямо в файле катсцены как
sub_resource; - Отдельным
.tres— как переиспользуемый блок (в проекте естьWait(4).tres,Move_Player1.tres,Set_Skin(No_Suit).tres). Это удобно, когда один и тот же кусок нужен в нескольких сценах.
Данные сцены — CutsceneData
Ресурс, который собирает сцену в одно целое:
Это упорядоченный список действий плюс флаги показа кинематографических полос.
Исполнитель — CutsceneManager (автозагрузка)
CutsceneManager — глобальный синглтон (autoload). Он:
- Блокирует игрока — отключает
can_moveи переводит в режим управления катсценой (set_is_controlled(true)). - Показывает кинематографические полосы (если включено).
- Последовательно исполняет каждое действие —
await-ит их завершение, поэтому сцена строго линейна. - В конце прячет полосы, разблокирует игрока и эмитит сигнал
cutscene_finished. - Шаг 1. Создайте ресурс катсцены. Создайте новый CutsceneData (например Cutscene1.tres) и заполните actions в порядке, в котором события должны идти.
- Шаг 2. Соберите действия Для каждого события создайте CutsceneAction, выберите type и заполните его поля. Пример из Cutscene1.tres (сцена интро):
- Шаг 3. Запустите катсцену из любого места
- CutsceneManager — глобальный, поэтому вызывать можно откуда угодно одной командой:
Движение реализовано отдельным классом ActorFollower (PathFollow2D): он ведёт актёра по кривой Path2D (или по массиву точек), синхронизируя анимацию, скорость шагов и направление персонажа.
Зависимости менеджер получает «на лету» перед запуском: игрока — из Global.player(глобальный скрипт), диалоговый менеджер и полосы — через Global.npc(тот же глобальный скрипт). Это значит, что катсцена умеет «понимать» текущую сцену, не будучи привязанной к одной конкретной.
Как этим пользоваться?
Для того чтобы создать свою катсцену, необходимо сделать несколько шагов:
WAIT → пауза 2.5 с
CALL_METHOD → set_skin("suit") на игроке
SHOW_TEXT_OVER_ACTOR → «Сегодня мое вступление в элитную группу.»
SHOW_TEXT_OVER_ACTOR → «Я так долго этого ждал...»
SPAWN_ACTOR → создать "Soldier" у точки (1729, 1505)
MOVE_ACTOR_BY_POINTS → солдат подходит к игроку
SHOW_TEXT_OVER_ACTOR → «Номер 574, вас вызывают на главный мостик.»
REMOVE_ACTOR → убрать "Soldier"
ADD_QUEST → добавить квест Quest_CutScene1
cutscene_manager.play_cutscene(preload("res://project/data/Resources/Cut-Scenes/Cutscene1.tres"))
Итог
Главный плюс системы — разделение «что показать» и «как показать». Нарратив собирается в редакторе из готовых действий, а исполнение берёт на себя один стабильный менеджер. Хотим новое действие — добавляем один enum в CutsceneAction и один match-кейс в менеджере, и оно сразу доступно всем катсценам проекта. Так сюжетные сцены пишутся быстро, читаются легко и не дублируют код.
Если возникнут вопросы или вы хотите получить готовые скрипты с системой катсцен, то можете писать мне в ТГ(@printNam) или в комменты моего ТГК


Комментарии (0)
Войдите, чтобы написать комментарий
Войти