【Unreal Engine】Animation Blueprint入門:State MachineとBlend Spaceで歩く・走る・跳ぶをつなぐ

作成: 2025-12-12最終更新: 2026-09-06

UE5のAnimation Blueprintで、移動速度と空中かどうかに合わせてアニメーションを変える入門。State MachineとBlend Spaceの役割を整理し、Third Personの素材で待機・歩行・走行・空中の動きを組み立てます。

キャラクターを動かせるようになったら、次は見た目も動きに合わせたくなります。止まれば待機、ゆっくり進めば歩き、速く進めば走り。そして、ジャンプしたら空中の姿勢へ切り替える。これを1つずつ条件分岐で書く前に、アニメーションを組み立てる道具を整理してみましょう。

今回は、State Machineで「地上か空中か」を選び、地上ではBlend Spaceで「どのくらい歩きと走りを混ぜるか」を決めます。 Third Personテンプレートのキャラクターを使い、速度と接地状態に合わせて見た目が変わるところまで作ります。

State Machineは状態を切り替え、Blend Spaceは数値に応じて混ぜる。2つの役割を使い分けるイメージ

この記事でわかること

  • Animation Blueprintの「値を集めるグラフ」と「ポーズを作るグラフ」を使い分ける
  • 速度に応じて待機・歩行・走行を混ぜる
  • ジャンプで空中の姿勢へ切り替え、着地したら地上へ戻す
  • キーボード操作でも、速度を変えて混ざり方を確かめる

Sponsored

Animation Blueprintは、動きに合う見た目を作る

Animation Blueprint(AnimBP) は、キャラクターの状況に合わせて、どのアニメーションを使うかを組み立てるBlueprintです。ここで扱う ポーズ は、ある瞬間の体の姿勢を指します。アニメーションを再生したり混ぜたりしてポーズを作り、それをキャラクターのMeshへ渡します。

今回は、移動そのものはテンプレートの Character Movement が担当します。AnimBPは「今どのくらいの速さで動いているか」を読み、足や腕の動きを合わせます。走るアニメーションを選ぶことと、キャラクターを速く移動させることは別です。

AnimBPを開いたときの2つのグラフも、この流れで見ると役割が分かります。

グラフ今回やること
Event Graphキャラクターから速度と空中かどうかを取得し、変数へ入れる
Anim Graphその変数を使い、表示するポーズを決める
ゲーム側からSpeedとbIsInAirを集め、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のGroundedの中にBlend Spaceを置き、外側でGroundedと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でそろえます。

Skeletal Mesh・Animation Sequence・Animation Blueprintが、同じ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は、この練習用に決めた値です。

まずは速度に合わせてアニメを混ぜてみる

  1. コンテンツブラウザで右クリックし、「Animation」→「Blend Space 1D」を選びます。
  2. Mannyの素材と同じSkeletonを選び、BS_Locomotion と名付けます。
  3. 開いた画面の「Asset Details」→「Axis Settings」で、軸の名前を Speed、Minimum Axis Valueを 0、Maximum Axis Valueを 500 にします。
  4. 次の位置へ、アニメーションをドラッグして置きます。位置を正確に合わせるには、配置したサンプルを選んで座標を編集します。
Speedの位置置く素材
0MM_Idle
150MM_Walk_InPlace
500MM_Run_Fwd

配置した各点を サンプル と呼びます。「この速度のときは、このアニメーションを使う」という目印です。

Ctrl を押しながらグラフ内でマウスを動かすと、その位置の混ざり方をプレビューできます。0なら待機、150なら歩き、500なら走りです。325は150と500のちょうど中間です。カーソルを325の位置に止めると、やがて歩きと走りが半分ずつ混ざった動きになります。

SpeedのサンプルはIdleが0、Walkが150、Runが500。325では歩きと走りの中間をプレビューする

ここまでで、速度という1つの数値から、違う動きを作れることが確認できました。次は、マウスで動かしていたSpeedへ、ゲーム中の実速度を渡します。

Sponsored

実践:移動と空中を1つのAnimBPにつなぐ

1. AnimBPと変数を作る

コンテンツブラウザで右クリックし、「Animation」→「Animation Blueprint」を選びます。親クラスを AnimInstance、Skeletonを先ほどと同じものにして、ABP_Player を作ります。

AnimInstanceは、キャラクターのアニメーションを動かすための基本クラスです。今回はこれを土台にしたAnimBPに、次の変数を用意します。

変数名初期値入れるもの
SpeedFloat0水平方向の移動速度
bIsInAirBooleanfalse今回の移動で空中にいるか

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へ直接つなぎましょう。

Update AnimationからCastへ実行線をつなぎ、Try Get Pawn OwnerのReturn ValueをObjectへ渡す

「Cast Failed」は今回は未接続にして、値の更新を止めます。エディタのプレビューだけを開いているときは、ゲーム中のPawnがいない場合があります。失敗を毎回Print Stringで出す必要はありません。

3. 水平速度をSpeedへ入れる

