我有一个Animation控制器,可以在触发适当状态时播放动画(无退出时间的2d)。这通常是通过行为本身的“ isJumping”或“ isDucking”之类的布尔值完成的。 我这样做是为了使行为不与动画状态耦合。动画控制器了解行为。
我有一个“攻击”行为,该行为持有有关它的数据,例如损坏,速度,延迟。我有一个“ AttackCombo”脚本,其中包含“ Attack”行为数组。输入后,它将执行攻击逻辑并迭代到阵列中的下一个攻击。这使我可以自定义攻击并将其组合在一起,但是使用这种方法,我不能使用像“ IsAttacking”这样的布尔值,因为该行为具有与Jump或Duck不同的多个实例。我不想在组合中为每次攻击都创建一个单独的类,我敢肯定有更好的模块化方法来处理我的问题。
我愿意采用更好的方式来处理动画,我已经进行了研究,但是对于Unity的2d转换,我找不到太多关于最佳实践的信息。
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++;
}
}