Створення Менеджера Станів
Стан:
public abstract class State
{
public abstract void StartState();
public virtual void UpdateState()
{
}
public abstract void EndState();
}
Абстрактні методи:
public abstract void StartState();
public abstract void EndState();
— це абстрактні методи.
Абстрактний метод не має тіла (реалізації) тут і повинен бути
реалізований будь-яким не абстрактним класом, який наслідує цей клас State
.
Віртуальний метод:
public virtual void UpdateState() {}
— це віртуальний метод.
Віртуальний метод має реалізацію (у цьому випадку порожнє тіло {}
), але може бути перевизначений похідними класами, якщо їм потрібна інша поведінка.
Як це працює для нашого ворога
Наслідування стану:
Клас State
буде наслідуватися іншими конкретними станами. Наприклад, можуть бути класи IdleState
, AttackState
та PatrolState
, які наслідують від State
.
Кожен з цих станів реалізує власні версії методів StartState()
, UpdateState()
та EndState()
.
Поведінка ворога:
Поведінка ворога керується за допомогою станів: StartState()
ініціалізує стан, UpdateState()
оновлює поведінку під час стану, а EndState()
виконує очищення після завершення стану.
Використання абстрактного класу:
Оголошення State
абстрактним класом гарантує, що всі конкретні стани реалізують необхідні методи, структуруючи поведінку ворога та спрощуючи керування станами без змін у скрипті ворога.
Менеджер станів:
public class StateManager
{
State currentState;
public StateManager(State startingState)
{
currentState = startingState;
currentState.StartState();
}
public void ChangeState(State newState)
{
currentState.EndState();
currentState = newState;
currentState.StartState();
}
public void UpdateStates()
{
currentState.UpdateState();
}
}
Пояснення
Конструктор public StateManager(State startingState)
ініціалізує StateManager
із початковим станом. Він встановлює currentState
у startingState
та викликає currentState.StartState()
, щоб ініціалізувати його.
Метод ChangeState
, public void ChangeState(State newState)
, змінює стан ворога. Він викликає currentState.EndState()
для завершення поточного стану, встановлює currentState
у новий стан і потім викликає currentState.StartState()
для ініціалізації нового стану.
Метод UpdateStates
, public void UpdateStates()
, оновлює поточний стан, викликаючи currentState.UpdateState()
, щоб виконати дії, пов’язані з цим станом.
Як це працює для нашого ворога
Коли ми створюємо StateManager
для нашого ворога, конструктор ініціалізує початковий стан. Коли ворог повинен змінити свою поведінку, викликається метод ChangeState
, який завершує поточний стан за допомогою EndState()
, встановлює новий стан і ініціалізує його через StartState()
. Під час гри метод UpdateStates
викликається багаторазово для виконання дій поточного стану через UpdateState()
.
Приклад робочого процесу:
Ворог починає у стані IdleState
, при цьому створюється StateManager
і викликається IdleState.StartState()
для налаштування поведінки очікування. Коли ворог виявляє гравця, викликається ChangeState(new AttackState())
, що завершує поведінку очікування через IdleState.EndState()
. Поточний стан встановлюється у AttackState
, і AttackState.StartState()
ініціює поведінку атаки.
Кожного кадру викликається UpdateStates()
, і якщо поточний стан — це AttackState
, AttackState.UpdateState()
обробляє дії атаки.
Завдяки класу StateManager
ми можемо легко організовано керувати різними поведінками нашого ворога та перемикатися між ними.
Стан очікування
public class IdleState : State
{
Animator animator;
public IdleState(Animator animator)
{
this.animator = animator;
}
public override void StartState()
{
animator.SetBool("idle", true);
}
public override void EndState()
{
animator.SetBool("idle", false);
}
}
Пояснення
Конструктор public IdleState(Animator animator)
приймає об'єкт Animator
як параметр і присвоює його змінній класу animator
. Метод StartState
, public override void StartState()
, встановлює булевий параметр "idle" в аніматорі у значення true, що запускає анімацію очікування. Метод EndState
, public override void EndState()
, встановлює параметр "idle" у значення false, зупиняючи анімацію очікування.
Як це працює для нашого ворога
Коли ворог переходить у IdleState
, метод StartState()
встановлює параметр "idle" в аніматорі у значення true, запускаючи анімацію очікування, що створює вигляд бездіяльності ворога. Коли ворог залишає IdleState
, метод EndState()
встановлює параметр "idle" у значення false, зупиняючи анімацію очікування та готуючи ворога до переходу в інший стан, наприклад, руху або атаки.
Приклад робочого процесу
StateManager
встановлює стан ворога на IdleState
, викликаючи IdleState.StartState()
, щоб встановити параметр аніматора "idle" у значення true, запускаючи анімацію простою. При зміні поведінки ворога StateManager
викликає IdleState.EndState()
, встановлюючи параметр "idle" у значення false та зупиняючи анімацію простою. Далі StateManager
переводить ворога у новий стан, наприклад, AttackState
або PatrolState
.
Використовуючи клас IdleState
, ми забезпечуємо плавний перехід ворога у стан простою та вихід з нього, що робить поведінку більш динамічною та реалістичною. Така структура також дозволяє легко додавати або змінювати поведінку простою ворога без впливу на інші частини коду ворога.
Дякуємо за ваш відгук!