Castの成功側から、Set Speed へ実行線をつなぎます。入れる値は、次の順で作ります。

  1. Castの As Character から Get Velocity を出します。そのCharacterが「どの向きへ、どの速さで動いているか」を取得します。
  2. Get VelocityのReturn Valueを Vector Length XY の「A」へつなぎます。
  3. Vector Length XYのReturn Valueを、Set Speedの値へつなぎます。
CastのAs CharacterからGet Velocity、Vector Length XYを通して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へ渡してください。

Character MovementからIs Fallingを取得し、Set Speedの次にbIsInAirを更新する

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

地上を走るとSpeedが増え、その場のジャンプではSpeedが0でもbIsInAirは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の白い実行線と、こちらのポーズを渡す線は役割が違います。

Anim GraphでLocomotionのポーズをOutput Poseへ接続する

Locomotionをダブルクリックし、空白部分の右クリックメニューから「Add State」で状態を追加します。GroundedInAir の2つを作り、「Entry」からGroundedへつなぎます。これで、最初は地上の状態から始まります。

続いてGroundedの外周からInAirへドラッグし、遷移の矢印を作ります。逆向きも同じように作ってください。行きと帰りで、矢印が1本ずつ必要です。

EntryからGroundedへ入り、bIsInAirがtrueならInAir、falseならGroundedへ戻る2状態の構成

6. 行きと帰りの条件を設定する

遷移のアイコンをダブルクリックすると、その矢印の条件を設定するグラフが開きます。

遷移Can Enter Transitionへつなぐ値
Grounded → InAirGet bIsInAir
InAir → GroundedGet bIsInAirをNOT Booleanで反転した値

Can Enter Transition は、「この状態へ移ってよいか」という判定です。trueになると遷移できます。

戻り側の NOT Boolean は、trueとfalseを逆にします。bIsInAirがfalseになったときに、戻りの条件をtrueにするためです。両方の矢印に同じ値をそのままつなぐと、「空中になったら行く・戻る」が両方成立してしまいます。

行きはbIsInAirをそのまま渡し、帰りはNOT Booleanで反転してCan Enter Transitionへ渡す

遷移のアイコンを1回クリックし、「Details」→「Blend Settings」の「Duration」を、両方向とも 0.2秒にします。これは、前後のポーズを混ぜて切り替える時間です。今回はこの値から始め、動きを見て調整します。

7. 地上と空中の中身を作る

Groundedをダブルクリックし、コンテンツブラウザから BS_Locomotion をグラフへドラッグします。これで、Blend Spaceを再生する Playerノードが置かれます。Get Speedを入力の「Speed」へ、ポーズ出力を Output Animation Pose へつなぎます。BS_Locomotionのノードを選び、Detailsの「Loop」をオンにして、歩き・走りを繰り返せるようにします。

Grounded内でSpeedをBS_Locomotionへ渡し、作ったポーズをOutput Animation Poseへつなぐ

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

InAir内でMM_Fall_Loopを繰り返し再生し、Output Animation Poseへつなぐ

今回は空中を1状態にまとめるため、ジャンプで上がる間も下がる間も、同じ空中アニメーションを使います。踏み切りや着地の専用モーションは、土台が動いてから足していきましょう。

8. キャラクターに割り当てる

BP_ThirdPersonCharacterのMeshを選び、次のように設定します。

設定
Animation ModeUse Animation Blueprint
Anim ClassABP_Player

ABP_PlayerとBP_ThirdPersonCharacterをコンパイルして保存し、Playします。止まると待機、移動すると走り、ジャンプで空中の姿勢に変わり、着地して地上へ戻れば成功です。

テンプレートの既存AnimBPを今回の簡単な構成へ置き換えたので、元の足の接地補正などは含みません。まずは状態と速度の対応を確かめましょう。

Sponsored

速度を変えて、混ざり方を確かめる

キーボードの移動キーは、押している間に速く加速するため、歩きの見た目をじっくり観察しにくいことがあります。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へ戻します。

Blend Spaceに置いた0・150・500の位置と、325で移動したときに歩きと走りが混ざる場所

ジャンプも、移動しながらと、その場での両方を試してください。空中へ移る条件は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 AccessBlueprint Thread Safe Update Animation を使う方法も検討できます。初めは、どのキャラクターから何の値を取るかが見える構成で理解を固めましょう。

また、大量の素材から状況に合う動きを探す Motion Matching もあります。Game Animation Sampleの記事へ進むときも、「移動の状態と、表示するポーズは別」という今回の考え方が土台になります。

まとめ

State Machineは、条件を見て地上・空中などの状態を選びます。Blend Spaceは、その状態の中で数値に合う混ざり具合を作ります。今回のGroundedにBlend Spaceを入れる構成なら、歩き・走りのために状態を細かく増やさずに済みます。

Event GraphからSpeedとbIsInAirを渡し、Anim Graphでポーズを最後の出力までつなぐ。この流れができたら、速度の上限を変えたり、その場でジャンプしたりして、どの値がどの見た目を変えているかを確かめてみてください。

参考リンク

Unreal Engine このセクションのノート98