Зміст курсу
Бійцівська гра в Unity
Бійцівська гра в Unity
Створення Менеджера Станів
Стан:
csharp
Абстрактні методи:
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
абстрактним класом гарантує, що всі конкретні стани реалізують необхідні методи, структуруючи поведінку ворога та спрощуючи керування станами без змін у скрипті ворога.
Менеджер станів:
csharp
Пояснення
Конструктор 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
ми можемо легко організовано керувати різними поведінками нашого ворога та перемикатися між ними.
Стан очікування
csharp
Пояснення
Конструктор 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
, ми забезпечуємо плавний перехід ворога у стан простою та вихід з нього, що робить поведінку більш динамічною та реалістичною. Така структура також дозволяє легко додавати або змінювати поведінку простою ворога без впливу на інші частини коду ворога.
Дякуємо за ваш відгук!