如何处理一系列攻击(类实例)的动画状态更改?[2D]

时间:2019-02-21 01:12:17

标签: unity3d

我有一个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++;
            }
    }

0 个答案:

没有答案