【Unity中級者向け】Animator応用編①|Blend TreeでIdle・Walk・Runを滑らかにつなぐ
これまでのAnimator基礎編では、
State
Parameter
Trigger
Any State
Transition
Animation Event
など、Animatorを扱うための基本的な機能を確認してきました。
今回からは、これらの知識を使いながら、もう一歩進んだAnimatorの機能を学んでいきます。
Animator応用編、第1回のテーマは「Blend Tree」です。
Blend Treeを使うと、Idle → Walk → Run のような複数のAnimationを、キャラクターの移動速度に合わせて滑らかにつなぐことができます。
今回は2Dではなく、3DのHumanoidキャラクターを使います。
サンプルでは無料の3DキャラクターAssetをUnityへ取り込み、そこへAnimationを設定し、最後にBlend Treeを使ってIdle・Walk・Runを切り替えてみます。
Animator 応用編【全5回】
Blend Tree入門 ― Idle / Walk / Runを滑らかにつなぐ
2D Blend Tree ― 上下左右の移動アニメーション
Animator Layer / Avatar Mask ― 上半身だけ別アニメーション
Animator Override Controller ― キャラごとにモーションを差し替える
StateMachineBehaviour ― Stateの開始・終了に処理を入れる
今回作るもの
今回の完成形は次のようになります。
停止している場合は、Idle
移動すると、Walk
Shiftキーを押しながら移動すると、Run
ただし、Idle → Walk → Run とAnimationが突然切り替わるのではありません。
今回使用するBlend Treeでは、
Idle
↓
Idle + Walk
↓
Walk
↓
Walk + Run
↓
Run
のように、複数のAnimationを混ぜながら切り替えることができます。

Blend Treeとは?
これまでAnimatorでは、Animation Clip ごとに State を作ってきました。
たとえばIdleとWalkを切り替える場合は、
[ Idle State ] → Transition → [ Walk State]
という構成でした。
Idle・Walk・Runの3種類を使う場合は、
Idle ⇔ Walk ⇔ Run
のように複数のStateとTransitionを作ることもできます。
もちろん、この方法でもAnimationを切り替えることはできます。
しかし、移動速度によって似たAnimationを切り替える場合には、もっと便利な方法があります。
それが、Blend Tree です。
Blend Treeは、Parameterの値に応じて、複数のAnimation Clipを混ぜながら再生する仕組みです。

3Dキャラクターを用意しよう
今回は、Animator応用編で使用するキャラクターとして、Unity Asset Storeで配布されている無料Asset、
GanzSe FREE Modular Character - Fantasy Low Poly Pack
をお借りして使用します。
ファンタジー系のローポリ3Dキャラクターで、今回だけでなく、今後のAnimator応用編でも使用していきます。
今回から第5回まで、基本的には同じキャラクターを育てていく形で進めます。
Asset StoreからAssetを追加する
Unity Asset Storeで「GanzSe FREE Modular Character」と検索します。
対象のAssetを開いたら、ご自身のプロジェクトに取り込んでみてください。
Asset Storeの素材を使用するときは、いきなりPrefabをSceneへ入れるのではなく、まずフォルダの中身を確認してみましょう。
Assetによって構成は異なりますが、3DキャラクターAssetの場合、
Prefab
Model
Material
Texture
Demo
Scene
などが含まれていることがあります。
今回特に確認したいのは、実際にゲームへ配置するキャラクターのPrefabまたはModelです。

Demo Sceneが含まれている場合は、一度開いてみるのもおすすめです。
どのPrefabを使用すればよいか、どのような見た目になるかを確認できます。
今回は、新しいSceneへキャラクターだけを配置して進めます。
Render Pipelineについて
3D Assetを使用するときに、もう一つ注意したいのが、Render Pipeline です。
Unityでは主に、
Built-in Render Pipeline
URP
HDRP
などがあります。
AssetとProjectで使用しているRender Pipelineが合っていないと、Materialがピンク色になる など、正しく表示されないことがあります。
今回使用するAssetは複数のRender Pipelineへ対応していますが、別のAssetを使用する場合は、Asset Storeの「Render pipeline compatibility」を確認する習慣をつけておきましょう。
Animatorとは直接関係ありませんが、Asset Storeの3D素材を使うときには非常に重要なポイントです。
キャラクターをSceneへ配置する
Assetの中から使用するキャラクターを見つけたら、HierarchyまたはSceneへドラッグします。

