Cave: Руководство по началу работы
Иерархические автоматы состояний
Lesson 17 of 19 • 25 XP
Keep your place in this quest
Log in or sign up for free to subscribe, follow lesson progress, and access more learning content.
По мере роста вашей игры вам в конечном итоге понадобятся объекты, которые ведут себя по-разному в зависимости от того, чем они занимаются в данный момент. Противник может быть в состоянии покоя, патрулирования, преследования, атаки, оглушения или мертв. Дверь может быть закрыта, открываться, открыта или заблокирована. В битве с боссом могут быть несколько фаз.
Вот тут Состояния становятся полезными.

На изображении выше вы можете увидеть стандартного противника, которого создаёт Cave для нового проекта, с открытым состоянием машины состояний справа. Мы находимся в состоянии "блуждание", которое имеет внутренние состояния, такие как "случайный выбор" (начальное состояние, представленное зеленым цветом), "идти к случайному" и "покой". Вы можете видеть переходы между состояниями, обозначенные стрелками, и что каждое состояние может иметь свою собственную логику, либо на Python, как показано на изображении, либо в логических блоках.
Состояние машины помогает вам организовать поведение в четкие состояния, вместо того чтобы писать один большой скрипт, полный несвязанных условий.
В этом уроке вы узнаете:
- Что такое Состояние.
- Что такое Переход.
- Почему иерархические машины состояний полезны.
- Как компонент машины состояний Cave вписывается в сущность.
- Как работают
On Enter,On UpdateиOn Exit. - Как Python и Логические Блоки могут быть использованы внутри состояний и переходов.
Цель состоит в том, чтобы сначала понять умственную модель. Как только это станет ясным, редактор станет гораздо легче использовать.
Что такое Состояние?
Состояние описывает, что объект в данный момент делает.

Например, противник может иметь эти состояния:
ПокойПатрульПреследованиеАтакаМертв
Обычно только одно из этих состояний должно управлять противником в данный момент. Если противник находится в состоянии Патруль, он не должен также выполнять поведение атаки. Если он в состоянии Мертв, он не должен продолжать преследовать игрока.
Это упрощает понимание игрового процесса, потому что каждое состояние имеет четкую задачу.
| Состояние | Что оно может делать |
|---|---|
Покой |
стоять спокойно и ждать. |
Патруль |
перемещаться между точками. |
Преследование |
двигаться к игроку. |
Атака |
воспроизводить анимацию атаки и наносить урон. |
Мертв |
отключить движение и воспроизвести анимацию смерти. |
Вместо того, чтобы спрашивать "что должен делать противник в этом кадре?" из одного большого скрипта, вы можете спросить: "в каком состоянии находится противник в данный момент?"
Что такое Переход?
Переход - это правило, которое перемещает машину состояний из одного состояния в другое.

