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