今回は説明しやすいように、キャラクターのGameObject名を「Player」として、座標を全て 0 でリセットしておきます。
さらに地面として、Hierarchy 右クリック
3D Object → Plane
からPlaneを作っておきます。
Main Cameraもキャラクターが見える位置へ調整しておきましょう。

Humanoidになっているか確認しよう
今回のシリーズでは、Humanoid という仕組みが重要になります。
Humanoidとは、人型キャラクターの骨格をUnity共通の形式として扱う仕組みです。
Projectウィンドウからキャラクターの Model を選択
Inspector で Rig タグを確認
Animation Type が Humanoid になっているのを確認
別のTypeが指定されていたら、Humanoid に変更して Apply を押す
Humanoidにしておくことで、別のAssetから入手した Humanoid用Animationを、このキャラクターでも利用できるようになります。

これは今回だけでなく、この先に解説する Animator応用編④ で扱う、Animator Override Controller などでも重要になってきます。
Animationも用意しよう
キャラクターを用意しただけでは、Idle・Walk・Runは再生できません。
そこで今回はAnimation素材として、Human Basic Motions FREE を使用します。
こちらも Unity Asset Store から無料で追加できます。
先ほどと同じように、Projectへ取り込みます。
使用するAnimation Clipを選ぼう
今回使用する Human Basic Motions FREE には、あらかじめたくさんのAnimation Clipが収録されています。
今回は、その中から次の3つを使用します。
HumanM@Idle01
HumanM@Walk01_Forward
HumanM@Run01_Forward
それぞれ、
HumanM@Idle01 ⇒ Idle
HumanM@Walk01_Forward ⇒ Walk
HumanM@Run01_Forward ⇒ Run
として使用します。
Projectウィンドウで Human Basic Motions FREE のフォルダを開き、これらのAnimationを探します。
FBXファイルの左側にある三角形をクリックすると、中に入っているAnimation Clipが表示される場合があります。

別AssetのAnimationを使える理由
ここは3Dキャラクターを初めて扱う場合、少し不思議に感じるかもしれません。
今回、GanzSeのキャラクターに対して、別のAssetに入っているAnimationを使用します。
これができる大きな理由が、Humanoid です。
どちらもHumanoidとして設定されていれば、Unityが、
頭
腕
脚
胴体
などの骨格を対応させてくれます。
この仕組みを、Retargeting(リ ターゲティング) と呼びます。
3Dゲーム制作では非常によく使われる仕組みなので、覚えておきましょう。
Animator Controllerを作る
それでは Animator を作っていきます。
Projectウィンドウで右クリックして、
Create → Animation → Animator Controller を選択します。

名前は、PlayerAnimator としておきます。
作成したPlayerAnimator を Player の、Aniamtorコンポーネントの Controller にセットします。

Animatorコンポーネントが付いていない場合は、
Add Component → Animator
から追加します。
Blend Treeを作る
PlayerAnimatorをダブルクリックしてAnimatorウィンドウを開きます。
何もない場所で右クリックして、
Create State → From New Blend Tree

新しくBlend TreeのStateが作成されます。
名前を「Movement」としておきましょう。
このMovementをDefault Stateにします。

Speed Parameterを作る
今回のBlend Treeでは、キャラクターの移動速度を使ってAnimationを切り替えます。
AnimatorウィンドウのParametersから、
+ → Float を選択します。
名前を「Speed」とします。

今回は、
Speed = 0 ⇒ Idle
Speed = 1 ⇒ Walk
Speed = 2 ⇒ Run
という形にします。
Blend Treeを開く
Movementをダブルクリックして、Blend Tree の編集画面へ移動します。
Inspectorを確認すると、Blend Type があります。
今回は「1D」を使用します。
Parameterには「Speed」を指定します。