Например:
ПокойвПатруль, когда противнику следует начать движение, после таймера.ПатрульвПреследование, когда игрок обнаружен.ПреследованиевАтака, когда противник достаточно близко.АтакавПреследование, когда атака завершена.- Любое состояние в
Мертв, когда здоровье достигает нуля.
Переход - это не само поведение. Это решение, которое говорит: "теперь мы должны изменить состояние."
Это разделение важно. Состояние Атака может сосредоточиться на атаке, в то время как переход решает, когда пришло время войти в это состояние или покинуть его.
Почему иерархические машины состояний помогают
Cave использует подход иерархических машин состояний. Это означает, что состояния могут быть организованы внутри других состояний. Это полезно, потому что многие поведения имеют общую родительскую идею.
Например, противник может быть организован так:
Жив
Покой
Патруль
Преследование
Атака
Мертв
Состояния Покой, Патруль, Преследование и Атака все принадлежат более широкому состоянию Жив. Это упрощает структуру и может помочь вам избежать повторения одной и той же логики в нескольких местах.
Для начального проекта вы можете начать с простой плоской машины состояний. Но по мере усложнения игрового процесса иерархия помогает сохранять логику в чистоте.
Компонент Машины Состояний
Чтобы использовать машину состояний в сцене, сущность нуждается в Компоненте Машины Состояний.
Компонент соединяет сущность с активом машины состояний. Актив определяет состояния, переходы и логику, в то время как компонент выполняет эту логику на сущности во время игрового процесса.
Это похоже на другие системы Cave:
| Актив | Компонент |
|---|---|
| Python Скрипт | Python Компонент выполняет его. |
| Анимация | Анимационный Компонент воспроизводит его. |
| Машина Состояний | Компонент Машины Состояний запускает его. |
На практике это означает, что ваша сущность-противник может иметь Компонент Машины Состояний, и этот компонент может выполнять машину состояний ИИ противника.
Актив машины состояний может иметь свойства, как вы можете увидеть, перейдя на вкладку свойств, и эти свойства могут быть локально изменены в компоненте машины состояний, позволяя вам создавать модульные машины состояний с разными настройками для разных типов сущностей.
События Состояний
Каждое состояние может реагировать на три важных момента:
| Событие | Когда оно запускается | Общие Использования |
|---|---|---|
On Enter |
Когда состояние начинается. | Сброс таймеров, инициализация переменных, воспроизведение анимации, выбор цели. |
On Update |
Пока состояние активно. | Движение, проверка расстояний, обновление таймеров. |
On Exit |
Когда покидаем состояние. | Остановить эффекты, очистить временные значения. |
Например, состояние Атака может работать так:
On Enter: воспроизводить анимацию атаки.On Update: ждать момента удара или обратного вызова анимации.On Exit: очистить флаг атаки.
Это делает каждое состояние похожим на небольшое самодостаточное поведение.
Python внутри состояний
Машины состояний могут использовать Python для логики.
Внутри каждого Python-кода Состояния Cave предоставляет полезные переменные, такие как entity и scene, так что состояние может контролировать сущность, которая владеет Компонентом Машины Состояний.
Например, состояние может воспроизводить звук при входе:
cave.playSound("Враг Alert", volume=0.8)
Или оно может считать свойство из сущности:
health = entity.properties.get("health", 100)
Это держит логику состояния близко к поведению, к которому она принадлежит.
Python внутри переходов
Переходы также могут использовать Python. Для логики Python переходов Cave использует переменную под названием result. Если result становится True, переход может произойти. Например, переход к состоянию Мертв может проверять здоровье так:
health = entity.properties.get("health", 100)
result = health <= 0
Переход от Преследования к Атаке может проверять расстояние, если ваш скрипт противника или свойства предоставляют это значение:
player = scene.get("Игрок")
playerPos = player.getTransform().getWorldPosition()
entityPos = entity.getTransform().getWorldPosition()
distanceToPlayer = (playerPos - entityPos).length()
result = distanceToPlayer < 2.0
Точные данные зависят от вашей игры, но идея всегда одна и та же: переход решает, пришло ли время перейти от одного состояния к другому.
Совет: Во время перехода все локальные переменные, определённые в состоянии, из которого происходит переход, будут доступны для вас. Поэтому в предыдущем примере, где мы вычислили расстояние между сущностью и игроком, мы могли бы сохранить трансформацию игрока и трансформацию сущности в две переменные при входе в состояние, из которого этот переход происходит, чтобы сэкономить немного ресурсов, так как это затем кэшируется, и нам больше не нужно будет получать эти данные каждый кадр.
Логические Блоки внутри Машин Состояний
Машины состояний также могут использовать Логические Блоки.
Это полезно, когда вы хотите визуально построить поведение вместо написания кода на Python. Для многих игровых задач Логические Блоки являются очень доступным способом соединить события, условия и действия.
Они работают точно так же, как объяснено выше для кода Python внутри состояния или для перехода. Логические Блоки Состояния и Логические Блоки Перехода уже инициализированы с необходимыми блоками для начала.
Вы можете комбинировать Python и Логические Блоки в зависимости от того, что кажется более ясным для поведения, которое вы строите. Если Состояние или Переход имеют оба, то оба будут выполнены, и переход будет осуществлен, если одно ИЛИ другое произойдёт.
Когда использовать Машину Состояний
Используйте машину состояний, когда объект имеет четкие режимы поведения.
Хорошие примеры включают:
- ИИ противника.
- Фазы босса.
- Двери и интерактивные объекты.
- Поток миссии или квеста.
- Прогрессия кат-сцены.
- Состояния способности персонажа.
Вам не обязательно использовать машину состояний для малюток с одним действием. Если предмет забираемого мира просто воспроизводит звук и исчезает, может быть достаточно маленького скрипта на Python или настройки Логических Блоков.
Что вам стоит запомнить
Машина состояний организует игровой процесс в состояния и переходы.
Состояния описывают, что происходит в данный момент. Переходы решают, когда переключаться на что-то другое. On Enter, On Update и On Exit помогают сохранить каждое состояние сосредоточенным и читаемым.
Для простого поведения может быть достаточно скрипта. Для поведения с множественными режимами машина состояний обычно делает логику проще для понимания и проще для расширения.