Unity / アニメーション(ブレンドツリー編)
セノーテ
みなさんこんにちは🌚
高校の時の友達とカラオケオールをしてきてめっちゃ眠いブルーノです。3人で6時間は結構キますね笑 でも彼らに会うのも久しぶりでとても楽しかったです。
今回はUnityアニメーションの醍醐味であるブレンドツリーについて勉強していきたいと思います。
ブレンドツリー
これまでのアニメーションの回において、様々な動きをつなげたり、色の変化にグラデーションをつけたりしましたが、その要所要所の設定しかしていなかったのに実際にゲームを再生して見ると色は滑らかに変わったり動きも前の動きと次の動きが少し被って中間の動きが生み出されることで自然な挙動になっていましたね。この中間の動きを生み出すことがブレンドであり、複雑な動きをブレンドしたいときに便利なのがこのブレンドツリーなのです。
では複雑な動きのオブジェクトを一から知識もないのに作るのは難しいのでAssetsの[Import Package]から[Characters]をクリックして標準アセットのキャラクターをダウンロードし、これを見ていきましょう。
これがUnity標準装備のイーサンくんのプレファブです。Rigid Bodyやコライダー、アニメーションの挙動が一通り詰まっていますね。便利!
ではイーサンくんを動かすために適当な大きさのPlaneで足場を作り、その上にPrefabごとヒエラルキーにこのThirdPersonControllerを配置しましょう。
ちょっと大きすぎたかな?笑 まあちょっと拡大すれば良いでしょう
早速イーサンくんのアニメーションコントローラーをのぞいて見ましょう。方法はなんでも構いません。3つのステートがありますね。名前から察するにGrounded(地上)、Airborne(空中)、Crouching(しゃがみ)の3つの状態があるようです。とりあえず再生して見ると、方向キーやWASDキーでイーサンくんがその向きに動き出し、スペースキーでジャンプしたりすることができます。このコントローラのそれぞれのスクリプトをのぞいてみたのですが....
ちっともわかりませんでした😭😭😭
C#の勉強をしてから臨んだのに。。。やはりUnity用のスクリプトリファレンスも勉強しなければならないようですね...今回はとりあえずコードの中身はあまり追求しないでブレンドツリーの勉強をします。。
さて、このアニメーションウィンドウのGroundedこそが実はブレンドツリーなのです。ダブルクリックして覗くと
なんかいっぱい伸びてる!!
この左のステートこそがGroundedの正体であり、右のステートたちはそれぞれ小さなアニメーションたちです。よく見ると名前に「HumanoidIdle」などの名前がありますね。クリックすると右下に変なおっさんが現れその動きを繰り返してくれます。
またブレンドツリーを開いたまま再生して移動させると右のステートたちの色の濃さが変わります。
これがアニメーションのブレンド具合を表します。
ではブレンドツリーのインスペクターを見てみます
一見難しそうですが...下のリストに各モーションの指定と移動距離が書いてあります。赤い点が現在の状態で、青い点はそれぞれの動きの状態を表します。この青い点をクリックするとこのモーションの影響範囲が青色で表示され、下にそれがどのモーションなのかが表示されます。
白いぼやが網目状に伸びているように見えますがこれはどちらかというと逆で、この青い点から青いもやが伸びていてアニメーションの影響具合が重なっている部分が白くなっているのです。
赤い点をドラッグするとブレンドツリーにおけるその地点のTurnやForwardの値がわかります。しかしこれでもだいぶ複雑なので前後の動き以外を削除してしまいます
「HumanoidIdle」「HumanoidWalk」「HumanoidRun」以外のモーションを選択した状態で下の「−」(マイナス)を押すとそのモーションを削除できます。
これでこのイーサンくんは現在「止まる」「歩く」「走る」ことしかできなくなってしまいました。方向転換こそできるものの、再生してみると以前よりも動きが固くなっているのがわかります(まあこれくらいの動きのゲームならいくらでもあるので気にはなりませんが)。
まず3つの直線的な関わりの動きしかないので二次元的な設定画面はあまり意味はありませんね。インスペクター上部の[Blend Type]から[1D]を選択しましょう。すると以前やったアニメーションのような画面になります。
Parameterの最大値が0.7くらいになっているので1にしておきます。次に、イーサンくんにもともとついているコントロールスクリプトを全て切っておきます。
チェックマークを外しておけば機能しないんでしたね。[Remove Component]で消してしまっても構いません。ここから自分でスクリプトを書いてイーサンくんを動かしてみましょう
Animator型の変数を用意し、GetComponent<Animator> と次の .SetFloat でAnimatorのForwardの値にアクセスします。Startイベントで最初は0を代入します。UpdateイベントではInput.GetAxisメソッドで垂直方向のキー入力に応じて1 ~ -1の値をForwardに代入するようにしています。- が代入されることもあり得るのでその場合(18 - 19行目)は0を代入します。
実行すると前にイーサンくんが歩いて→走り出します。これで歩く→走るの動作をスムーズに行うことができました。
GetAxisメソッドは方向キー入力を受け取れるメソッドですがGetKeyメソッドというものも存在し、こちらも方向キーを含むキー入力を受け取ることができます。この二つは何が違うかというと、GetKeyは押されているかどうかだけを判断するいわゆるbool型を返しますが、GetAxisはキーを押されているとやんわり1 ~ -1の値が変動していきます。よってこれをForward値に送ることでスムーズに走り出すことができるようです。今回はここまでにしておきます。
ちょっとこのところ記事が長くなってしまいがちですね😓実はもう一回アニメーション編があるのですがこれで1章が終わりそれが12章ほど、そしてこれでもだいぶ端折って説明してあるというのですからUnityの底は計り知れません。