キャラクターが動くようになった直後、多くの人が同じ壁にぶつかります。 止まっているアニメと歩くアニメがカクッと切り替わる 。直そうとして Branch を足していくうちに、イベントグラフが分岐だらけになる。
よくある原因の1つが、アニメーションの切り替えを 1つの方法でやろうとしている ことです。UEには目的の違う2つの道具があり、 State Machine が「別の動作へ切り替える」係、Blend Space が「同じ動作の中で混ぜる」係 を受け持ちます。この記事では、2つの役割分担と、Idle/Walk/Runとジャンプを組み合わせた構成をゼロから作る手順を解説します。
この記事でわかること
- AnimBPは Event Graphで値を集め、Anim Graphでポーズを決める
- State Machine = 別の動作へ 切り替える (地上↔空中)
- Blend Space = 同じ動作の中で 混ぜる (止まる↔歩く↔走る)
- 基本形は State Machineの状態の中にBlend Spaceを置く
- 実践 :Idle/Walk/Runとジャンプを 1つのAnimBPにまとめる
AnimBPの2つのグラフ
Animation Blueprintを開くと、Event Graph と Anim Graph の2つがあります。ここの役割分担が、そのまま設計の指針になります。

| グラフ | 仕事 | 具体例 |
|---|---|---|
| Event Graph | ゲーム側から 値を集めて変数に入れる | 速度、空中かどうか、しゃがんでいるか |
| Anim Graph | 集めた値を使って 最終的なポーズを決める | State Machine、Blend Space、ブレンド処理 |
この分担を崩さないことが、読みやすさに直結します。 Anim Graphの中(遷移条件など)で複雑な計算をしはじめると、途端に読めなくなります。 計算はEvent Graph、判断はAnim Graph 。遷移条件は bIsInAir のような 単純な変数を見るだけ にしておきましょう。
なお、値の更新には
Blueprint Thread Safe Update AnimationとProperty Accessを使う方法もあります。パフォーマンス面で有利ですが、まずは分かりやすいEvent Graph方式で構造を掴むのがおすすめです。
State Machine:切り替える
State Machine は、キャラクターが「いまどの動作をしているか」を管理する仕組みです。状態(State)を丸で、遷移(Transition)を矢印で表します。

出番は 動作の性質が根本から変わるとき です。
| 遷移 | なぜState Machineなのか |
|---|---|
| 地上移動 → ジャンプ | 地上と空中では動きのルールが違う。混ぜても意味がない |
| どの状態からでも → 死亡 | 割り込みで即座に切り替わるべきもの |
| 移動 → しゃがみ | 移動のルール自体が変わる |
遷移には 条件 を書きます。ここが冒頭で触れた「分岐だらけ」問題の解決策で、Branch を並べる代わりに 矢印に条件を持たせる ことで、流れが図として読めるようになります。
カクッとするのは遷移の設定です。 「切り替わりが瞬間的で不自然」なときは、State Machineの 遷移線をクリック して、詳細パネルの
Blend Settings(Duration)を確認してください。ここが0だと文字どおり瞬間的に切り替わります。 地上→空中のような大きな切り替えでも短いブレンドは必要 で、0.15〜0.25秒あたりが自然に見える目安です。
Blend Space:混ぜる
Blend Space は、複数のアニメーションを 数値に応じて混ぜ合わせる アセットです。State Machineが 「いまどの状態か」を条件で管理する のに対し、Blend Spaceは 連続した数値から混ざり具合を決めます 。(なお、State Machineも遷移の最中は2つのポーズをブレンドします。違いは「混ざるかどうか」ではなく、 何をきっかけに切り替えるか です)

種類は2つです。
- Blend Space 1D: パラメータが 1つ 。速度に応じて Idle → Walk → Run と変化させる、いちばんよく使う形
- Blend Space(2D): パラメータが 2つ 。速度と方向で8方向移動、PitchとYawで照準の上下左右など
作り方は直感的で、グラフ上の座標にアニメーションを置いていくだけです。速度0の位置にIdle、300の位置にWalk、600の位置にRunを置けば、 その間の速度では自動的に混ざったポーズ が作られます。速度450なら、WalkとRunがちょうど半々くらいで混ざります。
2Dで方向を使うなら
Calculate Direction。VelocityとキャラクターのRotationを渡すと、進行方向が -180〜180度で返ります。さらに キャラクターの向きと移動方向を独立させたい (ストレイフ移動)なら、Character Movement ComponentのOrient Rotation to Movementを オフ にする必要があります。ここがオンのままだと、キャラは常に進行方向を向くので、横歩きも後ろ歩きも発生しません。
組み合わせるのが基本形
2つは競合するものではなく、 入れ子にして使う のが定石です。

