【Unity】アニメーターコントローラーで銃のリロードを制御

投稿者: | 2020-08-07

リロードのアニメーションを作ってアニメーターコントローラーに設定してみました。

まずBlenderで作ったアニメーションをインポートして、アニメーターコントローラーの新しいステートにアタッチしました。アニメーションはブレンドされるので、他のアニメーションとの中間のアニメーションを作る必要はありません。

このステートには、銃に弾がないときのステートと銃を構えているときのステートから遷移を向けます。どちらもBool型のパラメーターがtrueになるとすぐに遷移が始まるように、Has Exit Timeのチェックが外れています。

また、アニメーションが自然にブレンドされるように、Transition Durationの長さをそれぞれ変えました。

そして、リロードが1回再生されると構えるステートに自動で遷移します。

パラメーターの切り替えはこのアニメーターコントローラーに追加したスクリプトで行います。

// OnStateUpdate

if (Input.GetKeyDown(KeyCode.R))
{        

    int reload = bullets_load_cap - bullets_load; // リロードしたい弾数

    // リロードする空きがあって、予備弾数が0でないとき
    if (reload != 0 && bullets_spare != 0)
    {
        animator.SetBool("Reload", true);
        animator.SetBool("NoAmo", false);

        // 十分な予備があるとき
        if (bullets_spare >= reload)
        {
            bullets_load += reload; // 満タンにする
            bullets_spare -= reload; // その分予備から引く

        }
        // ないとき
        else
        {
            bullets_load += bullets_spare; // 予備弾数をすべて加える
            bullets_spare = 0; // 予備弾数を0にする
        }
    }

}

// ---
override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
    // 攻撃可能なステートを出たら攻撃不可能にする
    if (stateInfo.IsTag("Attackable"))
    {
        attackable = false;
    }
    else if (stateInfo.IsName("Reload"))
    {

        animator.SetBool("Reload", false);
            
    }
}

Rキーを押したときに銃に空きがあって、予備の弾を持っていれば、リロードのステートへ遷移するためのパラメーターをtrueにします。そして、リロードのステートから出た時にこれをfalseに戻します。

これでリロードにアニメーションを付けられました。

コメントを残す

メールアドレスが公開されることはありません。