キャラクターを動かせるようになったら、次は見た目も動きに合わせたくなります。止まれば待機、ゆっくり進めば歩き、速く進めば走り。そして、ジャンプしたら空中の姿勢へ切り替える。これを1つずつ条件分岐で書く前に、アニメーションを組み立てる道具を整理してみましょう。
今回は、State Machineで「地上か空中か」を選び、地上ではBlend Spaceで「どのくらい歩きと走りを混ぜるか」を決めます。 Third Personテンプレートのキャラクターを使い、速度と接地状態に合わせて見た目が変わるところまで作ります。
この記事でわかること
- Animation Blueprintの「値を集めるグラフ」と「ポーズを作るグラフ」を使い分ける
- 速度に応じて待機・歩行・走行を混ぜる
- ジャンプで空中の姿勢へ切り替え、着地したら地上へ戻す
- キーボード操作でも、速度を変えて混ざり方を確かめる
Animation Blueprintは、動きに合う見た目を作る
Animation Blueprint(AnimBP) は、キャラクターの状況に合わせて、どのアニメーションを使うかを組み立てるBlueprintです。ここで扱う ポーズ は、ある瞬間の体の姿勢を指します。アニメーションを再生したり混ぜたりしてポーズを作り、それをキャラクターのMeshへ渡します。
今回は、移動そのものはテンプレートの Character Movement が担当します。AnimBPは「今どのくらいの速さで動いているか」を読み、足や腕の動きを合わせます。走るアニメーションを選ぶことと、キャラクターを速く移動させることは別です。
AnimBPを開いたときの2つのグラフも、この流れで見ると役割が分かります。
| グラフ | 今回やること |
|---|---|
| Event Graph | キャラクターから速度と空中かどうかを取得し、変数へ入れる |
| Anim Graph | その変数を使い、表示するポーズを決める |

まずは 値を集める処理と、見た目を組み立てる処理を分けると考えましょう。空中かどうかを何か所でも計算するより、Event Graphで1つの変数に入れておくと、後の条件が読みやすくなります。
状態を選ぶState Machine、割合を決めるBlend Space
State Machine:地上か、空中かを選ぶ
State Machine は、状態と、その間を移る条件を図にしたものです。今回は Grounded(地上) と InAir(空中) の2状態を作ります。
状態をつなぐ矢印は Transition(遷移) です。「空中になったらGroundedからInAirへ」「着地したら逆へ戻る」という条件を、各矢印に設定します。状態を増やしたときも、どこからどこへ移れるかを図で追えます。
Blend Space:速度に合う混ざり具合を決める
地上にいる間は、移動速度に合わせて見た目を変えたいところです。ここで使う Blend Space は、数値に応じて複数のアニメーションを混ぜるアセットです。
速度が小さければ待機や歩きに近く、大きくなれば走りに近づく。この連続した変化を、1本の数値で扱えます。今回使う Blend Space 1D の「1D」は、速度のように 1つの数値を入力するという意味です。
2つは、次のよ うに組み合わせます。
- 外側のState Machine:地上と空中を切り替える
- Groundedの中のBlend Space:地上での速度に応じて待機・歩行・走行を混ぜる
- InAirの中:空中のアニメーションを再生する

なお、State Machineも、状態が移る途中では前後のポーズを混ぜて滑らかにつなぎます。State Machineは「次の状態へ移る条件」、Blend Spaceは「数値に対する混ざる割合」を扱うと捉えると、役割を混同しにくくなります。
準備:同じキャラクター用の素材をそろえる
BlueprintのThird Personテンプレートで、移動とジャンプができるプロジェクトを用意します。以下では、テンプレートの Manny と、そのアニメーションを使います。
キャラクターとアニメーションを合わせる
BP_ThirdPersonCharacter を開き、Meshコンポーネントの「Skeletal Mesh Asset」を SKM_Manny にします。Skeletal Mesh は、骨組みに合わせて体を動かせるモデルです。
その骨組みの情報が Skeleton です。見た目が似た人型でも、異なるSkeletonのアニメーションをそのまま使えるとは限りません。今回は、Mesh・アニメーション・これから作るAnimBPを、Manny用の同じSkeletonでそろえます。

