前の記事でインポートした銃のアセットにはデフォルトでアニメーションが付いています。
銃のアニメーターコンポーネントの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");
}
}
}