UnityアニメーターのBlendTreeで細かい動作をさせる

今回はアニメーターコントローラのBlendTreeを使ってキャラクターに細かい動作をさせてみようと思います。

UnityのアニメーターコントローラのBlendTreeを使う
Unityのアニメーターコントローラーのブレンドツリーの機能を使ってアニメーションを切り替えてみます

でラジコン操作のキャラクターが
曲がる時に体を傾けたアニメーションをさせる事は出来ていました。

こちらの記事を見る前にそちらを見て頂くとBlend Treeとはなんぞや!?
という事がわかると思いますので、参考にしてください。

今回は、ラジコン操作(↑のキーを押したらキャラクターが向いている方向に進む)ではなく、押した方向キーの方へ移動し、元々向いていた方向からの角度でアニメーションを変更していこうと思います。

正直なところ、向いている方向からどの程度右や左に向いたのか?を計算する方法がわからず四苦八苦していました。
Standard Assetsに入っている3rdPersonControllerのスクリプトのように作りたいのですが、いかんせん見ても理解出来なかったので、参考にしつつ自分流に作ってみました。

スポンサーリンク

今見ている方向からどの程度向きを変えたかを計算

アニメーターコントローラのBlend Treeを作成する前に、今見ている方向から押したキーの方向に何度変わったか?
を計算するスクリプトから見ていきます。

inputは押したキーの移動値を設定したベクトルです。
移動値が0.1f以上(小さすぎなければ)移動させます。

アニメーターコントローラのSpeed値にはinput.magnitudeの値を設定します。
input.magnitudeでベクトルの長さを取得出来ます。

次に向いている方角から何度角度が変わったかを計算する処理です。

Mathf.Repeat(Mathf.Repeat(Mathf.Atan2(x, y) * Mathf.Rad2Deg, 360.0f) – transform.eulerAngles.y, 360.0f)

これはいったい何をやっているんだ!?
というのがほとんどの人の意見であると思います。

うまい方法がわからなかったので、ずいぶんわかりづらいスクリプトになっていると思います。
もう少しだけわかりやすい方法があったので最後の方に追記しています(2016/07/16)

まずは押した方向の角度を計算します。

Mathf.Atan2(x, y)でラジアン値、それにMathf.Rad2Degをかける事で角度を算出出来ます。
3rdPersonで使っていたので、使ってみました。詳しい所はわかりません。

方向キーを押した角度から現在の角度を引いた値をTurnに入れます。
向いている方向が奥側(奥側を0度)だった時に左を90度向いたら270度、右を90度向いたら90度がTurnに設定されます。

0~180度までが右まわり、180~360度までが左回りをしたことになります。

詳しく突っ込まれても説明出来ないのでご容赦ください・・・(-.-)

方向キーの向いている角度をMathf.Repeatで360度以内に設定します。これはマイナスの角度が設定された時に0~360の間に調整する為の処理です。
現在の角度transform.eulerAngles.yを引いた後にもこの処理をしています。

アニメーターコントローラのパラメータを設定したら、自分自身の角度を押した方向キーの方に向けていきます。

Quaternion.RotateTowardsで第1引数から第2引数への角度へ徐々に変化させます。
変化の度合いは1秒間で180度変わる速度で変化させます。180の部分を大きくすると早く変化します。

-- 以降はもっとわかりやすく回転を計算したやり方です(2016/07/16) --

Debug.Logは角度がどうなるか試してみる為に記載しています。
回転を計算していた

Mathf.Repeat(Mathf.Repeat(Mathf.Atan2(x, y) * Mathf.Rad2Deg, 360.0f) – transform.eulerAngles.y, 360.0f)の部分を
Quaternion.FromToRotation(transform.forward, input).eulerAngles.y

に変更しました。
Quaternion.FromToRotationを使うと第1引数の方向と第2引数の方向の角度が計算出来ます。

Quaternion.FromToRotationに関しては

Unityでよく使う便利な標準関数について
管理人のかめくめちゃんがUnityのゲームを作成する時によく使う関数を紹介します

も参考にしてください。

また、キャラクターの角度を計算している部分では

