【Unreal Engine】Animation Blueprint入門:State MachineとBlend Spaceの使い分け

作成: 2025-12-12最終更新: 2026-07-19

アニメがカクッと切り替わる、分岐だらけで手に負えない。State Machineは「別の動作へ切り替える」、Blend Spaceは「同じ動作の中で混ぜる」。役割分担を図解し、Idle/Walk/Runとジャンプを組む実践つき。

キャラクターが動くようになった直後、多くの人が同じ壁にぶつかります。 止まっているアニメと歩くアニメがカクッと切り替わる 。直そうとして 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にまとめる

Sponsored

AnimBPの2つのグラフ

Animation Blueprintを開くと、Event GraphAnim Graph の2つがあります。ここの役割分担が、そのまま設計の指針になります。

Event Graphでゲームの値を集め、Anim Graphでポーズを決める、という流れの図
グラフ仕事具体例
Event Graphゲーム側から 値を集めて変数に入れる速度、空中かどうか、しゃがんでいるか
Anim Graph集めた値を使って 最終的なポーズを決めるState Machine、Blend Space、ブレンド処理

この分担を崩さないことが、読みやすさに直結します。 Anim Graphの中(遷移条件など)で複雑な計算をしはじめると、途端に読めなくなります。 計算はEvent Graph、判断はAnim Graph 。遷移条件は bIsInAir のような 単純な変数を見るだけ にしておきましょう。

なお、値の更新には Blueprint Thread Safe Update AnimationProperty Access を使う方法もあります。パフォーマンス面で有利ですが、まずは分かりやすいEvent Graph方式で構造を掴むのがおすすめです。

State Machine:切り替える

State Machine は、キャラクターが「いまどの動作をしているか」を管理する仕組みです。状態(State)を丸で、遷移(Transition)を矢印で表します。

Grounded、InAir、Deathの状態が遷移条件つきの矢印でつながったステートマシンの図

出番は 動作の性質が根本から変わるとき です。

遷移なぜState Machineなのか
地上移動 → ジャンプ地上と空中では動きのルールが違う。混ぜても意味がない
どの状態からでも → 死亡割り込みで即座に切り替わるべきもの
移動 → しゃがみ移動のルール自体が変わる

遷移には 条件 を書きます。ここが冒頭で触れた「分岐だらけ」問題の解決策で、Branch を並べる代わりに 矢印に条件を持たせる ことで、流れが図として読めるようになります。

カクッとするのは遷移の設定です。 「切り替わりが瞬間的で不自然」なときは、State Machineの 遷移線をクリック して、詳細パネルの Blend SettingsDuration)を確認してください。ここが0だと文字どおり瞬間的に切り替わります。 地上→空中のような大きな切り替えでも短いブレンドは必要 で、0.15〜0.25秒あたりが自然に見える目安です。

Blend Space:混ぜる

Blend Space は、複数のアニメーションを 数値に応じて混ぜ合わせる アセットです。State Machineが 「いまどの状態か」を条件で管理する のに対し、Blend Spaceは 連続した数値から混ざり具合を決めます 。(なお、State Machineも遷移の最中は2つのポーズをブレンドします。違いは「混ざるかどうか」ではなく、 何をきっかけに切り替えるか です)

速度0でIdle、300でWalk、600でRunを配置し、その間が自動で補間される1D Blend Spaceの図

種類は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の「Idle/Run」状態の中にBlend Spaceが入っている入れ子構造の図
  • 外側(State Machine): 地上か、空中か、死亡か —— 大きな切り替え
  • 内側(Blend Space): 地上にいるとき、どのくらいの速さで動いているか —— 細かい変化

こうすると、それぞれが得意なことだけを担当します。 状態が切り替わる瞬間 は外側の遷移ブレンドで滑らかにつなぎ、 同じ状態の中での速度変化 は内側のBlend Spaceが受け持つ、という分担です。迷ったときは 「急な切り替えは外側、連続的な変化は内側」 に戻ってください。

Sponsored

実践:Idle/Walk/Runとジャンプを組む

アクションゲームの主人公、見下ろし型ARPGのキャラ、ホラーゲームの一人称の足音連動——「止まる・歩く・走る・跳ぶ」はどんなゲームにも必要な土台です。ここでは、その最小構成を組み立てます。

再現用の準備: Third Personテンプレート で新規プロジェクトを作ってください。標準のキャラクターは BP_ThirdPersonCharacter 、アニメーションは Characters/Mannequins/Animations にあります。

種類名前内容
Blend Space 1DBS_Locomotion横軸 Speed(0〜500)。Idle / Walk / Run を配置
Animation BlueprintABP_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を作る。 コンテンツブラウザで右クリック → AnimationBlend Space 1D 。スケルトンにマネキンのものを選び、BS_Locomotion と名付けます。

Asset DetailsAxis Settings で、横軸の名前を SpeedMaximum Axis Value500 に。そこへアニメーションをドラッグして置きます。

位置置くアニメーション
0MM_Idle
150MM_Walk_Fwd(歩き)
500MM_Run_Fwd(走り)

置いたら、プレビュー画面で Ctrl を押しながらマウスを左右に動かして ください。Ctrl がないとプレビューは動きません。混ざり具合がその場で確認できます。

ステップ2:Event Graphで値を集める。 ABP_Player を開き、Event Graphに次を組みます。

