共计 1610 个字符,预计需要花费 5 分钟才能阅读完成。
明天实现的内容:
攻打动画层
为了退出新的攻打动画,咱们要设计一个攻打动画层。新的动画层一是为了使老动画层不至于臃肿,而是为了配置 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。