Blend Tree とは?
Blend Treeは、Animator Controllerの中で複数のアニメーションを滑らかに混ぜ合わせる機能です。
通常のTransitionでは、アニメーション間を「切り替える」だけですが、Blend Treeでは複数のアニメーションを同時に再生し、
パラメータの値に応じて滑らかにブレンドします。
複数のアニメーションを滑らかに混ぜ合わせる仕組み
例えば、キャラクターの移動アニメーションでは以下のような状況があります:
- 停止している時 → Idleアニメーション
- ゆっくり歩く時 → Walkアニメーション
- 速く走る時 → Runアニメーション
通常のTransitionでは、Idle → Walk → Run と切り替わりますが、速度が中間の場合はどうでしょうか?
Blend Treeを使うと:
- 速度が1.5の時:Walk 50% + Run 50% → 中間的な動き
- 速度が0.5の時:Idle 50% + Walk 50% → 緩やかな動き出し
このように、パラメータの値に応じてアニメーションを自動的にブレンドし、滑らかで自然な動きを実現します。
Blend Treeが解決する問題
歩く→走るの切り替えが不自然
通常のTransitionだけでは、以下のような問題が発生します:
問題例:
速度 0.0 → Idle
速度 3.0 → Walk
速度 6.0 → Run
この設定では、速度が2.9から3.1に変わった瞬間に、IdleからWalkへ「パキッ」と切り替わってしまいます。
実際のキャラクターの動きとしては不自然です。

8方向移動のアニメーション管理の複雑さ
前後左右斜めの8方向に移動するキャラクターを考えてみましょう。
Transitionだけで実装すると:
- 前進State
- 後退State
- 左移動State
- 右移動State
- 左前State
- 右前State
- 左後State
- 右後State
8つのStateと、それぞれの間のTransitionを設定する必要があり、管理が非常に複雑になります。
Blend Treeを使えば、1つのBlend Tree Stateで8方向すべてに対応できます。
Blend Treeの種類
1D Blend Tree
1つのパラメータで制御。移動速度(Idle → Walk → Run)などに使用。
2D Simple Directional
2つのパラメータで方向性を重視。前後左右の移動に使用。
2D Freeform Directional
2つのパラメータで自由な方向に対応。8方向移動やストレイフ移動に使用。
2D Freeform Cartesian
2つのパラメータで座標ベースに配置。複雑な移動パターンに使用。
Direct Blend Tree
複数のパラメータで各アニメーションを個別制御。表情のブレンドなどに使用。
1D Blend Treeの作成と使い方
最も基本的な1D Blend Treeから始めましょう。
Blend Treeの作成方法
手順:
AnimatorControllerウィンドウを開く- 空白部分を右クリック
- Create
State> From NewBlend Treeを選択 - 作成された
Blend TreeStateをダブルクリック
Blend Treeの編集画面に入ります。
アニメーションクリップの追加
手順:
- Inspectorの
Motionセクションで + ボタンをクリック - Add
MotionField を選択 - 作成されたMotionフィールドに、アニメーションクリップをドラッグ&ドロップ