Try Get Pawn OwnerからVelocityとMovement Componentの情報を取り、SpeedとbIsInAirに入れるノードグラフ
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 MachineLocomotion と名付けます。

そして、この Locomotion ノードの出力を Output Pose へつないでください。 ここを忘れるとコンパイルが通らないか、キャラクターがTポーズのままになります。

ステップ4:状態と遷移を作る。 Locomotion をダブルクリックして中に入ります。

EntryからGrounded、GroundedとInAirが双方向の矢印でつながったステートマシンの図
  1. 右クリック → Add StateGroundedInAir を作る
  2. Entry から Grounded へドラッグして接続
  3. Grounded の外周から InAir へドラッグすると 遷移の矢印 ができる。逆向きも同様に作る
  4. 矢印の丸いアイコンを ダブルクリック すると条件のグラフが開く。ここで変数を Can Enter Transition へつなぐ
遷移条件
GroundedInAirbIsInAir をそのまま接続
InAirGroundedbIsInAirNot で反転して接続

ステップ5:状態の中身を作る。 Grounded をダブルクリックして中へ。BS_Locomotion を配置し、Speed 変数を入力につないで、出力を Output Animation Pose へ。

Grounded状態の中でBS_LocomotionにSpeedをつなぎ、Output Animation Poseへ出すノードグラフ

InAir の中には MM_Fall_Loop のような ループする落下アニメーション を置きます。ジャンプ開始のような短いアニメーションを置くと、最終フレームで止まったままになります。配置したノードを選び、Loop Animation にチェックが入っているか確認してください。

ステップ6:キャラクターに割り当てて、コンパイルする。 BP_ThirdPersonCharacter のMeshコンポーネントを選び、詳細パネルで Animation ModeUse Animation BlueprintAnim ClassABP_Player に設定します。

そして ABP_Player とキャラクターBPの両方をCompileして保存 してからPlayします。

Playして動かしてみてください。 ゆっくり歩くとWalk、スティックを倒し切るとRunへ滑らかに変化し、ジャンプすると落下アニメに切り替わって着地で戻る 。ここまで確認できれば成功です。

動いたら、Max Walk Speed を一度 250 に下げて走り続けてみてください。最高速でもRunに届かず、WalkとRunの中間の混ざったポーズがずっと見えます。Blend Spaceが「補間している」ことを止め絵で体感できる実験です。確認したら元の500に戻します。

うまくいかないときの切り分けです。

  • Tポーズのまま動かないLocomotionOutput Pose に繋がっていない、Anim Class 未設定、またはCompile忘れ
  • 速度が変わってもIdleのままSpeed が0のままです。Event Graphの Cast が成功しているか確認
  • RunにならずWalk止まり → 実速度がRunの配置位置(500)に届いていません。Max Walk Speed を確認
  • 空中でポーズが固まるInAir のアニメがループしていません
  • 切り替わりがカクッとする → 遷移線を選び Blend SettingsDuration を0.2秒前後に

ポイントは2つです。

  • 遷移条件は変数を見るだけにする: 計算はEvent Graph側でやり、Anim Graphには結果だけ渡します。この線引きを守るだけで、状態が増えても破綻しません
  • サンプルの配置位置は、実際に出る速度に合わせる: 全力で走ってもWalkとRunの中間で止まるなら、実速度がRunの配置値に届いていないということ。Print StringSpeed の実測値を見て、配置位置を調整します

攻撃や被弾のような 一時的に割り込む動作 は、State Machineに状態を足すのではなく Anim Montage で扱うほうが管理しやすくなります(作り方は Animation Montage入門:Notifyで当たり判定を出す)。AIの行動そのものを組み立てる段階なら Behavior Treeで敵AIを作る へ進んでください。

Sponsored

おまけ:先に知っておくと良いこと

Anim Montageは、一時的な動作を割り込ませる道具です。 攻撃モーションをState Machineの状態として作ることもできますが、状態が増えるほど遷移の管理が大変になります。Montageなら1本のアセットとして扱えます。

ただし Montageを作って再生するだけでは映りません 。Anim Graphに Slot ノード を置いて、既存のポーズの経路に組み込む必要があります。「走りながら上半身だけ攻撃」のように部位を分けるなら、SlotLayered blend per bone を組み合わせます。作り方から当たり判定の出し方までは Animation Montage入門:Notifyで当たり判定を出す で扱っています。

多くの状態から同じ場所へ飛ぶなら、State Aliasを使います。 「どの状態からでも死亡へ」のような遷移は、矢印を全状態から引くと蜘蛛の巣になります。State Machine内で右クリック → Add State Alias を追加し、詳細パネルの Global Alias を有効にすると、そこから1本引くだけで済みます。

Blend Spaceのプレビューは信用していいですが、実機の速度は別です。 プレビューでの見た目が良くても、実際のキャラクターの速度がその範囲に収まっていなければ意味がありません。Print StringSpeed の実測値を出して、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 MachineBlend Space
役割別の動作へ 切り替える同じ動作の中で 混ぜる
向いているもの地上↔空中、通常↔死亡、通常↔攻撃止まる↔歩く↔走る、照準の上下左右
入力条件(Boolean)数値(速度、角度)
配置Anim Graphに置くState Machineの状態の中 に置く

そして設計の指針が1つ。 計算はEvent Graph、判断はAnim Graph です。遷移条件が数式でふくらみはじめたら、それはEvent Graphに移すサインになります。

あなたのキャラクター、走り出す瞬間になめらかに繋がっていますか?