Стан Ривка
Контролер Аніматора
public class AnimatorController : MonoBehaviour
{
[SerializeField] Enemy enemy;
public void FinishMovement()
{
enemy.FinishMovement();
}
public void EndCurrentState()
{
enemy.EndCurrentState();
}
}
Призначення AnimatorController
Клас AnimatorController
призначений для керування та виклику поведінки ворога через події аніматора. Це забезпечує плавну інтеграцію переходів анімацій і змін станів, гарантує відповідність поведінки ворога його анімаціям.
Визначення класу та член-змінна
Визначення класу:
public class AnimatorController : MonoBehaviour
визначає клас, що наслідує від MonoBehaviour
, дозволяючи прикріпити його до об'єкта GameObject
у Unity.
Член-змінна:
[SerializeField] Enemy enemy;
— це серіалізоване поле, яке дозволяє прив'язати об'єкт Enemy
до AnimatorController
безпосередньо через інспектор Unity.
Змінна enemy
є посиланням на скрипт ворога, який містить функції для керування його поведінкою.
Методи
Метод FinishMovement:
public void FinishMovement()
: Цей метод викликає enemy.FinishMovement()
. Призначений для виклику подією аніматора, що сигналізує про завершення анімації руху.
Метод EndCurrentState:
public void EndCurrentState()
: Цей метод викликає enemy.EndCurrentState()
. Призначений для виклику подією аніматора для сигналізації завершення поточного стану.
Інтеграція з подіями аніматора
Події аніматора:
Події аніматора — це спеціальні події, які можна розміщувати на часових шкалах анімацій у Animator Unity.
Ці події можуть викликати функції у скриптах, що прикріплені до того ж GameObject
або його дочірніх об'єктів.
Як це працює: Під час анімації, наприклад бігу чи атаки, у певних точках часової шкали можуть спрацьовувати події.
Dash State
public class DashState : State
{
Rigidbody2D rb;
Animator animator;
Transform player;
float speed;
Vector2 scale;
Vector2 velocity;
bool stopDashing = false;
public DashState(Rigidbody2D rb, Animator animator, Transform p, float DashSpeed)
{
this.animator = animator;
player = p;
this.speed = DashSpeed;
this.rb = rb;
scale = rb.transform.localScale;
velocity = new Vector2();
}
public override void StartState()
{
isStateFinished = false;
animator.SetBool("dash", true);
stopDashing = false;
}
public override void FinishMovement()
{
stopDashing = true;
}
public override void UpdateState(float deltaTime)
{
if (stopDashing) return;
scale.x = rb.position.x > player.position.x ? -1 : 1;
rb.transform.localScale = scale;
velocity.x = scale.x * speed;
rb.velocity = velocity;
}
public override void EndState()
{
animator.SetBool("dash", false);
}
}
Пояснення класу DashState
Клас DashState
— це окремий стан, який відповідає за поведінку ривка ворога. Цей клас наслідує від класу State
і містить методи для запуску, оновлення та завершення стану ривка, а також для обробки події завершення руху.
Конструктор
Конструктор ініціалізує DashState
необхідними компонентами: Rigidbody2D
для руху, Animator
, Transform
для гравця та швидкістю ривка. Встановлює початковий масштаб і ініціалізує вектор швидкості.
Метод StartState
Цей метод встановлює isStateFinished
у значення false
та запускає анімацію ривка, встановлюючи булевий параметр "dash" в аніматорі у true
. Також скидає прапорець stopDashing
у false
.
Метод FinishMovement
Цей метод встановлює stopDashing
у значення true
, що зупиняє дію ривка в методі UpdateState
.
Метод UpdateState
Цей метод оновлює позицію та орієнтацію ворога відповідно до позиції гравця. Якщо stopDashing
дорівнює true
, метод завершується достроково, припиняючи подальші оновлення. Він змінює масштаб ворога для розвороту у бік гравця, обчислює швидкість на основі параметра швидкості та застосовує цю швидкість до Rigidbody2D
.
Метод EndState
Цей метод зупиняє анімацію ривка, встановлюючи булевий параметр "dash" в аніматорі у значення false
.
Чому ми зробили саме так
Флаг stopDashing
дозволяє точно контролювати момент зупинки ривка, що робить поведінку ворога більш чутливою до ігрових подій. Постійне оновлення позиції та напрямку ворога у стані DashState
забезпечує швидкий і точний ривок у напрямку гравця. Використання параметрів аніматора гарантує правильну синхронізацію анімацій ворога з його рухами, забезпечуючи плавний і реалістичний ігровий досвід.
Дякуємо за ваш відгук!