Thresholdの設定
Thresholdは、各アニメーションが再生される「しきい値」です。
例:Idle → Walk → Run
Motion Threshold
Idle 0.0
Walk 3.0
Run 7.0
この設定の場合:
- Speed = 0.0:Idle 100%
- Speed = 1.5:Idle 50% + Walk 50%
- Speed = 3.0:Walk 100%
- Speed = 5.0:Walk 50% + Run 50%
- Speed = 7.0以上:Run 100%
パラメータとの紐付け
手順:
Blend TreeStateを選択- Inspectorの
Blend Typeを1Dに設定 Parameterドロップダウンから、使用するパラメータを選択(例:Speed)
実例:Idle → Walk → Run の滑らかな遷移
完全な実装例です。
Animator Controllerの設定:
Blend TreeStateを作成(名前:Movement)- 3つのアニメーションクリップを追加:
- Idle(
Threshold: 0) - Walk(
Threshold: 3) - Run(
Threshold: 7)
- Idle(
ParameterにSpeedを設定
スクリプト:
using UnityEngine;
public class BlendTreeMovement : MonoBehaviour
{
[SerializeField] private float _maxWalkSpeed = 3f;
[SerializeField] private float _maxRunSpeed = 7f;
private Animator _animator;
private Rigidbody _rigidbody;
private void Start()
{
_animator = GetComponent<Animator>();
_rigidbody = GetComponent<Rigidbody>();
}
private void Update()
{
// 入力取得
float horizontal = Input.GetAxis("Horizontal");
float vertical = Input.GetAxis("Vertical");
Vector3 direction = new Vector3(horizontal, 0, vertical).normalized;
// 速度計算
float targetSpeed = 0f;
if (direction.magnitude > 0.1f)
{
// 走る入力があれば最高速度
if (Input.GetKey(KeyCode.LeftShift))
{
targetSpeed = _maxRunSpeed;
}
else
{
targetSpeed = _maxWalkSpeed;
}
}
// Animatorに速度を渡す(Blend Treeが自動的にブレンド)
_animator.SetFloat("Speed", targetSpeed);
// 移動処理
if (direction.magnitude > 0.1f)
{
_rigidbody.MovePosition(transform.position + direction * targetSpeed * Time.deltaTime);
}
}
}
これで、速度に応じてIdle、Walk、Runが滑らかにブレンドされます。

2D Blend Treeの作成と使い方
2D Blend Treeは、2つのパラメータを使って、より複雑なアニメーションブレンドを実現します。
2D Blend Treeの作成
手順:
Blend TreeStateを作成- Inspectorの
Blend Typeを2D Freeform Directionalに設定 Parametersに2つのパラメータを設定:VelocityX(左右)VelocityZ(前後)
アニメーションの配置(8方向移動)
8方向の移動アニメーションを配置します。
Motion** リスト:**
Motion Pos X Pos Y
Idle 0.0 0.0
Forward 0.0 1.0
Backward 0.0 -1.0
Left -1.0 0.0
Right 1.0 0.0
Forward Left -0.7 0.7
Forward Right 0.7 0.7
Backward Left -0.7 -0.7
Backward Right 0.7 -0.7

これで、PosX,PosYの値が変化することでブレンドされるアニメーションが変化します。

スクリプトからの制御
Blend Treeのパラメータは、通常のAnimatorパラメータと同じ方法で制御します。
Blend Treeパラメータの設定
using UnityEngine;
public class BlendTreeController : MonoBehaviour
{
private Animator _animator;
// パラメータ名をハッシュ化(パフォーマンス最適化)
private readonly int _speedHash = Animator.StringToHash("Speed");
private readonly int _velocityXHash = Animator.StringToHash("VelocityX");
private readonly int _velocityZHash = Animator.StringToHash("VelocityZ");
private void Start()
{
_animator = GetComponent<Animator>();
}
// 1D Blend Tree の制御
public void SetSpeed(float speed)
{
_animator.SetFloat(_speedHash, speed);
}
// 2D Blend Tree の制御
public void SetVelocity(float x, float z)
{
_animator.SetFloat(_velocityXHash, x);
_animator.SetFloat(_velocityZHash, z);
}
// 滑らかに変化させる(Damping Time)
public void SetSpeedSmooth(float speed, float dampingTime)
{
_animator.SetFloat(_speedHash, speed, dampingTime, Time.deltaTime);
}
}
移動ベクトルをBlend Treeに渡す
実際のゲームでの使用例:
using UnityEngine;
public class CharacterMovement : MonoBehaviour
{
[SerializeField] private float _moveSpeed = 5f;
[SerializeField] private float _animationSmoothTime = 0.1f;
private Animator _animator;
private CharacterController _controller;
private Vector3 _velocity;
private readonly int _velocityXHash = Animator.StringToHash("VelocityX");
private readonly int _velocityZHash = Animator.StringToHash("VelocityZ");
private void Start()
{
_animator = GetComponent<Animator>();
_controller = GetComponent<CharacterController>();
}
private void Update()
{
// 入力取得
float horizontal = Input.GetAxis("Horizontal");
float vertical = Input.GetAxis("Vertical");
Vector3 inputDirection = new Vector3(horizontal, 0, vertical);
// 移動
if (inputDirection.magnitude > 0.1f)
{
// 移動方向に回転
Quaternion targetRotation = Quaternion.LookRotation(inputDirection);
transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, 10f * Time.deltaTime);
// キャラクターコントローラーで移動
_velocity = inputDirection.normalized * _moveSpeed;
_controller.Move(_velocity * Time.deltaTime);
}
else
{
_velocity = Vector3.zero;
}
// Animatorに値を渡す(滑らかに変化)
_animator.SetFloat(_velocityXHash, horizontal, _animationSmoothTime, Time.deltaTime);
_animator.SetFloat(_velocityZHash, vertical, _animationSmoothTime, Time.deltaTime);
}
}
Blend Treeの詳細設定
Blend Treeの動作を細かく調整できます。
Automate Thresholds(自動閾値)
ONにすると、Threshold値が自動的に均等に配置されます。
使い分け:
- OFF: 手動で細かく調整したい場合(推奨)
- ON: 均等な配置で問題ない場合
Compute Thresholds(閾値計算)
アニメーションクリップの特性から、自動的にThresholdを計算します。
主な計算方法:
- Velocity:
Root Motionの速度から計算(移動アニメーション向け) - Angular Velocity: 回転速度から計算
- Speed: 速度と角速度を組み合わせ
複数の表情を混ぜ合わせる
キャラクターの表情を細かく制御する事も出来ます。
設定:
Blend TypeをDirectに設定- 表情アニメーションを追加(Smile、Surprise、Angerなど)
- それぞれにパラメータを割り当て(
SmileWeight、SurpriseWeightなど)
使用例:
// 笑顔50% + 驚き30%の複合表情
_animator.SetFloat("SmileWeight", 0.5f);
_animator.SetFloat("SurpriseWeight", 0.3f);
_animator.SetFloat("AngerWeight", 0.0f);
これにより、複数の表情を同時に組み合わせて細かい感情表現ができます。
注意点とベストプラクティス
1. アニメーションクリップの準備(ルートモーション)
Blend Treeで使用するアニメーションクリップは、ルートモーションの設定を統一する必要があります。
推奨:
- すべてのクリップで
In Place(その場で再生)にする - または、すべてで
Root Motionを有効にする
混在させると:
- 一部のアニメーションだけキャラクターが移動してしまう
- ブレンド時に不自然な動きになる
2. Thresholdの適切な設定
Threshold値は、実際のゲームプレイの速度範囲に合わせて設定します。
例:
最大歩行速度 = 3.0
最大走行速度 = 7.0
→ Walk の Threshold = 3.0
→ Run の Threshold = 7.0
こうすることで、ゲーム内の速度とアニメーションが正確に対応します。
3. パフォーマンスへの影響
Blend Treeは複数のアニメーションを同時に計算するため、通常のStateよりも負荷が高くなります。
最適化:
- 必要最小限のMotionに留める(8方向なら8個、不要なら減らす)
- 使用頻度の低いキャラクターには、シンプルなTransitionを使う
- モバイルでは、
Blend Treeの数を制限する
4. デバッグ方法
ゲーム実行中にBlend Tree Stateをダブルクリックすると、Inspectorに現在のパラメータ値と各Motionのブレンド比率がリアルタイム表示されます。パラメータ値を手動で変更して、アニメーションの変化を確認できます。
まとめ
Blend Treeは、複数のアニメーションを滑らかに混ぜ合わせ、自然な動きを実現する強力な機能です。
重要なポイント
1D Blend Tree- 速度など1つのパラメータで制御2D Blend Tree- 方向など2つのパラメータで複雑な動きを表現Direct Blend Tree- 複数のアニメーションを独立して制御Threshold- アニメーションが再生される範囲を設定- パフォーマンス - 必要最小限のMotionに留める
使用を検討すべき場面
以下のような場面でBlend Treeを活用してください:
- 移動速度に応じた滑らかなアニメーション切り替え
- 8方向移動など、方向に応じたアニメーション
- 表情や感情の細かい制御
- 複雑な動作の組み合わせ
Blend Treeを使いこなして、生き生きとした自然なキャラクターアニメーションを実現しましょう!