明天实现的内容:
攻打动画层
为了退出新的攻打动画,咱们要设计一个攻打动画层。新的动画层一是为了使老动画层不至于臃肿,而是为了配置Avatar Mask。

配置Avatar Mask
新建一个Avatar Mask,我晓得这里是多个Avatar Mask。咱们须要的是一个全身都被抉择的Mask。将Mask放到动画层设置外面。


接下来要做的就是,在攻打时调整动画层权重。这要在代码中做到。在进入代码之前,给idle增加StateMachineBehaviour脚本FSMClearSignals。咱们须要革除的是attack信号来避免累积。

攻打信号输出
和翻滚一样攻打属于一次性触发信号。因为应用键盘,所以咱们采纳MouseButtonDown(0)。

    // 一次性信号    public bool attack; //攻打信号        // Update is called once per frame    void Update()    {        // ...                // 攻打信号        attack = Input.GetMouseButtonDown(0);        attack = Input.GetKeyDown(keyAttack);    }

攻打动画的根本代码逻辑
因为有了attack层,咱们的动画机控制代码简单了一点。咱们须要应用代码批改动画层的权重。

    // 进入Attack层的动画节点attack_oneHand_A时执行的办法    // 通过PlayerController动画机中的attack_oneHand_A节点上挂载的FSMOnEnter调用    public void OnAttack_oneHandAEnter()    {        // 敞开输出模块        pi.inputEnabled = false;        // 批改攻打动画层权重为1        m_anim.SetLayerWeight(m_anim.GetLayerIndex("Attack"), 1.0f);    }    // 在Attack层的动画节点attack_oneHand_A更新时执行的办法    // 通过PlayerController动画机中的attack_oneHand_A节点上挂载的FSMOnEnter调用    public void OnAttack_oneHandAUpdate()    {        // 计算攻打时的冲量        m_thrustVec = model.transform.forward * m_anim.GetFloat("attackOneHandAVelocity") * m_planarVec.magnitude * 4f;    }    // 进入Attack层的动画节点idle时执行的办法    // 通过PlayerController动画机中的idle节点上挂载的FSMOnEnter调用    public void OnAttackIdleEnter()    {        // 关上输出模块        pi.inputEnabled = true;        // 批改攻打动画层权重为0        m_anim.SetLayerWeight(m_anim.GetLayerIndex("Attack"), 0);    }

办法仍旧是相熟的配方,通过FSMOnEnter的SendMessage来通知PlayerController以后进入攻打动画了,进而从新设置层权重。m_anim.GetLayerIndex来让程序帮你找到LayerIndex。
接下来,攻打时咱们的角色不能再按玩家的输出任意挪动,否则会很奇怪(很显著了)。所以在攻打时要输出模块敞开,不必锁定立体挪动(m_lockPlanar)。
如果角色在攻打时自身处于挪动状态,咱们就须要体现出惯性,h5游戏角色须要向前冲一点,要实现这个成果,能够应用和jab相似的计划,也就是在攻打动画中退出一个曲线示意冲量的速度大小,只不过这次还要和m_planarVec.magnitude相乘,能力和角色的速度相干,失去的就是看起来不错的惯性成果。至于为什么挪动时攻打会在敞开输出模块之后还能失去惯性成果,是因为咱们的输出模块不是间接将输出值拿来就用,而是应用了Slerp。