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Перехід стану

На цих зображеннях ми бачимо клас Transition та клас StatePourcentage. Ці класи працюють разом, щоб керувати переходами між різними станами на основі певних умов та ймовірностей. Давайте розберемо, що робить цей код простими словами:

Пояснення

Клас StatePourcentage

Визначення класу: Рядок public class StatePourcentage визначає клас з назвою StatePourcentage. Цей клас містить інформацію про стан та відсоткову ймовірність переходу до цього стану.

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

public State state; містить посилання на стан. public float percentage; містить відсоткову ймовірність переходу до цього стану.

Конструктор:

public StatePourcentage(State state, float percentage) - це метод-конструктор. Він приймає State та float як параметри та призначає їх змінним-членам.

Клас Transition

Визначення класу: Рядок public class Transition визначає клас з назвою Transition. Цей клас обробляє логіку переходу між станами на основі умови та відсотків.

Змінні-члени: Func<bool> condition; - це делегат, який містить функцію умови. Ця функція повертає булеве значення, яке вказує, чи виконана умова переходу.

List<StatePourcentage> availableStates; - це список, який містить кілька об'єктів StatePourcentage, що представляють потенційні стани для переходу та їх відповідні ймовірності.

Конструктор: public Transition(Func<bool> condition, params StatePourcentage[] statePourcentage) - це метод-конструктор. Він приймає функцію умови та масив об'єктів StatePourcentage як параметри. Він ініціалізує змінну-член condition наданою функцією умови та створює новий список для availableStates, додаючи кожен об'єкт StatePourcentage з масиву до цього списку.

Метод GetState: public State GetState() - це метод, який визначає, до якого стану перейти на основі випадкового вибору та наданих відсотків. Він генерує випадкове число від 0 до 100 і перебирає доступні стани, накопичуючи їх відсотки, поки не знайде стан, який відповідає випадковому числу.

Метод IsConditionMet: public bool IsConditionMet() - це метод, який перевіряє, чи виконана умова переходу, викликаючи функцію умови. Він повертає результат функції умови.

Як це працює для нашого ворога

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

Визначення наступного стану: Коли перехід активується, метод GetState() випадково вибирає наступний стан на основі визначених ймовірностей. Це додає елемент непередбачуваності до поведінки ворога, роблячи її більш динамічною та складною.

Перевірка умов: Метод IsConditionMet() використовується для перевірки, чи виконані умови для переходу. Якщо умова істинна, перехід може відбутися, і метод GetState() визначає наступний стан.

Менеджер станів

Зміни та Додатки

Словник Переходів Станів: Dictionary<State, List<Transition>> stateTransitions; - це словник, який містить списки переходів для кожного стану. Кожен стан асоціюється зі списком можливих переходів, які можуть бути перевірені під час оновлення стану.

Конструктор: stateTransitions = new Dictionary<State, List<Transition>>(); ініціалізує словник stateTransitions у конструкторі, забезпечуючи готовність до зберігання переходів для різних станів.

Метод AddStateTransition: public void AddStateTransition(State state, Transition transition) - це метод, який додає перехід до списку переходів для заданого стану. Якщо стан ще не має запису в словнику, створюється новий запис з порожнім списком переходів. Потім перехід додається до списку переходів для вказаного стану.

Метод UpdateStates: Метод UpdateStates було оновлено, щоб спочатку перевіряти переходи, отримуючи список переходів для поточного стану після його оновлення за допомогою currentState.UpdateState(deltaTime);. Потім він оцінює кожен перехід у списку, щоб перевірити, чи виконана умова переходу за допомогою transition.IsConditionMet(). Якщо умова переходу виконана, він змінює стан за допомогою ChangeState(transition.GetState()); і перериває цикл, щоб запобігти множинним змінам стану в одному оновленні.

Чому були внесені ці зміни

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

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

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

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

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

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