- 外側(State Machine): 地上か、空中か、死亡か —— 大きな切り替え
- 内側(Blend Space): 地上にいるとき、どのくらいの速さで動いているか —— 細かい変化
こうすると、それぞれが得意なことだけを担当します。 状態が切り替わる瞬間 は外側の遷移ブレンドで滑らかにつなぎ、 同じ状態の中での速度変化 は内側のBlend Spaceが受け持つ、という分担です。迷ったときは 「急な切り替えは外側、連続的な変化は内側」 に戻ってください。
実践:Idle/Walk/Runとジャンプを組む
アクションゲームの主人公、見下ろし型ARPGのキャラ、ホラーゲームの一人称の足音連動——「止まる・歩く・走る・跳ぶ」はどんなゲームにも必要な土台です。ここでは、その最小構成を組み立てます。
再現用の準備: Third Personテンプレート で新規プロジェクトを作ってください。標準のキャラクターは BP_ThirdPersonCharacter 、アニメーションは Characters/Mannequins/Animations にあります。
| 種類 | 名前 | 内容 |
|---|---|---|
| Blend Space 1D | BS_Locomotion | 横軸 Speed(0〜500)。Idle / Walk / Run を配置 |
| Animation Blueprint | ABP_Player | 親クラス AnimInstance 、スケルトンはマネキンのもの |
ABP_Player の変数 | Speed(Float) | 初期値 0.0 |
ABP_Player の変数 | bIsInAir(Boolean) | 初期値 false |
先にキャラクター側を確認します。 BP_ThirdPersonCharacter を開き、Character Movement コンポーネントの Max Walk Speed を見てください。この値が 実際に出る最高速度 で、Blend Spaceの軸はこれに合わせます(テンプレートの既定は500前後です。違う値なら、以降の500を読み替えてください)。前の節で挙げた0/300/600は仕組みを説明するための例で、実際の配置はこの Max Walk Speed に合わせるため、この実践では500を上限にします。
ステップ1:Blend Spaceを作る。 コンテンツブラウザで右クリック → Animation → Blend Space 1D 。スケルトンにマネキンのものを選び、BS_Locomotion と名付けます。
Asset Details の Axis Settings で、横軸の名前を Speed 、Maximum Axis Value を 500 に。そこへアニメーションをドラッグして置きます。
| 位置 | 置くアニメーション |
|---|---|
| 0 | MM_Idle |
| 150 | MM_Walk_Fwd(歩き) |
| 500 | MM_Run_Fwd(走り) |
置いたら、プレビュー画面で Ctrl を押しながらマウスを左右に動かして ください。Ctrl がないとプレビューは動きません。混ざり具合がその場で確認できます。
ステップ2:Event Graphで値を集める。 ABP_Player を開き、Event Graphに次を組みます。

Event Blueprint Update Animation
→ Cast To Character(Object: Try Get Pawn Owner の戻り値)
成功 → Set Speed(Vector Length(Get Velocity))
→ Set bIsInAir(Get Character Movement → Is Falling)
Try Get Pawn Owner は 実行ピンを持たないPureノード です。実行線は Cast To Character へつなぎ、Try Get Pawn Owner の戻り値は Object ピンへ データ線で 渡します。ここを間違えると繋がりません。
Cast To Character にしておくと、テンプレートのキャラクターでも自作のCharacterでもそのまま動きます。
ステップ3:Anim GraphにState Machineを作る。 Anim Graphで右クリック → State Machines → Add New State Machine 。Locomotion と名付けます。
そして、この Locomotion ノードの出力を Output Pose へつないでください。 ここを忘れるとコンパイルが通らないか、キャラクターがTポーズのままになります。
ステップ4:状態と遷移を作る。 Locomotion をダブルクリックして中に入ります。

- 右クリック →
Add StateでGroundedとInAirを作る EntryからGroundedへドラッグして接続Groundedの外周からInAirへドラッグすると 遷移の矢印 ができる。逆向きも同様に作る- 矢印の丸いアイコンを ダブルクリック すると条件のグラフが開く。ここで変数を
Can Enter Transitionへつなぐ
| 遷移 | 条件 |
|---|---|
Grounded → InAir | bIsInAir をそのまま接続 |
InAir → Grounded | bIsInAir を Not で反転して接続 |
ステップ5:状態の中身を作る。 Grounded をダブルクリックして中へ。BS_Locomotion を配置し、Speed 変数を入力につないで、出力を Output Animation Pose へ。

