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の作成方法

手順:

  1. Animator Controllerウィンドウを開く
  2. 空白部分を右クリック
  3. Create State > From New Blend Tree を選択
  4. 作成されたBlend Tree Stateをダブルクリック

Blend Treeの編集画面に入ります。

アニメーションクリップの追加

手順:

  1. Inspectorの Motion セクションで + ボタンをクリック
  2. Add Motion Field を選択
  3. 作成された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%

パラメータとの紐付け

手順:

  1. Blend Tree Stateを選択
  2. Inspectorの Blend Type1D に設定
  3. Parameter ドロップダウンから、使用するパラメータを選択(例:Speed

実例:Idle → Walk → Run の滑らかな遷移

完全な実装例です。

Animator Controllerの設定:

  1. Blend Tree Stateを作成(名前:Movement
  2. 3つのアニメーションクリップを追加:
    • Idle(Threshold: 0)
    • Walk(Threshold: 3)
    • Run(Threshold: 7)
  3. ParameterSpeed を設定

スクリプト:

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の作成

手順:

  1. Blend Tree Stateを作成
  2. Inspectorの Blend Type2D Freeform Directional に設定
  3. 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: 速度と角速度を組み合わせ

複数の表情を混ぜ合わせる

キャラクターの表情を細かく制御する事も出来ます。

設定:

  1. Blend TypeDirect に設定
  2. 表情アニメーションを追加(Smile、Surprise、Angerなど)
  3. それぞれにパラメータを割り当て(SmileWeightSurpriseWeightなど)

使用例:

// 笑顔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を使いこなして、生き生きとした自然なキャラクターアニメーションを実現しましょう!