Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Стан атаки | Поведінка Ворога
Бійцівська гра в Unity
course content

Зміст курсу

Бійцівська гра в Unity

Бійцівська гра в Unity

1. Система анімації Unity
2. Поведінка гравця
3. Поведінка Ворога
4. Покращення гри
5. Покращення гри Flappy Bird

bookСтан атаки

Пояснення класу AttackState

Клас AttackState є специфічним станом, який обробляє поведінку атаки ворога. Цей клас наслідує від класу State і включає методи для початку, оновлення та завершення стану атаки, а також обробки дії атаки.

Визначення класу та змінні-члени

Визначення класу:

public class AttackState : State; Цей клас наслідує від класу State, що означає, що він повинен реалізувати абстрактні методи, визначені в State.

Змінні-члени:

string attackStateName; Ім'я стану атаки, яке використовується в аніматорі. bool isAttacking; Прапорець, що вказує, чи ворог зараз атакує. Animator animator; Контролює анімації. Transform transform; Трансформація ворога, використовується для позиціонування та променевого відстеження. float range; Діапазон атаки. int damage; Шкода, завдана атакою. LayerMask playerLayer; Маска шару, що використовується для ідентифікації гравця.

Конструктор

Конструктор ініціалізує AttackState з необхідними компонентами: Transform для позиціонування, Animator для анімацій, маска шару для ідентифікації гравця, ім'я стану атаки, значення шкоди та діапазон атаки. Він встановлює ці значення відповідним змінним-членам.

Метод StartState

Цей метод встановлює isStateFinished в false, запускає анімацію атаки, встановлюючи відповідний булевий параметр в аніматорі в true, і скидає прапорець isAttacking в false.

Метод EndState

Цей метод зупиняє анімацію атаки, встановлюючи відповідний булевий параметр в аніматорі в false.

Метод UpdateState

Цей метод викликається кожен кадр і запускає метод Attack для виконання дії атаки.

Метод StartAction

Цей метод встановлює isAttacking в true, вказуючи, що дія атаки розпочалася.

Метод FinishMovement

Цей метод встановлює isAttacking в false, вказуючи, що дія атаки завершилася.

Метод Attack

Цей метод виконує дію атаки. Якщо isAttacking дорівнює true, він кидає промінь у напрямку, в якому дивиться ворог. Якщо промінь влучає в об'єкт на playerLayer, він викликає метод GetAttacked на влученому об'єкті, завдаючи шкоди та завершуючи дію атаки.

Чому ми зробили це так

  • Контроль над поведінкою атаки: Прапорець isAttacking дозволяє точно контролювати, коли повинна відбутися атака, роблячи поведінку більш чутливою до подій гри;
  • Динамічне виконання атаки: Постійно оновлюючи стан атаки ворога, AttackState забезпечує точну та динамічну атаку на гравця;
  • Інтеграція анімації: Використання параметрів аніматора забезпечує правильну синхронізацію анімацій ворога з його атаками, надаючи плавний та реалістичний досвід.

Як це працює в контексті

Вхід у стан атаки: Коли ворог входить у AttackState, викликається метод StartState, запускаючи анімацію атаки та скидаючи прапорець isAttacking.

Під час атаки: Метод UpdateState викликається кожен кадр. Він запускає метод Attack, щоб перевірити, чи повинна відбутися атака.

Початок атаки: Метод StartAction встановлює isAttacking в true, дозволяючи методу Attack виконати дію атаки.

Виконання атаки: Метод Attack кидає промінь для виявлення гравця та завдає шкоди, якщо гравець влучений.

Завершення атаки: Метод FinishMovement встановлює isAttacking в false, зупиняючи дію атаки.

Вихід зі стану атаки: Коли ворог залишає AttackState, викликається метод EndState, зупиняючи анімацію атаки. Структуруючи AttackState таким чином, ми забезпечуємо, що ворог може виконувати чутливі та динамічні атаки на гравця, з плавними переходами між анімаціями та станами.

Перехід Close:

closeTransition: Цей перехід перевіряє, чи знаходиться гравець на певній горизонтальній відстані (ThresholdDistance) від ворога. Якщо умова виконується, він випадково переходить до attack1 або attack2 з рівною ймовірністю (по 50% кожен);

Приклад коду:

Додавання closeTransition до стану Idle:

stateManager.AddStateTransition(idle, closeTransition); Цей рядок додає closeTransition до стану idle, дозволяючи машині станів перевіряти цю умову, коли ворог знаходиться в стані очікування.

Чому ми зробили це так

Система переходів дозволяє ворогу переходити в стан атаки на основі близькості гравця, підвищуючи залученість. Ймовірнісний підхід до вибору між різними атаками додає непередбачуваності, збільшуючи складність та інтерес гри.

Як це працює в контексті

Стан очікування: Поки ворог знаходиться в стані idle, він постійно перевіряє, чи знаходиться гравець в межах ThresholdDistance за допомогою closeTransition. Якщо гравець достатньо близько, closeTransition спрацьовує, і ворог переходить до attack1 або attack2.

Стан атаки:

Опинившись у attack1 або attack2, ворог виконує атаку. Після завершення атаки існуючий toIdleTransition повертає ворога в стан idle, готового знову перевірити умову closeTransition.

Додавши цей closeTransition, ми забезпечуємо, що ворог може більш динамічно і непередбачувано взаємодіяти з гравцем, коли гравець знаходиться в близькому діапазоні. Це покращує ігровий процес, роблячи поведінку ворога більш чутливою та захоплюючою.

Який метод відповідає за виявлення та нанесення шкоди гравцеві в межах досяжності в класі `AttackState`?

Який метод відповідає за виявлення та нанесення шкоди гравцеві в межах досяжності в класі AttackState?

Виберіть правильну відповідь

Все було зрозуміло?

Як ми можемо покращити це?

Дякуємо за ваш відгук!

Секція 3. Розділ 7
some-alt