transform.rotation = Quaternion.RotateTowards(transform.rotation, Quaternion.Euler(transform.eulerAngles.x, Mathf.Repeat(Mathf.Atan2(x, y) * Mathf.Rad2Deg, 360.0f), transform.eulerAngles.z), 180.0f * Time.deltaTime)の部分を

transform.rotation = Quaternion.RotateTowards(transform.rotation, Quaternion.Euler(transform.eulerAngles.x, Quaternion.LookRotation(input).eulerAngles.y, transform.eulerAngles.z), 180.0f * Time.deltaTime)

と変更しています。

キャラクターを最終的に向かせる角度はQuaternion.LookRotationでinputの方向の角度を取得し設定するようにします。

これで多少回転方法が簡単になったとは思いますが、
回転の理解が苦手な人にはあまり変わらないかもしれませんね・・・・(^_^;)

-- 回転させる別の方法の追記はここまでです(2016/07/16) --

アニメーターコントローラのSpeed、Turnの値を渡す事が出来たので、その値によってアニメーションを変化させましょう。

アニメーターコントローラでブレンドツリーを作成

アニメーターコントローラを作っていきます。

ブレンドツリー9

上のようにCreate StateからFrom New Blend Treeを選択してブレンドツリーを作成します。
名前をWalkRunに変更しておきます。

ブレンドツリー10

CreateからEmptyを選択し、名前をIdleに変更して初期状態を作成しておきます。

IdleにはHumanoidIdleクリップを設定しておきます。
Idle→WalkRun、WalkRun→IdleへとMake Transitionし、それぞれの条件をSpeedが0.1以上、Speedが0.1より下とします。
両方ともHasExitTimeのチェックは外しておきます。

ブレンドツリー11

Idle→WalkRunは上のようになります。

次はWalkRunをダブルクリックし、ブレンドツリーの中身を作成していきます。

Blend Treeを右クリックし、Add Blend Treeを選択し、2つBlend Treeを作成します。
出来たBlend Treeはそれぞれインスペクタ上でWalkとRunという名前に変更してください。

ブレンドツリー12

Blend TreeはBlend Typeを1D、ParameterをSpeedにしAutomate Thresholdsのチェックを外し、

WalkのThresholdは0.1、RunのThresholdは0.8を設定します。

このしきい値がブレンドの度合いを表します。Speedがより0.1に近い場合はWalkのアニメーションが濃くなります。
逆に0.8に近い場合はRunのアニメーションが濃くなります。

しきい値より下または上になると完全にそちらのアニメーションになります。

WalkとRunのブレンドツリーをそれぞれ選択し、Blend Typeを1D、ParameterをTurnにします。

ブレンドツリー13

ここまで作成すると上のようになります。

元のBlend TreeではアニメーションパラメータのSpeed値によってWalk、Runのブレンドをし、その後Walk、Run内でさらにTurnの値によってアニメーションをブレンドする事になります。

角度の変更度合いでアニメーションを変える

ではWalkから作成していきます。

ブレンドツリー14

インスペクタの+をクリックしAdd Motion Fieldを選択します。
まずはしきい値(Threshold)を上の画像のように設定します。

ブレンドツリー16

向いている方向が0度だった時方向キーを押した位置によって返ってくる角度は上の画像のようになります。
つまり右回りに回転する場合、45度の時は緩やかに、90度を超えたら急速に回転するアニメーションを再生します。

アニメーションは3rdPersonControllerで使用されているHumanoid系を設定します。
向いている方向からの角度によってアニメーションを設定してください。

ブレンドツリー15

上の画像が設定したアニメーションクリップです。

Runのブレンドツリーもやる事は同じです。

ブレンドツリー17

上のようにアニメーションクリップを変更しただけで、Walkと同じです。

これでアニメーターコントローラの設定が終わったので、
Unityの実行ボタンを押して確認してみます。

ブレンドツリー18

ちょっとわかりづらいですね・・・。

input.magnitudeをSpeedの値として設定しているので、歩くモーションはほぼブレンドされません。
例えばShiftキーを押している時は歩くアニメーションにする。
といったフラグを用意すると歩くアニメーションも使え、無駄に歩行時のアニメーションを作るということにはならないかと思います。