1D Blend Treeとは?
今回使用する1D Blend Treeでは、1つのParameter(Speed)を使ってAnimationを切り替えます。
たとえば、
Speed
0 1 2
│--------------│--------------│
Idle Walk Run
という形です。
Speedという1本の数値の変化だけを見るため、「1D」となります。
ちなみに次回は、
Horizontal
Vertical
という2つのParameterを使用する、2D Blend Tree を扱います。
ここでいう「2D」は、2Dゲームという意味ではありません。
2つの値を使ってAnimationをBlendするという意味です。

Idle・Walk・Runを登録する
Blend Tree の Inspector右下にある 「+」 をクリックし、
Add Motion Field を選択します。
今回はIdle・Walk・Runの3つのAnimationを使用するため、同じ操作を3回行います。
Motion欄が3つ作成されたら、それぞれに上で確認した
Idle・Walk・Run の Animation Clip を設定します。
今回は分かりやすく、
Idle : 0
Walk : 1
Run : 2
となるようにThresholdを設定します。

必要に応じて、
Automate ThresholdsをOFFにして手動で設定してください。
Thresholdとは?
Thresholdは、どのParameterの値で、そのAnimationを再生するか を決める値です。
今回なら、以下の状態です。

Speedが 0 ならIdle。
Speedが 1 ならWalk。
Speedが 2 ならRun。
では、Speed = 0.5 の場合はどうなるのでしょうか。
ここが Blend Tree の特徴となる部分です。
0.5 の場合、Idle + Walk を混ぜたAnimation になります。
同じように、Speed = 1.5 なら、Walk + Run を混ぜて再生します。

Previewで確認してみよう
Blend Treeでは、Unityを実行しなくてもPreviewで動きを確認できます。
InspectorのPreviewを表示して、Speedの値を動かしてみましょう。
Speed を0から2まで徐々に変化させていってみましょう。
Animationが、Idle ⇒ Walk ⇒ Run へ滑らかに変化することを確認できます。

Blend Tree を作ったときは、まず Preview で確認しておくと設定ミスを見つけやすくなります。
C#からSpeedを変更しよう
Blend Treeができたので、今度はゲーム中にSpeedを変更してみます。
Projectウィンドウで、スクリプトファイル:PlayerController を作成します。
次のように記述します。
public class PlayerController : MonoBehaviour
{
public float walkSpeed = 2f; // 歩行速度
public float runSpeed = 5f; // 走行速度
Animator animator; // Animatorコンポーネントへの参照
void Start()
{
animator = GetComponent<Animator>(); // Animatorコンポーネントを取得
}
void Update()
{
float speed = 0f; // 現在の速度を初期化
if (Input.GetKey(KeyCode.W)) // Wキーが押されている場合
{
speed = 1f; // 歩行速度を設定
float moveSpeed = walkSpeed; // デフォルトは歩行速度
if (Input.GetKey(KeyCode.LeftShift)) // 左Shiftキーが押されている場合
{
speed = 2f; // 走行速度を設定
moveSpeed = runSpeed; // 走行速度に変更
}
// 移動方向を計算
transform.Translate(
Vector3.forward * moveSpeed * Time.deltaTime
);
}
animator.SetFloat("Speed", speed); // AnimatorのSpeedパラメータを更新
}
}作成したPlayerControllerをPlayerへアタッチします。
コードの確認
private Animator animator;で Animator を入れる変数を用意しています。
Startでは、
animator = GetComponent<Animator>();として、Playerに付いているAnimatorを取得しています。
Updateの最初で、
float speed = 0f;としています。
何もキーを押していない場合は、
Speed = 0になるため、Idle が再生されます。
次に、
if (Input.GetKey(KeyCode.W))でWキー の入力を確認しています。
Wキーを押している場合は、
speed = 1f;と指定しているため、Blend Treeでは、Walk が再生されます。
同時に、
transform.Translate(
Vector3.forward * moveSpeed * Time.deltaTime
);
でキャラクターを前方向へ移動させています。
今回はBlend Treeの学習が目的なので、移動処理はシンプルなものにしています。
Wキーを押している状態で Left Shift も押している場合は、
if (Input.GetKey(KeyCode.LeftShift))が true になり、
speed = 2f;と指定しています。
そのため Blend Tree では、Run が再生されます。
最後に、
animator.SetFloat("Speed", speed);を実行しています。
これによってC#側で決めた speed の値が Animator の、Speed Parameterへ送られます。

