Animation Parameters とは?

Animation Parametersは、Animator Controllerでアニメーションを制御するための変数です。スクリプトからパラメータの値を変更することで、キャラクターの状態に応じて動的にアニメーションを切り替えることができます。

例えば、キャラクターの移動速度に応じてアニメーションを変える場合:

  • Speedパラメータ = 0.0 → 待機アニメーション
  • Speedパラメータ = 3.0 → 歩行アニメーション
  • Speedパラメータ = 7.0 → 走行アニメーション

パラメータはAnimator ControllerTransition(遷移)条件や、Blend Treeの制御に使用されます。

Animator ControllerとParametersの関係

Animator Controllerは、複数のState(状態)とTransition(遷移)で構成されたステートマシンです。Parametersはこのステートマシンを外部から制御するための橋渡し役です。

流れ:

  1. スクリプトからAnimatorコンポーネントに値を設定
  2. Parametersが更新される
  3. Transitionの条件が満たされる
  4. アニメーションが切り替わる

パラメータの種類と特性

Animation Parametersには4つの種類があります。それぞれ用途と特性が異なります。

Float型パラメータ

Float型は、小数を含む連続的な値を扱います。

用途

  • 移動速度(Speed
  • 体力の割合(HealthRatio
  • ターゲットまでの距離(Distance
  • ジャンプの高さ(JumpHeight

Blend Treeとの連携

Float型はBlend Treeとの相性が良く、値の変化に応じて複数のアニメーションを滑らかに混ぜ合わせることができます。

// 移動速度を設定(0.0〜10.0の範囲)
_animator.SetFloat("Speed", 5.5f);

デフォルト値の設定

AnimatorウィンドウのParametersタブで、初期値を設定できます。ゲーム開始時にこの値が適用されます。

Int型パラメータ

Int型は、整数値を扱います。段階的な状態や、カウント値の管理に適しています。

用途

  • コンボ数(ComboCount
  • 攻撃の種類(AttackType:1=弱攻撃、2=強攻撃、3=必殺技)
  • ステージ番号(StageNumber
  • 装備中の武器ID(WeaponID

複数の状態の管理

Int型を使うことで、複数の異なる状態を1つのパラメータで管理できます。

// 攻撃タイプを設定
// 1: 弱攻撃、2: 強攻撃、3: 必殺技
_animator.SetInt("AttackType", 2);

Switch的な使い方

Transitionの条件でInt型パラメータを使うと、switch文のように複数の分岐を作れます。

例:

  • AttackType = 1 → 弱攻撃アニメーション
  • AttackType = 2 → 強攻撃アニメーション
  • AttackType = 3 → 必殺技アニメーション

Bool型パラメータ

Bool型は、true/falseの2値を扱います。ON/OFFの状態管理に使用します。

用途

  • 地面にいるか(IsGrounded
  • ダメージ中か(IsDamaged
  • ガード中か(IsGuarding
  • 武器を構えているか(IsAiming

複数条件の組み合わせ

複数のBool型パラメータを組み合わせて、複雑な条件を表現できます。

例:

  • IsGrounded = true かつ IsMoving = true → 地上移動アニメーション
  • IsGrounded = false → ジャンプアニメーション
// 地面にいる状態を設定
_animator.SetBool("IsGrounded", true);

// ガード状態を設定
_animator.SetBool("IsGuarding", false);

Trigger型パラメータ

Trigger型は、一度きりのイベントを発火させます。設定後、自動的にリセットされます。

用途

  • ジャンプ(Jump
  • 攻撃(Attack
  • スキル発動(ActivateSkill
  • ダメージを受ける(TakeDamage
  • 死亡(Die

Triggerの自動リセット

Triggerは、Transitionが実行されると自動的に****false****にリセットされます。そのため、繰り返し発火させることができます。

// ジャンプトリガーを発火
_animator.SetTrigger("Jump");

// 攻撃トリガーを発火
_animator.SetTrigger("Attack");

BoolとTriggerの使い分け

特徴BoolTrigger
持続性明示的に変更するまで保持自動でリセット
用途状態の管理一時的なイベント
IsGrounded(地面にいる)Jump(ジャンプする)

Bool を使うべき場合:

  • 状態が継続する(地面にいる、ガード中)
  • 明示的にON/OFFを切り替える必要がある

Trigger を使うべき場合:

  • 一瞬のアクション(ジャンプ、攻撃)
  • ボタンを押した瞬間のイベント

パラメータの命名規則とベストプラクティス

パラメータ名の付け方は、プロジェクトの保守性に大きく影響します。

一貫性のある命名

チーム全体で統一したルールを決めることが重要です。

推奨:

  • プロジェクト全体で同じ命名規則を使う
  • ドキュメントに命名ルールを記載する
  • コードレビューで命名をチェックする

重要なのは、プロジェクト内で統一することです。

スクリプトからの効率的な制御

パラメータをスクリプトから効率的に制御する方法を見ていきます。

ハッシュ値による最適化

パラメータ名を文字列で指定すると、毎回文字列検索が発生し、パフォーマンスが低下します。

Animator.StringToHash()の活用

Animator.StringToHash()を使って、パラメータ名を整数のハッシュ値に変換します。

using UnityEngine;

public class AnimatorController : MonoBehaviour
{
    private Animator _animator;

    // パラメータ名をハッシュ値に変換(readonly fieldで保持)
    private readonly int _speedHash = Animator.StringToHash("Speed");
    private readonly int _isGroundedHash = Animator.StringToHash("IsGrounded");
    private readonly int _jumpHash = Animator.StringToHash("Jump");

    private void Start()
    {
        _animator = GetComponent<Animator>();
    }

    private void Update()
    {
        // ハッシュ値を使用(高速)
        _animator.SetFloat(_speedHash, 5.0f);
        _animator.SetBool(_isGroundedHash, true);
        _animator.SetTrigger(_jumpHash);
    }
}

パフォーマンスへの影響

文字列を使用した場合(遅い):

_animator.SetFloat("Speed", speed); // 毎回文字列検索

ハッシュ値を使用した場合(速い):

_animator.SetFloat(_speedHash, speed); // 整数値で直接アクセス

パフォーマンス差:

  • ハッシュ値は約10倍高速
  • フレーム毎に複数回呼び出す場合は、ハッシュ値が必須

Damping Timeによる滑らかな変化

SetFloat()の第3引数にDamping Timeを指定すると、値が滑らかに変化します。

急激な変化を避ける

パラメータ値が急激に変化すると、アニメーションがカクついて見えます。

Damping Time なし:

_animator.SetFloat(_speedHash, targetSpeed);
// 値が即座に変わる → カクつく

Damping Time あり:

_animator.SetFloat(_speedHash, targetSpeed, 0.1f, Time.deltaTime);
// 0.1秒かけて徐々に変化 → 滑らか

アニメーションの自然な遷移

using UnityEngine;

public class SmoothMovement : MonoBehaviour
{
    [SerializeField] private float _dampingTime = 0.1f;

    private Animator _animator;
    private float _currentSpeed;
    private float _targetSpeed;

    private readonly int _speedHash = Animator.StringToHash("Speed");

    private void Start()
    {
        _animator = GetComponent<Animator>();
    }

    private void Update()
    {
        // 入力に応じてターゲット速度を設定
        _targetSpeed = Input.GetKey(KeyCode.LeftShift) ? 7.0f : 3.0f;

        // Damping Timeで滑らかに変化
        _animator.SetFloat(_speedHash, _targetSpeed, _dampingTime, Time.deltaTime);
    }
}

DampingTimeを指定した場合の値の変化は以下の様になります。

Value1は1で、Value2は5を指定して、10まで値を変動させています。

パラメータの取得

現在のパラメータ値を取得して、状態を確認できます。

float speed = _animator.GetFloat(_speedHash);
bool isGrounded = _animator.GetBool(_isGroundedHash);

実践例:複雑なパラメータ制御

実際のゲームで使用される、複雑なパラメータ制御の例を見ていきます。

例1: コンボシステム

Int型で攻撃段階を管理し、Triggerで次の攻撃を受け付けます。

using UnityEngine;

public class ComboSystem : MonoBehaviour
{
    [SerializeField] private float _comboTimeout = 1.5f;

    private Animator _animator;
    private int _comboCount = 0;
    private float _lastAttackTime;

    private readonly int _comboCountHash = Animator.StringToHash("ComboCount");
    private readonly int _attackHash = Animator.StringToHash("Attack");

    private void Start()
    {
        _animator = GetComponent<Animator>();
    }

    private void Update()
    {
        // 攻撃入力
        if (Input.GetMouseButtonDown(0))
        {
            PerformAttack();
        }

        // タイムアウト処理
        if (Time.time - _lastAttackTime > _comboTimeout)
        {
            ResetCombo();
        }
    }

    private void PerformAttack()
    {
        // コンボカウントを増やす
        _comboCount++;
        _comboCount = Mathf.Clamp(_comboCount, 1, 3); // 最大3コンボ

        // Animatorに設定
        _animator.SetInteger(_comboCountHash, _comboCount);
        _animator.SetTrigger(_attackHash);

        _lastAttackTime = Time.time;

        Debug.Log($"Combo {_comboCount}段目");
    }

    private void ResetCombo()
    {
        if (_comboCount > 0)
        {
            _comboCount = 0;
            _animator.SetInteger(_comboCountHash, 0);
            Debug.Log("Combo reset");
        }
    }
}

Animator Controller側の設定:

  1. Int型パラメータ ComboCount を作成
  2. Trigger型パラメータ Attack を作成
  3. Transitionの条件:
    • Attack Trigger かつ ComboCount = 1 → 1段目攻撃
    • Attack Trigger かつ ComboCount = 2 → 2段目攻撃
    • Attack Trigger かつ ComboCount = 3 → 3段目攻撃

例2: ダメージとリアクション

Triggerでダメージアニメーション、Floatでダメージの強さ、Boolでガード状態を管理します。

using UnityEngine;

public class DamageSystem : MonoBehaviour
{
    [SerializeField] private float _maxHealth = 100f;

    private Animator _animator;
    private float _currentHealth;
    private bool _isGuarding;

    private readonly int _takeDamageHash = Animator.StringToHash("TakeDamage");
    private readonly int _damageStrengthHash = Animator.StringToHash("DamageStrength");
    private readonly int _isGuardingHash = Animator.StringToHash("IsGuarding");
    private readonly int _healthRatioHash = Animator.StringToHash("HealthRatio");

    private void Start()
    {
        _animator = GetComponent<Animator>();
        _currentHealth = _maxHealth;
    }

    private void Update()
    {
        // ガード入力
        _isGuarding = Input.GetKey(KeyCode.LeftControl);
        _animator.SetBool(_isGuardingHash, _isGuarding);
    }

    // ダメージを受ける
    public void TakeDamage(float damage)
    {
        // ガード中はダメージ半減
        if (_isGuarding)
        {
            damage *= 0.5f;
            Debug.Log($"ガード成功!ダメージ: {damage}");
        }

        _currentHealth -= damage;
        _currentHealth = Mathf.Max(_currentHealth, 0);

        // ダメージの強さを正規化(0.0〜1.0)
        float damageStrength = damage / _maxHealth;

        // Animatorに設定
        _animator.SetTrigger(_takeDamageHash);
        _animator.SetFloat(_damageStrengthHash, damageStrength);
        _animator.SetFloat(_healthRatioHash, _currentHealth / _maxHealth);

        Debug.Log($"HP: {_currentHealth}/{_maxHealth}");
    }
}

Animator Controller側の設定:

  1. TriggerTakeDamage - ダメージアニメーションを発火
  2. FloatDamageStrength - ダメージの強さ(0.0〜1.0)
  3. BoolIsGuarding - ガード状態
  4. FloatHealthRatio - 体力の割合

例3: 移動状態の総合管理

複数のパラメータを組み合わせて、移動状態を管理する例:

  • Speed (Float) - 移動速度
  • VelocityX/Z (Float) - 方向
  • IsGrounded (Bool) - 地面判定
  • Jump, Land (Trigger) - ジャンプ/着地イベント

パラメータのデバッグ方法

パラメータが正しく動作しているか確認する方法を見ていきます。

Animator Windowでのリアルタイム確認

ゲーム実行中に、Animatorウィンドウでパラメータの値をリアルタイムで確認できます。

手順:

  1. ゲームを再生モードにする
  2. Animatorウィンドウを開く(Window > Animation > Animator)
  3. Parametersタブを表示

パラメータの現在値が表示され、リアルタイムで変化する様子が見えます。

パラメータ値の手動変更

Animatorウィンドウ上で、パラメータ値を手動で変更できます。これにより、特定の値でのアニメーションをテストできます。

複数のAnimator間でのパラメータ管理

複数のキャラクターやAnimatorがある場合の、効率的なパラメータ管理方法です。

パラメータマネージャーパターン

パラメータ名のハッシュ値を一元管理するクラスを作成します。

using UnityEngine;

/// <summary>
/// Animatorパラメータのハッシュ値を一元管理
/// </summary>
public static class AnimationParameters
{
    // 移動関連
    public static readonly int Speed = Animator.StringToHash("Speed");
    public static readonly int VelocityX = Animator.StringToHash("VelocityX");
    public static readonly int VelocityZ = Animator.StringToHash("VelocityZ");

    // 状態関連
    public static readonly int IsGrounded = Animator.StringToHash("IsGrounded");
    public static readonly int IsDamaged = Animator.StringToHash("IsDamaged");
    public static readonly int IsGuarding = Animator.StringToHash("IsGuarding");

    // アクション関連
    public static readonly int Jump = Animator.StringToHash("Jump");
    public static readonly int Attack = Animator.StringToHash("Attack");
    public static readonly int Land = Animator.StringToHash("Land");

    // 戦闘関連
    public static readonly int ComboCount = Animator.StringToHash("ComboCount");
    public static readonly int AttackType = Animator.StringToHash("AttackType");
    public static readonly int HealthRatio = Animator.StringToHash("HealthRatio");
}

複数キャラクターの統一的な制御

AnimationParametersクラスを使用することで、複数のキャラクターで同じパラメータ名を統一できます。

using UnityEngine;

public class CharacterAnimator : MonoBehaviour
{
    private Animator _animator;

    private void Start()
    {
        _animator = GetComponent<Animator>();
    }

    public void SetSpeed(float speed)
    {
        // 一元管理されたハッシュ値を使用
        _animator.SetFloat(AnimationParameters.Speed, speed);
    }

    public void Jump()
    {
        _animator.SetTrigger(AnimationParameters.Jump);
    }

    public void SetGrounded(bool isGrounded)
    {
        _animator.SetBool(AnimationParameters.IsGrounded, isGrounded);
    }
}

パラメータの最適化とパフォーマンス

パラメータを効率的に使用するための最適化テクニックです。

不要なパラメータの削除

使用していないパラメータは削除しましょう。

確認方法:

  1. Animator Controllerウィンドウで全てのTransitionを確認
  2. 条件で使用されていないパラメータをチェック
  3. スクリプトでも使用されていないことを確認
  4. 削除

更新頻度の最適化

パラメータの更新頻度を最適化することで、パフォーマンスを改善できます。

毎フレーム更新が必要なパラメータ:

  • Speed(移動速度)
  • VelocityX, VelocityZ(方向)

イベント発生時のみ更新:

  • IsGrounded(地面判定の変化時)
  • IsGuarding(ガードの開始/終了時)
  • Trigger系(アクション発生時)
using UnityEngine;

public class OptimizedAnimator : MonoBehaviour
{
    private Animator _animator;
    private bool _isGrounded;
    private bool _previousIsGrounded;

    private readonly int _isGroundedHash = Animator.StringToHash("IsGrounded");

    private void Update()
    {
        _isGrounded = CheckGrounded();

        // 値が変化した時のみ更新
        if (_isGrounded != _previousIsGrounded)
        {
            _animator.SetBool(_isGroundedHash, _isGrounded);
            _previousIsGrounded = _isGrounded;
        }
    }

    private bool CheckGrounded()
    {
        // 地面判定のロジック
        return Physics.Raycast(transform.position, Vector3.down, 1.1f);
    }
}

よくある問題と解決方法

パラメータが反映されない

原因と解決策:

  • Has Exit Timeが設定されている → OFFにする
  • Transitionの条件優先順位 → より具体的な条件を上に配置

Triggerが発火しない

原因と解決策:

  • 同じフレームで複数回呼び出し → 1回だけ呼び出す
  • 条件設定ミス → TransitionConditionsを確認
  • 必要に応じて_animator.ResetTrigger()で明示的にリセット

アニメーションがカクつく

原因と解決策:

  • Damping Time未設定 → SetFloat()の第3引数で指定
  • Transition Durationが短すぎる → 0.20.3程度に設定

まとめ

Animation Parametersは、スクリプトからAnimator Controllerを制御するための重要な仕組みです。

重要なポイント

  • 4つのパラメータ型 - Float, Int, Bool, Triggerを適切に使い分ける
  • ハッシュ値の使用 - Animator.StringToHash()でパフォーマンスを最適化
  • Damping Time - 滑らかな値の変化で自然なアニメーション
  • 命名規則 - 一貫性のある命名でメンテナンス性を向上
  • デバッグ - Animatorウィンドウでリアルタイム確認

効率的な使い方

以下のような場面でパラメータを活用してください:

  • キャラクターの状態に応じたアニメーション切り替え
  • Blend Treeでの滑らかなアニメーション制御
  • コンボシステムや複雑な戦闘システム
  • デバッグとチューニング

Animation Parametersを適切に管理して、動的で魅力的なキャラクターアニメーションを実現しましょう!

📣おしらせ!

Unity Asset Storeで

世界を揺るがすフラッシュセール

が開催中です。

最高のワールド制作に必要なすべてが、24時間限定で70% OFF!

フラッシュセール

50%オフ

🔗関連ページ