コンテンツブラウザの Characters/Mannequins/Animations/Manny で、次の素材を確認してください。フォルダや名前はテンプレートの版によって異なる場合があります。
| 用途 | 素材名の例 | プレビューで確かめること |
|---|---|---|
| 待機 | MM_Idle | その場で立っている |
| 歩行 | MM_Walk_InPlace | その場で歩く動きを繰り返す |
| 走行 | MM_Run_Fwd | 前向きの走り |
| 空中 | MM_Fall_Loop | 空中の姿勢を繰り返す |
素材をダブルクリックし、再生して動きを確かめましょう。ここでは Animation Sequence、つまり個々の動きを収めたアニメーション素材を使います。同じ用途の素材でも、別のSkeleton用や、短いジャンプ開始だけのものを選ばないようにします。
名前が違う場合は、上の用途と、アセットのSkeletonを照合して選びます。必要な素材が見つからなければ、Third Personのコンテンツを入れた状態にそろえてから進めてください。別のキャラクター用の素材を使う方法は、アニメーションリターゲット入門で扱います。
比較する速度を決める
BP_ThirdPersonCharacterのCharacter Movementで、Max Walk Speedを500にします。これは今回、地上で通常移動するときの 速度の上限です。UEの標準単位では500cm/sに相当します。
この後のBlend Spaceでは、待機を0、歩きを150、走りを500の位置へ置きます。入力する実速度と、アニメーションを置く位置で、同じ数値を使うのがポイントです。ここでの150と500は、この練習用に決めた値です。
まずは速度に合わせてアニメを混ぜてみる
- コンテンツブラウザで右クリックし、「Animation」→「Blend Space 1D」を選びます。
- Mannyの素材と同じSkeletonを選び、BS_Locomotion と名付けます。
- 開いた画面の「Asset Details」→「Axis Settings」で、軸の名前を Speed、Minimum Axis Valueを 0、Maximum Axis Valueを 500 にします。
- 次の位置へ、アニメーションをドラッグして置きます。位置を正確に合わせるには、配置したサンプルを選んで座標を編集します。
| Speedの位置 | 置く素材 |
|---|---|
| 0 | MM_Idle |
| 150 | MM_Walk_InPlace |
| 500 | MM_Run_Fwd |
配置した各点を サンプル と呼びます。「この速度のときは、このアニメーションを使う」という目印です。
Ctrl を押しながらグラフ内でマウスを動かすと、その位置の混ざり方をプレビューできます。0なら待機、150なら歩き、500なら走りです。325は150と500のちょうど中間です。カーソルを325の位置に止めると、やがて歩きと走りが半分ずつ混ざった動きになります。

ここまでで、速度という1つの数値から、違う動きを作れることが確認できました。次は、マウスで動かしていたSpeedへ、ゲーム中の実速度を渡します。
実践:移動と空中を1つのAnimBPにつなぐ
1. AnimBPと変数を作る
コンテンツブラウザで右クリックし、「Animation」→「Animation Blueprint」を選びます。親クラスを AnimInstance、Skeletonを先ほどと同じものにして、ABP_Player を作ります。
AnimInstanceは、キャラクターのアニメーションを動かすための基本クラスです。今回はこれを土台にしたAnimBPに、次の変数を用意します。
| 変数名 | 型 | 初期値 | 入れるもの |
|---|---|---|---|
| Speed | Float | 0 | 水平方向の移動速度 |
| bIsInAir | Boolean | false | 今回の移動で空中にいるか |
Floatは小数を含む数値、Booleanはtrueかfalseの二択です。bIsInAir の先頭のbは、Booleanの変数だと分かるように付けた目印です。
この後は、変数をグラフへドラッグして「Get」か「Set」を選びます。Getは値を読む、Setは値を入れるためのノードです。新しい変数を追加するわけではありません。
2. このAnimBPを使っているキャラクターを取得する
Event Graphで、Event Blueprint Update Animation から Cast To Character へ白い実行線をつなぎます。Update Animationは、アニメーションが更新されるたびに呼ばれる入口です。ここから処理を始めることで、移動中も値を読み直せます。
次に Try Get Pawn Owner を置き、取得した相手が出る「Return Value」をCast To Characterの「Object」へつなぎます。Try Get Pawn Ownerは、このAnimBPを使っているPawnを取得します。Pawnは操作される体、Characterは移動やジャンプの仕組みを持つPawnの一種です。
Castは、取得した相手をCharacterとして扱えるか確かめる処理です。成功すれば As Character からその相手を取り出せるので、速度やCharacter Movementを読めます。
Try Get Pawn Ownerは、値を返す Pure(純粋)ノードです。白い実行ピンはなく、青いデータ線だけをつなぎます。実行線はUpdate AnimationからCastへ直接つなぎましょう。

「Cast Failed」は今回は未接続にして、値の更新を止めます。エディタのプレビューだけを開いているときは、ゲーム中のPawnがいない場合があります。失敗を毎回Print Stringで出す必要はありません。
3. 水平速度をSpeedへ入れ る
Castの成功側から、Set Speed へ実行線をつなぎます。入れる値は、次の順で作ります。
- Castの As Character から Get Velocity を出します。そのCharacterが「どの向きへ、どの速さで動いているか」を取得します。
- Get VelocityのReturn Valueを Vector Length XY の「A」へつなぎます。
- Vector Length XYのReturn Valueを、Set Speedの値へつなぎます。

