关于unity:黑魂复刻游戏的玩家控制器攻击的基础实现Unity随手记

43次阅读

共计 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。

正文完
 0