切り替わりの速さの補正
ここまででもBlend Treeは動作します。
ただし今回のコードでは、
Speed = 0
↓
Speed = 2のように値そのものは一瞬で変化しています。
Animator.SetFloat() には次のような書き方があります。
animator.SetFloat(
"Speed", // Animatorのパラメータ名
speed, // 現在の速度を設定
0.1f, // 変化のスムーズさを指定
Time.deltaTime // フレームレートに依存しない変化を実現
);このようにすると、Speedを目標値へ徐々に近づけることができます。
この0.1fは、Damp Time と呼ばれる値です。
値を急に変更するのではなく、少し時間をかけて目標値へ近づけます。
たとえば、
0 ⇒ 0.4 ⇒ 0.8 ⇒ 1.2 ⇒ 1.6 ⇒ 2
のように変化します。
するとBlend Treeでは、
Idle ⇒ (Idle + Walk) ⇒ Walk ⇒ (Walk + Run) ⇒ Run
というAnimationを通りながら変化します。

TransitionとBlend Treeの違い
ここで、これまで使ってきたTransitionとの違いを整理しておきましょう。
Transitionは、別のStateへ移動する仕組みです。
一方、Blend Treeは、1つのStateの中で複数のAnimationを混ぜる仕組みです。
どちらか一方だけを使うわけではありません。
実際のゲームでは、
Movement
Attack
Jump
Damage
などのStateを作り、Movement の中だけ、
Idle
Walk
Run
をBlend Treeにする、といった使い方もできます。
Blend Treeは便利ですが、すべてのAnimationをBlend Treeへ入れる必要はありません。
特に、
Attack
Jump
Damage
Death
のようなAnimationは「ある動作から別の動作へ切り替える」という意味合いが強いため、通常のStateとして扱うことも多くあります。
一方、
Idle
Walk
Run
のように、同じ種類の動作が連続的に変化する場合はBlend Treeが非常に便利です。

今回のまとめ
今回は、Animatorの応用機能、Blend Treeを使ってIdle・Walk・Runを切り替えました。

次回は2D Blend Tree
今回は、Speed という1つのParameterを使った、1D Blend Tree を使用しました。
しかし、キャラクターを自由に操作するゲームでは、
前 / 後 / 左 / 右
へ移動させたいことがあります。
そこで次回は、
Horizontal
Vertical
という2つのParameterを使用する、2D Blend Tree を使います。
なお、2D Blend Treeの「2D」は、2Dゲームという意味ではありません。
3Dキャラクターをそのまま使用して、前後左右の移動Animationを滑らかにつないでみましょう。
こちらはUnity初心者向けの記事をテーマ別にまとめています。
▼ Unity初心者向け記事まとめはこちら
こちらのマガジン「ミニゲーム作成講座 全8回セット」でもシーンの切り替えなどを活用して、初心者でも知識ゼロから作れるミニゲーム作成講座を紹介しています。

さらにステップアップの「スマホで遊ぶジャンプゲーム 8回セット」のマガジンもぜひご活用ください。

ファイブボックスでは、スクラッチやUnityの個別指導のオンラインレッスンを行っています。
ご興味のある方は当サイト、オンラインレッスンから、無料体験授業へお問い合わせ下さい。
いいなと思ったら応援しよう!
よろしければ応援お願いします! いただいたチップはクリエイターとしての活動費に使わせていただきます!