InAir の中には MM_Fall_Loop のような ループする落下アニメーション を置きます。ジャンプ開始のような短いアニメーションを置くと、最終フレームで止まったままになります。配置したノードを選び、Loop Animation にチェックが入っているか確認してください。
ステップ6:キャラクターに割り当てて、コンパイルする。 BP_ThirdPersonCharacter のMeshコンポーネントを選び、詳細パネルで Animation Mode を Use Animation Blueprint 、Anim Class を ABP_Player に設定します。
そして ABP_Player とキャラクターBPの両方をCompileして保存 してからPlayします。
Playして動かしてみてください。 ゆっくり歩くとWalk、スティックを倒し切るとRunへ滑らかに変化し、ジャンプすると落下アニメに切り替わって着地で戻る 。ここまで確認できれば成功です。
動いたら、Max Walk Speed を一度 250 に下げて走り続けてみてください。最高速でもRunに届かず、WalkとRunの中間の混ざったポーズがずっと見えます。Blend Spaceが「補間している」ことを止め絵で体感できる実験です。確認したら元の500に戻します。
うまくいかないときの切り分けです。
- Tポーズのまま動かない →
LocomotionがOutput Poseに繋がっていない、Anim Class未設定、またはCompile忘れ - 速度が変わってもIdleのまま →
Speedが0のままです。Event GraphのCastが成功しているか確認 - RunにならずWalk止まり → 実速度がRunの配置位置(500)に届いていません。
Max Walk Speedを確認 - 空中でポーズが固まる →
InAirのアニメがループしていません - 切り替わりがカクッとする → 遷移線を選び
Blend SettingsのDurationを0.2秒前後に
ポイントは2つです。
- 遷移条件は変数を見るだけにする: 計算はEvent Graph側でやり、Anim Graphには結果だけ渡します。この線引きを守るだけで、状態が増えても破綻しません
- サンプルの配置位置は、実際に出る速度に合わせる: 全力で走ってもWalkとRunの中間で止まるなら、実速度がRunの配置値に届いていないということ。
Print StringでSpeedの実測値を見て、配置位置を調整します
攻撃や被弾のような 一時的に割り込む動作 は、State Machineに状態を足すのではなく Anim Montage で扱うほうが管理しやすくなります(作り方は Animation Montage入門:Notifyで当たり判定を出す)。AIの行動そのものを組み立てる段階なら Behavior Treeで敵AIを作る へ進んでください。
おまけ:先に知っておくと良いこと
Anim Montageは、一時的な動作を割り込ませる道具です。 攻撃モーションをState Machineの状態として作ることもできますが、状態が増えるほど遷移の管理が大変になります。Montageなら1本のアセットとして扱えます。
ただし Montageを作って再生するだけでは映りません 。Anim Graphに Slot ノード を置いて、既存のポーズの経路に組み込む必要があります。「走りながら上半身だけ攻撃」のように部位を分けるなら、Slot と Layered blend per bone を組み合わせます。作り方から当たり判定の出し方までは Animation Montage入門:Notifyで当たり判定を出す で扱っています。
多くの状態から同じ場所へ飛ぶなら、State Aliasを使います。 「どの状態からでも死亡へ」のような遷移は、矢印を全状態から引くと蜘蛛の巣になります。State Machine内で右クリック → Add State Alias を追加し、詳細パネルの Global Alias を有効にすると、そこから1本引くだけで済みます。
Blend Spaceのプレビューは信用していいですが、実機の速度は別です。 プレビューでの見た目が良くても、実際のキャラクターの速度がその範囲に収まっていなければ意味がありません。Print String で Speed の実測値を出して、Blend Spaceの軸範囲と合っているか確かめるのが確実です(→ Print Stringで値を確認する)。
AnimBPは毎フレーム動きます 。 Event Blueprint Update Animation はTickと同じ頻度で走るので、ここに重い処理を入れるとキャラクターの数だけ負荷が増えます。 値を取ってきて変数に入れるだけ に留めるのが鉄則です。
移動アニメには別のアプローチもあります。 大量のアニメーションから「いまの速度と向きに一番合うポーズ」を毎フレーム選び続ける Motion Matching という方式があり、Epicが公開しているサンプル(GASP)から始められます。State MachineとBlend Spaceで土台を理解してから触ると、何が自動化されているのかが分かります(→ Motion MatchingとGame Animation Sample)。
まとめ
2つの道具の使い分けは、この1行に集約されます。
| State Machine | Blend Space | |
|---|---|---|
| 役割 | 別の動作へ 切り替える | 同じ動作の中で 混ぜる |
| 向いているもの | 地上↔空中、通常↔死亡、通常↔攻撃 | 止まる↔歩く↔走る、照準の上下左右 |
| 入力 | 条件(Boolean) | 数値(速度、角度) |
| 配置 | Anim Graphに置く | State Machineの状態の中 に置く |
そして設計の指針が1つ。 計算はEvent Graph、判断はAnim Graph です。遷移条件が数式でふくらみはじめたら、それはEvent Graphに移 すサインになります。
あなたのキャラクター、走り出す瞬間になめらかに繋がっていますか?