Animation Blueprintが必要な理由
Unreal Engineでキャラクターを動かし始めたとき、以下のような問題に直面していませんか?
- 「待機(Idle)」から「歩行(Walk)」に切り替わる瞬間が不自然で、アニメーションが急に飛んだように見える。
- 「歩行」と「走行(Run)」のアニメーションを切り替えるために、複雑な条件分岐(Branch)ノードを大量に使ってしまい、Blueprintがごちゃごちゃになっている。
- ジャンプや攻撃などの特殊な動作を、移動アニメーションとどう両立させればいいか分からない。
これらの問題は、Unreal Engineのアニメーションシステムの中核であるAnimation Blueprint (AnimBP) のState Machine とBlend Space の役割と使い分けを理解することで、劇的に改善できます。
本記事では、UE初心者から中級者を目指す方に向けて、この2つの強力なツールがどのように連携し、プロのような滑らかで効率的なキャラクターアニメーションを実現するのかを、具体的なBlueprintの例を交えて徹底的に解説します。
Animation Blueprintとは
Animation Blueprintは、キャラクターの骨格(スケルトン)に対して、どのタイミングでどのアニメーションを、どのようなブレンド(合成)で適用するかを制御するための特別なBlueprintです。
AnimBPは主に2つのグラフで構成されています。
- Event Graph (イベントグラフ): キャラクターの速度やジャンプ中かどうかといったゲームプレイの情報を取得し、それらの値をアニメーションロジックに渡すための処理を行います。
- Anim Graph (アニメーショングラフ): 実際にアニメーションをブレンドしたり、State Machineを配置したりして、最終的なポーズを決定するロジックを構築します。
このAnim Graphの中で、キャラクターの「状態」を管理するのがState Machine、「状態内での滑らかな遷移」を管理するのがBlend Space です。
State Machineの基礎と役割
State Machine(ステートマシン) は、キャラクターが現在どのような「状態」にあるかを定義し、その状態間の「遷移(トランジション)」を管理する仕組みです。
状態(State)とは
状態とは、キャラクターの特定の動作パターンを指します。例えば、以下のようなものが状態として定義されます。
- Idle/Run (待機/走行): 地面を移動している状態
- Jump (ジャンプ): 空中にいる状態
- Attack (攻撃): 攻撃動作をしている状態
- Death (死亡): 死亡している状態
遷移(Transition)とは
遷移は、ある状態から別の状態へ切り替わるための「条件」を定義します。
例えば、「Idle/Run」状態から「Jump」状態へ遷移するための条件は、「IsInAir変数がTrueになったとき」 となります。逆に、「Jump」状態から「Idle/Run」状態へ戻る条件は、「IsInAir変数がFalseになったとき(地面に着地したとき)」となります。
💡 IsFallingとIsInAirの違い
Character Movement ComponentのIsFalling()は、キャラクターが落下中のときのみTrueを返します(上昇中はFalse)。ジャンプ全体(上昇+落下)を判定したい場合は、IsMovingOnGround()の否定(!IsMovingOnGround())を使用するか、独自のIsInAir変数を管理することをお勧めします。
【State Machineのベストプラクティス】
State Machineは、動作が根本的に異なる、またはアブノーマルな(急激な)切り替え が必要な場合に最適です。
| 状態遷移の例 | 適切な理由 |
|---|---|
| Idle/Run → Jump | 動作パターンが「地上」から「空中」へ根本的に変化するため |
| Any State → Death | 優先度の高い、即座に発生すべき状態変化のため |
| Idle → Attack | 攻撃中は移動ロジックを一時停止する必要があるため |
💡 Death状態の設計について
「Any State → Death」のような遷移は、多くのプロジェクトで復活しない前提の最終状態 として特別扱いされます。Death状態からは他の状態への遷移を設けない(または「復活」イベントでのみ遷移可能にする)設計が一般的です。
Blend Spaceの基礎と役割
Blend Space(ブレンドスペース) は、複数のアニメーションを一つのアセット内で定義し、特定の入力値(パラメータ)に基づいてそれらを滑らかに合成(ブレンド) するための仕組みです。
1Dと2Dのブレンド
Blend Spaceには、主に以下の2種類があります。
- Blend Space 1D: 1つのパラメータ(例:速度)に基づいてアニメーションをブレンドします。
- 例:速度0でIdle、速度300でWalk、速度600でRunのアニメーションを配置し、速度に応じて滑らかに遷移させます。
- Blend Space (2D): 2つのパラメータ(例:速度と方向)に基づいてアニメーションをブレンドします。
- 例:移動速度と、キャラクターの向きに対する移動方向(フォワード、バック、レフト、ライト)をブレンドし、8方向移動やストレイフ移動を実現します。
💡 移動方向の取得方法
2D Blend Spaceで使用する「方向(Direction)」は、Calculate Direction ノードで取得できます。このノードは、Velocityベクトルとキャラクターの向き(Rotation)から、-180〜180度の範囲で移動方向を計算します。また、ストレイフ移動(キャラクターの向きと移動方向が独立)を実装する場合は、Character Movement ComponentのOrient Rotation to Movement をOffにする必要があります。
Blend Spaceの仕組み
Blend Spaceアセットを作成すると、X軸(2Dの場合はY軸も)にパラメータの範囲(例:Min 0, Max 600)を設定します。このグリッド上に、対応するアニメーション(例:Idle、Walk、Run)を配置するだけで、Unreal Engineが自動的にその間の補間(ブレンド)を行ってくれます。
💡 補間設定(Axis Settings)について
Blend SpaceのAxis Settings では、
Interpolation Time(補間時間)を設定できます。この値を調整することで、急な入力変化に対してアニメーションがどれだけ滑らかに追従するかを制御できます。値が小さいほど即座に反応し、大きいほど滑らかになります。
【Blend Spaceのベストプラクティス】
Blend Spaceは、同じ動作カテゴリ内での滑らかな変化 が必要な場合に最適です。
| 動作変化の例 | 適切な理由 |
|---|---|
| Idle ↔ Walk ↔ Run | 速度という単一のパラメータで、地上移動という同じカテゴリ内で滑らかに変化するため |
| Aiming (上下左右) | 2つのパラメータ(PitchとYaw)で、上半身のポーズを滑らかに合成するため |
State MachineとBlend Spaceの連携
State MachineとBlend Spaceは、対立するものではなく、連携して使用する ことで最も効率的なアニメーション構造を構築できます。
構造の基本
最も一般的なキャラクターアニメーションの構造は以下のよう になります。
- State Machine で、キャラクターの大まかな状態 (地上移動、ジャンプ、攻撃など)を切り替えます。
- 「地上移動」などの状態(State)の中 に、Blend Space を配置します。
- Blend Space内で、その状態内での滑らかな変化 (Idle ↔ Run)を処理します。
これにより、「ジャンプ」という急激な状態変化はState Machineが担当し、「歩く速さの変化」という滑らかな変化はBlend Spaceが担当するという、役割分担が明確になります。
実践的なBlueprint例
ここでは、キャラクターの地上移動(Idle ↔ Run)を制御するための基本的なAnim Graphの構成を見てみましょう。
ステップ1:Event Graphで必要な変数を取得する
まず、Event Graphでキャラクターの速度とジャンプ状態を取得し、AnimBPの変数に格納します。
Blueprint (Event Graph) の例:
// 1. Try Get Pawn Owner (所有者であるPawnを取得)
// 2. Is Valid (Pawnが有効かチェック)
// 3. Get Velocity (速度ベクトルを取得)
// 4. Vector Length (ベクトルの長さを計算 = 速度)
// 5. Set Speed (計算した速度をAnimBPのfloat変数 'Speed' に設定)
// 6. Character Movement Component を取得
// 7. Is Moving On Ground (地面に接地しているかチェック)
// 8. NOT ノードで反転し IsInAir を取得
// 9. Set IsInAir (結果をAnimBPのbool変数 'IsInAir' に設定)
ステップ2:Anim GraphでState Machineを構築する
Anim GraphにState Machineノードを配置し、基本的な「地上移動」と「ジャンプ」の状態を定義します。
State Machineの構成:
- Entry →Idle/Run (初期状態)
- Idle/Run →Jump Start (遷移条件:
IsInAirが True) - Jump Start →Idle/Run (遷移条件:
IsInAirが False)
ステップ3:Idle/Run State内にBlend Spaceを配置する
「Idle/Run」状態をダブルクリックして中に入り、作成済みのBlend Space 1Dアセット(例:BS_Idle_Walk_Run)を配置します。
Blueprint (Idle/Run State内) の例:
// 1. Blend Space 1D アセット (BS_Idle_Walk_Run) を配置
// 2. Blend Spaceの入力ピンに Event Graphで取得した 'Speed' 変数を接続
// 3. 結果を Final Animation Pose に接続
このシンプルな構造により、State Machineは「地上にいるか、空中にいるか」という大きな判断を担い、Blend Spaceは「地上にいるときの速度に応じた滑らかなアニメーション」を担うことになります。
よくある間違いとベストプラクティス
よくある間違い
| 間違い | 説明 | 解決策 |
|---|---|---|
| Blend Spaceの乱用 | ジャンプや攻撃など、急激な動作変化をBlend Spaceで無理にブレンドしようとする。 | State Machine で状態を切り替えるべきです。Blend Spaceはあくまで同じカテゴリ内の滑らかな遷移に限定します。 |
| 遷移条件の複雑化 | State Machineの遷移条件(Transition Rule)に、大量のノードや複雑な計算を直接書き込む。 | 遷移条件はシンプルに保ち、複雑な計算はEvent Graph で行い、結果を変数として渡すべきです。 |
| Montageとの混同 | 攻撃や被弾など、一時的で割り込みが必要なアニメーションをState Machineだけで処理しようとする。 | 攻撃や被弾、ドアを開けるなどの一時的な動作には、Anim Montage を使用し、State Machineの上位レイヤーで再生すべきです。 |
ベストプラクティス
- Event GraphとAnim Graphの役割分担を徹底する:
- Event Graph: ゲームロジック(速度、入力、状態)から情報を取得し、Anim Graph用の変数に格納する。
- Anim Graph: 渡された変数を使って、State MachineやBlend Spaceなどのアニメーションロジックを構築する。
- State Machineは「アブノーマルな変化」に使う:
- 地上 ↔ 空中、通常 ↔ 死亡、通常 ↔ 攻撃など、動作の性質が大きく変わる部分に限定します。
- Blend Spaceは「滑らかな変化」に使う:
- 速度や方向、照準の角度など、連続的な値に基づいてアニメーションを補間したい場合にのみ使用します。
Animation Blueprintの活用ポイント
本記事では、Unreal EngineのAnimation BlueprintにおけるState Machine とBlend Space の基本的な役割と、それらを連携させて効率的なアニメーションロジックを構築する方法を解説しました。
| 要素 | 役割 | 最適な使用例 |
|---|---|---|
| State Machine | キャラクターの大まかな状態 を定義し、急激な遷移 を管理する。 | 地上移動 ↔ ジャンプ、通常 ↔ 死亡 |
| Blend Space | 同じ状態内 で、入力値に基づいて複数のアニメーションを滑らかに合成 する。 | Idle ↔ Walk ↔ Run、照準の上下左右の動き |
この2つの概念を正しく理解し、適切に使い分けることが、Unreal Engineでプロ品質のキャラクターアニメーションを実現するための鍵となります。まずはシンプルなIdle/Walk/RunのBlend Spaceを作成し、それをState Machineに組み込むことから始めてみましょう。
さあ、あなたのキャラクターを「カクカク」から卒業させ、命を吹き込みましょう!