UnityのAnimatorControllerでは立っている状態、歩いている状態、攻撃している状態などを作成し、条件によって遷移をさせるという事が出来ます。
そして、スクリプトでAnimatorの状態を取得し、今キャラクターを移動させてもいいのか?攻撃してもいいのか?といったアクションを起こす事はよくあります。
ですが、例えばキャラクターが連続攻撃を出来るようにした場合は最初の攻撃、2番目の攻撃、3番目の攻撃と3つの状態を作成します。
攻撃中にキャラクターを移動させたくない場合はAnimatorの状態が最初の攻撃、2番目の攻撃、3番目の攻撃の状態にいない時という条件が必要です。
さらにジャンプ中にも移動が出来ないという条件を加えると、
1 2 3 4 5 6 7 | if(input.magnitude > 0.1f && !animator.GetCurrentAnimatorStateInfo(0).IsName("Jump") && !animator.GetCurrentAnimatorStateInfo(0).IsName("Attack1") && !animator.GetCurrentAnimatorStateInfo(0).IsName("Attack2") && !animator.GetCurrentAnimatorStateInfo(0).IsName("Attack3") ) { |
スクリプトの条件には↑のようにAnimatorの状態をたくさん記述する必要が出てきます。
攻撃の状態が3パターンだけならまだいいですが、攻撃パターンが色々増えてくると全部記述するだけでスクリプトの可読性が落ちますし、単純に面倒臭いのもあるので、これを解消しましょう。
AnimatorControllerのTagを設定する
複数の似たような条件を一括で扱うのはそんなに難しい事はしません。
AnimatorControllerの状態を選択してインスペクタを表示しTagを設定するだけです。
↑のようにAttack1状態があったとしたらTagにAttackを設定します。
他の攻撃状態でAttack2、Attack3があれば全てAttackというタグを設定しておきます。
これで攻撃状態の時はこのAttackタグというのを使って攻撃状態かどうかを判断すればいい事になります。
つまり先ほどのスクリプトを変更し、
1 2 3 4 5 6 | if(input.magnitude > 0.1f && !animator.GetCurrentAnimatorStateInfo(0).IsName("Jump") && !animator.GetCurrentAnimatorStateInfo(0).IsTag("Attack") ) { |
という条件だけで攻撃中という事がわかるようになります。
↑のスクリプトではタグ名で条件判定していますが、ハッシュ値を生成して比較する事も出来ます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | // ハッシュ値を入れるフィールド宣言 private int hashAttack; void Start () { // Attackタグのハッシュ値生成 hashAttack = Animator.StringToHash("Attack"); } if(input.magnitude > 0.1f && !animator.GetCurrentAnimatorStateInfo(0).IsName("Jump") && animator.GetCurrentAnimatorStateInfo(0).tagHash != hashAttack ) { |
ハッシュ値をStringToHash(“タグ名”)を使って生成しておき、そのハッシュ値とAnimatorの現在の状態のハッシュ値を比較します。
終わりに
AnimatorのTagを設定して使うという基本的な事を今までしてなかったんですが・・・・(^_^;)
スクリプトの読みやすさ等を考えるとやっておくと便利ですね。
うむ・・・・久しぶりにめちゃくちゃ短い記事になった。