Velocity は、X・Y・Zという3つの数値で、方向別の速度を表します。XとYが水平方向、Zが上下方向です。このように方向別の値をまとめたものを Vector(ベクトル) と呼びます。Vector Length XYは、そのうち水平の2方向から速さを取り出します。
たとえば、真上にジャンプしているだけなら、上下の速度があっても地上を走っているわけではありません。Zまで含めたVector Lengthを使うと、その上下移動もSpeedへ入ります。今回は、足の歩き・走りに使う値なのでXYに絞ります。
4. 空中かどうかをbIsInAirへ入れる
Set Speedの次に、Set bIsInAir をつなぎます。
Castの As Character から Get Character Movement を出し、その出力から Is Falling を出します。Is FallingのReturn Valueを、Set bIsInAirへ渡してください。

Is Fallingは名前に「落下」とありますが、今回のCharacterでは ジャンプで上昇している間も、下降している間もtrueになります。段差から歩いて落ちたときもtrueです。「ジャンプボタンを押した瞬間」とは違い、空中にいる間の状態を表します。

実行線をたどると、Update AnimationからCastの成功側を通り、Set Speed、Set bIsInAirの順につながります。
速度と空中の情報を別々に取れたので、あとはこの2つの変数を見てポーズを作れます。
5. State Machineを置き、出力につなぐ
Anim Graphを開き、右クリックで「State Machines」→「Add New State Machine」を選び、Locomotion と名付けます。
Locomotionのポーズ出力を、Output Poseへ接続してください。 Anim Graphは、ポーズを最後の出力まで届けて初めてキャラクターの表示に使われます。Event Graphの白い実行線と、こちらのポーズを渡す線は役割が違います。

Locomotionをダブルクリックし、空白部分の右クリックメニューから「Add State」で状態を追加します。Grounded と InAir の2つを作り、「Entry」からGroundedへつなぎます。これで、最初は地上の状態から始まります。
続いてGroundedの外周からInAirへドラッグし、遷移の矢印を作ります。逆向きも同じように作ってください。行きと帰りで、矢印が1本ずつ必要です。

6. 行きと帰りの条件を設定する
遷移のアイコンをダブルクリックすると、その矢印の条件を設定するグラフが開きます。
| 遷移 | Can Enter Transitionへつなぐ値 |
|---|---|
| Grounded → InAir | Get bIsInAir |
| InAir → Grounded | Get bIsInAirをNOT Booleanで反転した値 |
Can Enter Transition は、「この状態へ移ってよいか」という判定です。trueになると遷移できます。
戻り側の NOT Boolean は、trueとfalseを逆にします。bIsInAirがfalseになったときに、戻りの条件をtrueにするためです。両方の矢印に同じ値をそのままつなぐと、「空中になったら行く・戻る」が両方成立して しまいます。

遷移のアイコンを1回クリックし、「Details」→「Blend Settings」の「Duration」を、両方向とも 0.2秒にします。これは、前後のポーズを混ぜて切り替える時間です。今回はこの値から始め、動きを見て調整します。
7. 地上と空中の中身を作る
Groundedをダブルクリックし、コンテンツブラウザから BS_Locomotion をグラフへドラッグします。これで、Blend Spaceを再生する Playerノードが置かれます。Get Speedを入力の「Speed」へ、ポーズ出力を Output Animation Pose へつなぎます。BS_Locomotionのノードを選び、Detailsの「Loop」をオンにして、歩き・走りを繰り返せるようにします。

InAirの中へは、コンテンツブラウザから MM_Fall_Loop をドラッグし、同じようにOutput Animation Poseへつなぎます。こちらもノードのDetailsで「Loop Animation」をオンにします。

今回は空中を1状態にまとめるため、ジャンプで上がる間も下がる間も、同じ空中アニメーションを使います。踏み切りや着地の専用モーションは、土台が動いてから足していきましょう。
8. キャラクターに割り当てる
BP_ThirdPersonCharacterのMeshを選び、次のように設定します。
| 設定 | 値 |
|---|---|
| Animation Mode | Use Animation Blueprint |
| Anim Class | ABP_Player |
ABP_PlayerとBP_ThirdPersonCharacterをコンパイルして保存し、Playします。止まると待機、移動すると走り、ジャンプで空中の姿勢に変わり、着地して地上へ戻れば成功です。
テンプレートの既存AnimBPを今回の簡単な構成へ置き換えたので、元の足の接地補正などは含みません。まずは状態と速度の対応を確かめましょう。
速度を変えて、混ざり方を確かめる
キーボードの移動キーは、押している間に速く加速するため、歩きの見た目をじっくり観察しにくいことがあります。Max Walk Speedを変えれば、ゲームパッドがなくても比較できます。
一度Playを止め、BP_ThirdPersonCharacterのCharacter Movementで値を変えてから、起動し直してください。Blend Spaceの配置位置0・150・500は、そのままにします。
| Max Walk Speed | 平らな床をしばらく移動したときの見た目 |
|---|---|
| 150 | 歩きのサンプルに近づく |
| 325 | 歩きと走りの中間になる |
| 500 | 走りのサンプルに近づく |
325で移動すると、全力でキーを押していても歩きと走りが混ざります。Blend Spaceが見ているのは、入力の強さや「走るボタンを押したか」ではなく、渡されたSpeedの値だからです。確認したらMax Walk Speedを500へ戻します。

