今回は今まで使わなかったアニメーターコントローラのBlendTree(ブレンドツリー)を使ってみます。
ブレンドツリーは例えば、主人公キャラクターが移動中に違う方角を向いた時、キャラの体の向きを少し傾けたアニメーションを再生したい時や
向いている方向によってアニメーションを変更する時に便利です。
つまり細かい動きを制御したい時にはBlendTreeを使うという事ですね。
アニメーターコントローラの追加
まずは新しいアニメーターコントローラを作成し、キャラクターにAdd Componentします。
アニメーターコントローラはBlendTreeという名前にして、さらにCharacterControllerとMoveTestという新しいスクリプトを設定します。
BlendTreeの作成
Animatorウインドウでアニメーターコントローラ(BlendTree)を開き、右クリック→Create State→From New Blend Treeを選択します。
出来上がったら名前をRunに変更します。
右クリック→CreateState→Emptyで新しい状態を作り、名前をIdleに変更します。
IdleのアニメーションクリップにはStandardAssetのHumanoidIdleを設定しておきます。
Idle→Runの遷移条件はHasExitTimeのチェックを外し、条件にSpeedがGreaterで0.1、
Run→Idleの遷移条件はHasExitTimeのチェックを外し、条件にSpeedがLessで0.1の時に設定しておきます。
ブレンドツリー内でMoveXの値によってアニメーションは変更されますが、その大元のRunに遷移する条件はSpeedの値が0.1以上になった時に遷移します。
アニメーションパラメータにSpeed、MoveX、MoveYをFloat型で作成しておきます。
これらのパラメータ値によって、アニメーションの遷移を変更します。
ブレンドツリーの1Dを使い、条件とアニメーションクリップを設定する
次にRunのStateをダブルクリックしてください。そうするとブレンドツリーの中身が表示されます。
上の画像のように表示されるので、blend treeを選択し、
インスペクタで上のようになります。BlendTypeを1Dにし、ParameterをMoveXに変更します。
MoveXは左右に押されている度合いを渡すので左右のキーが押されたらアニメーションを変更します。
Motionの+の部分をクリックし、3つAdd Motion Fieldを追加します。
上のように-1となっているところをクリックし-1に設定します。(元々は0になっています)
これはキーの押し具合が-1~1の値で取得するのでそれと対応する為です。
MotionのアニメーションクリップにはStandardAssetのThirdPersonControllerの
HumanoidRunLeft
HumanodiRun
HumanoidRunRight
をそれぞれ設定します。
上のようになります。アニメーションクリップの右側の時計のパラメータはアニメーションの速度で、その右側はアニメーションをミラーにするかどうかのチェックボックスです。
MoveXの値が-1の時HumanoidRunLeft
MoveXの値が0の時HumanoidRun
MoveXの値が1の時HumanoidRunRight
のアニメーションが再生され、その中間の値であればアニメーションがブレンドされます。
これでアニメーターコントローラの作成が終了しました。
スクリプトでアニメーションパラメータを変更する
あとはスクリプトからアニメーションパラメータの値を変更してアニメーションを制御するだけです。
ではさきほどキャラクターに設定したMoveTestを記述していきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | using UnityEngine; using System.Collections; public class MoveTest : MonoBehaviour { private Animator animator; private CharacterController characterController; private Vector3 velocity; void Start () { animator = GetComponent<Animator>(); characterController = GetComponent<CharacterController>(); } void Update () { if(characterController.isGrounded) { velocity = Vector3.zero; var horizontal = Input.GetAxis("Horizontal"); var vertical = Input.GetAxis("Vertical"); var input = new Vector3(horizontal, 0f, vertical); if(input.magnitude > 0.1f) { animator.SetFloat("Speed", input.magnitude); animator.SetFloat("MoveX", horizontal); animator.SetFloat("MoveY", vertical); transform.Rotate (0f, horizontal * 45f * Time.deltaTime, 0f); velocity += transform.forward * 2f; } else { animator.SetFloat("Speed", 0f); animator.SetFloat("MoveX", 0f); animator.SetFloat("MoveY", 0f); } } velocity.y += Physics.gravity.y; characterController.Move(velocity * Time.deltaTime); } } |
MoveTestは簡単な移動の処理を書いています。入力値のmagnitudeが0.1より大きかった場合は移動させます。
アニメーターパラメータのSpeedにはそのまま入力値のmagnitudeを入れ、MoveX、MoveYにはX軸、Z軸のベクトル値を入れます。
キャラクターの向きをhorizontalの値の方向に回転させています。
向きを変えたらその向いている方向に移動値を加えます。
入力値のベクトルが0.1より下だった場合はアニメーションパラメータの値のそれぞれを0に設定します。
最後に重力値を足し、CharacterControllerのMoveで移動させます。
今回のサンプルスクリプトだと↓のキーを押しても前方に進みます。
BlendTreeのBlendTypeを1Dにしたので、MoveYの値は使っていませんが、2D系のBlendTypeにした時に利用する可能性もあったので作成しました。
今回は使用していません・・・・(^_^;)
これでアニメーターコントローラのBlendTreeの機能を使う事が出来るようになりました。
Unityの実行ボタンを押して確認してみましょう。
左右のキーの押し具合によって体を少し斜めにして走るようになりました。
2Dのブレンドで二つのParameterを使用して、さらに細かく分けるようにも出来ます。