Unityで銃を撃つ #2 アニメーションを遷移させる

投稿者: | 2019-12-30

前の記事でインポートした銃のアセットにはデフォルトでアニメーションが付いています。
銃のアニメーターコンポーネントのControllerをダブルクリックすると、アニメーターコントローラーが表示されます。

Aキーを押すと全体が表示されます。

3つのアニメーションを3つのトリガーのパラメータを使って遷移させます。

ゲームがスタートするとまず緑からオレンジの長方形のステートにすぐに遷移して、そこからは現在のステートとセットされたトリガーパラメータや時間によって他のステートに遷移させられます。

オレンジのステートから銃を撃っているときの「MachineGin_shoot」ステートへの矢印をクリックすると、遷移の条件のところに、「Shoot」とあります。

逆向きの矢印のインスペクタを見てみても同じ名前のパラメータが追加されています。

つまり、何もしていない状態でShootトリガーがセットされると銃を撃つアニメーションに切り替わって、もう一度Shootトリガーがセットされると銃を撃つアニメーションが止みます。

何もしていないときや、銃を撃っているときに「DoReload」トリガーをセットするとリロードのアニメーションが付いた「MachineGun_reload」ステートに移ります。

「MachineGin_shoot」ステートに戻る遷移は無いので、リロードしているときに銃を撃つステートには遷移できません。
デフォルトのステートに戻る遷移にはConditionsが設定されていなく、Has Exit Timeにチェックが入っています。

つまりリロード状態からは時間が立つと勝手にデフォルト状態に戻ります。
「MachineGun_open」ステートは今回は使いません。

パーティクルを再生するスクリプトに、アニメーターのトリガーをセットする処理を追加します。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GunScript : MonoBehaviour
{
    public ParticleSystem gunParticle;
    public GameObject gunLight;

    public Animator gunAnimator;


    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        // マウス左クリックを押した時
        if (Input.GetMouseButtonDown(0))
        {
            gunParticle.Play(); // パーティクルの再生
            gunAnimator.SetTrigger("Shoot");

        }
        // マウス左クリックを離した時
        else if (Input.GetMouseButtonUp(0)) 
        {
            gunParticle.Stop(); // パーティクルの停止
            gunAnimator.SetTrigger("Shoot");
        }

        if (Input.GetKeyDown(KeyCode.T)) // Tキーを押した時
        {
            gunLight.SetActive(!gunLight.activeSelf); // ライトのオンオフ
        }

        if(Input.GetKeyDown(KeyCode.R)) // Rキーを押した時
        {
            gunAnimator.SetTrigger("DoReload");
        }

    }
}

アニメーターコンポーネントの、SetTriggerメソッドを使うだけなので簡単です。

アニメーターはインスペクタからアタッチしています。

これでアニメーションの遷移はできますが、このままでは挙動がおかしいときがあります。
例えば、Rキーでリロードしているときに左クリックを押すと、銃を撃つアニメーションとパーティクルが、マウスをクリックしたときと離したときで逆に動きます。

マウスを離しているときに銃を撃つアニメーションだけが動いて、マウスを押すとパーティクルが再生されています。
これはやはりリロード状態から銃を撃つ状態への直接の遷移がないからです。

また、銃を撃っているときにリロードをすると、ステートは遷移するのにアニメーションが切り替わりますが、パーティクルは止まりません。

なので、「Shoot」トリガーはデフォルトのステートからしかセットできないようにして、Rキーを押すとパーティクルが停止するようにスクリプトを書き換えます。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GunScript : MonoBehaviour
{
    public ParticleSystem gunParticle;
    public GameObject gunLight;

    public Animator gunAnimator;


    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        // default状態で、マウス左クリックを押した時
        if (Input.GetMouseButtonDown(0) && gunAnimator.GetCurrentAnimatorStateInfo(0).IsName("defualt")) // ママ
        {
            gunParticle.Play(); // パーティクルの再生
            gunAnimator.SetTrigger("Shoot");

        }
        // MachineGin_shoot状態で、マウス左クリックを離した時
        else if (Input.GetMouseButtonUp(0) && gunAnimator.GetCurrentAnimatorStateInfo(0).IsName("MachineGin_shoot")) 
        {
            gunParticle.Stop(); // パーティクルの停止
            gunAnimator.SetTrigger("Shoot");
        }

        if (Input.GetKeyDown(KeyCode.T)) // Tキーを押した時
        {
            gunLight.SetActive(!gunLight.activeSelf); // ライトのオンオフ
        }

        if(Input.GetKeyDown(KeyCode.R))
        {
            if(gunParticle.isPlaying)
            gunParticle.Stop(); // パーティクルの停止

            gunAnimator.SetTrigger("DoReload");
        }

    }
}

コメントを残す

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