У меня есть контроллер Animation, который воспроизводит анимации (2d без времени выхода) при срабатывании правильного состояния.Обычно это делается через bool, такой как «isJumping» или «isDucking» из самого поведения.Я сделал это таким образом, чтобы поведение не связывалось с состоянием анимации.Контроллер анимации знает о поведении.
У меня есть поведение «Атака», в котором хранятся такие данные, как урон, скорость, задержка.У меня есть скрипт "AttackCombo", который содержит массив поведения "Attack".При вводе он выполнит логику атаки и перейдет к следующей атаке в массиве.Это позволяет мне настраивать атаку и помещать ее в комбо, однако с этим методом я не могу использовать bool, такой как «IsAttacking», так как у поведения есть несколько экземпляров в отличие от прыжка или утки.Я не хочу делать отдельный класс для каждой атаки в комбо, я уверен, что есть лучший, более модульный способ решения моей проблемы.
Я открыт для более эффективных способов обработки анимацииВ общем, я провел исследование и не могу найти много информации о лучших практиках с 2d переходами для Unity.
public class AnimationManager: MonoBehaviour
{
private Animator animator;
private InputState inputState;
private ColisionState colisionState;
private Walk walkBehavior;
private Duck duckBehavior;
private void Awake()
{
inputState = GetComponent<InputState>();
colisionState = GetComponent<ColisionState>();
animator = GetComponent<Animator>();
walkBehavior = GetComponent<Walk>();
duckBehavior= GetComponent<Duck>();
}
private void Update()
{
if (colisionState.isStanding)
{
ChangeAnimationState(0);
}
if (inputState.absVelX > 0)
{
ChangeAnimationState(1);
}
if (inputState.absVelY > 0)
{
ChangeAnimationState(2);
}
if (duckBehavior.isDucking)
{
ChangeAnimationState(3);
}
}
private void ChangeAnimationState(int value)
{
animator.SetInteger("AnimState", value);
}
}
public class AttackCombo : MonoBehaviour
{
public Attack[] Attacks;
public int CurrentIndex;
private void Update()
{
if (CanAttack)
Attacks[CurrentIndex].OnAttack();
// Normally this would let the Animation Controller to play
the animation but since there are multiple states depending on the index
this method won't work.
Attacks[CurrentIndex].isAttacking = true;
CurrentIndex++;
}
}