ジャンプも、移動しながらと、その場での両方を試してください。空中へ移る条件はbIsInAirなので、水平速度が0のジャンプでもInAirへ移れます。
うまく動かないとき
Tポーズや棒立ちのまま
MeshにABP_Playerが割り当てられているか、Manny用のSkeletonでそろっているかを確認します。次に、Anim GraphのLocomotion→Output Poseと、各状態の中のOutput Animation Poseへの接続を見ます。コンパイル時のエラーも確認してください。
ずっとIdleになる・Runまで変わらない
AnimBPを開いたままPlayし、ツールバーの「Debug Filter」で実行中のキャラクターのAnimInstanceを選びます。Speedを確認し、必要ならSet Speedの後に一時的なPrint Stringを置いて値を出します。
Speedが0のままならCastの成功とGet VelocityのTarget、値は変わるのに見た目が同じならBS_LocomotionへのSpeed接続を確認します。Runの位置を500にしているのに実速度が150なら、走りのサンプルまで届きません。
空中から戻らない・切り替えが落ち着かない
bIsInAirの更新、行きの条件、帰りのNOTを順に確認します。帰り側もbIsInAirをそのままつないでいないか、矢印を片方向しか作っていないかを見ます。
空中の姿勢が途中で固まるなら、アニメーションが繰り返し用か、Loop Animationがオンかを確かめます。
切り替えがカクッとする・足が滑る
地上と空中の切り替えなら遷移のDuration、地上での速度変化ならBlend Spaceへ入るSpeedの変化やサンプル位置を見ます。Blend Spaceの Smoothing Time は、入力値の変化を時間をかけて追う設定です。急な変化を和らげたい場合に試せますが、長くすると見た目の反応も遅くなります。
足が滑る場合は、アニメーションの歩幅や再生速度と、実際の移動速度が合っているかも確認します。混ざることと、足が地面にぴったり止まることは別です。150・500は練習用の配置なので、素材を変えたら、その動きに合う速度を見ながら調整します。
おまけ:動きを増やすときの考え方
空中を「踏み切り・落下・着地」に分ける
今回のInAirは、空中の姿勢を1つ再生する最小構成です。専用の素材を用意して状態を分けると、踏み切りから落下、着地へ、より細かく動きをつなげられます。
状態を足すときは、「いつ入るか」だけでなく 「何を合図に出るか」 もセットで考えます。短い踏み切りを最後まで再生するのか、着地したらすぐ地上へ戻すのかを決めると、矢印の条件を書きやすくなります。
方向や攻撃を追加する
速度と方向の2つを入力するなら 2DのBlend Space が使えます。横歩きや後ろ歩きには、それぞれの素材に加えて、キャラクターの向きと移動方向をどう分けるかの設定も必要です。1DのSpeedだけでは方向までは選べません。
攻撃や被弾のような一時的な動作には、Animation Montage という選択肢もあります。移動の状態を保ちながら別の動きを再生する方法は、Animation Montage入門で扱います。
慣れてから、更新方法や別方式を試す
今回のEvent Graphは、アニメーションを更新するときに必要な値を取得します。キャラクターが増えて処理の重さが気になったら、Property Access と Blueprint Thread Safe Update Animation を使う方法も検討できます。初めは、どのキャラクターから何の値を取るかが見える構成で理解を固めましょう。
また、大量の素材から状況に合う動きを探す Motion Matching もあります。Game Animation Sampleの記事へ進むときも、「移動の状態と、表示するポーズは別」という今回の考え方が土台になります。
まとめ
State Machineは、条件を見て地上・空中などの状態を選びます。Blend Spaceは、その状態の中で数値に合う混ざり具合を作ります。今回のGroundedにBlend Spaceを入れる構成なら、歩き・走りのために状態を細かく増やさずに済みます。
Event GraphからSpeedとbIsInAirを渡し、Anim Graphでポーズを最後の出力までつなぐ。この流れができたら、速度の上限を変えたり、その場でジャンプしたりして、どの値がどの見た目を変えているかを確かめてみてください。