(この記事の使用環境: Unity5.4.2f2 Personal、Windows10


前回からの続き。

今回は素手(キック)と武器の攻撃モーションを付けてみました。武器攻撃のほうには連続攻撃モーションも付けています。
こんな感じ。


前回武器の出し入れモーションを付けたので、その状態に応じて攻撃モーションを変えています。
Animatorの遷移図はこんな感じ。
BlogPaint

BlogPaint

武器装備状態と素手状態からそれぞれ攻撃モーションへの遷移を作っています。
武器攻撃モーションは連続攻撃モーションへの遷移も。

パラメータに"Attack"(Trigger)と、連続攻撃用に"ComboAttack"(Trigger)と"ComboChance"(Bool)を追加しています。
全画面キャプチャ 20161231 95552-001

連続攻撃に関する設定、1撃目から2撃目への遷移設定はこんな感じ。
ComboChanceがtrueの間のみ連続攻撃が成立するようにしています。
全画面キャプチャ 20161231 100519
全画面キャプチャ 20161231 100640

ComboChanceのタイミング管理のため、1撃目のアニメーションのところに StateMachineBehaviour のスクリプト "ContinuousAttack" を作ってアタッチしています。
全画面キャプチャ 20161231 100519-001
全画面キャプチャ 20161231 100828

ContinuousAttack スクリプトはこんな感じ。
1撃目の攻撃モーションに入ってから1.5秒~2.5秒の間だけ、ComboChanceをtrueにして連続攻撃受付しています。
StateMachineBehaviour は初めて触りましたが、こんな感じでシンプルに使う分には難しくなさそうです。

using UnityEngine;
using System.Collections;

public class ContinuousAttack : StateMachineBehaviour
{

    float deltaTime;
    float waitTime = 1.5f;  // 連続攻撃の受付開始時間(秒)
    float overTime = 2.5f;  // 連続攻撃の受付終了時間(秒)

    // OnStateEnter is called when a transition starts and the state machine starts to evaluate this state
    override public void OnStateEnter (Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        deltaTime = 0f;
    }

    // OnStateUpdate is called on each Update frame between OnStateEnter and OnStateExit callbacks
    override public void OnStateUpdate (Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        deltaTime += Time.deltaTime;

        if (deltaTime > waitTime && animator.GetBool ("ComboChance") == false)  // 連続攻撃の受付開始
        {
            animator.SetBool ("ComboChance", true);
        }

        if (deltaTime > overTime && animator.GetBool ("ComboChance") == true)   // 連続攻撃の受付終了
        {
            animator.SetBool ("ComboChance", false);
        }
    }

    // OnStateExit is called when a transition ends and the state machine finishes evaluating this state
    override public void OnStateExit (Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        animator.SetBool ("ComboChance", false);                                // 連続攻撃の受付終了
    }



    // OnStateMove is called right after Animator.OnAnimatorMove(). Code that processes and affects root motion should be implemented here
    //override public void OnStateMove(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {
    //
    //}

    // OnStateIK is called right after Animator.OnAnimatorIK(). Code that sets up animation IK (inverse kinematics) should be implemented here.
    //override public void OnStateIK(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {
    //
    //}
}

最後に、プレイヤーを操作するスクリプトへの追記内容。これだけ。
    void FixedUpdate ()
    {
        if (Input.GetMouseButtonDown(0))
        {
            anim.SetTrigger ("Attack");                 // 攻撃する

            if(anim.GetBool("ComboChance") == true)
            {
                anim.SetTrigger ("ComboAttack");        // 連続攻撃
            }
        }

今回は以上です。