mcpField
U
Unity Animation

Unity Animation

github.com/juliankerignard開発852 回インストール31 週間前に更新
リポジトリ

Unity Animation について

Unity Animation は、Unity 開発者向けのアニメーション実装ガイドです。Animator とのコード連携、IK、Root Motion、Timeline、Playables API を扱い、ゲームロジックとアニメーションの同期パターンを紹介します。

主な機能

  1. 01コードと Animator Controller の連携
  2. 02Animation Events によるロジック同期
  3. 03Animator Layers と Blend Trees の設定
  4. 04IK と Root Motion の活用
  5. 05Timeline と Playables API の利用

活用シーン

  1. 01キャラクターの移動状態を Blend Tree に連携
  2. 02アニメーションのキーフレームで攻撃や足音の処理を実行
  3. 03IK、Root Motion、部分的な身体アニメーションの設定

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/juliankerignard/unity-skills --skill unity-animation

インストール後、Claude Code で/unity-animationを入力して読み込まれたか確認します。

同梱ファイルreferences/animation-advanced.md

詳細

Unity Animation

このスキルでできること

Unity で高度なアニメーションを実装する方法を説明します。コードと Animator の連携、IK、Root Motion、Animation Rigging、Timeline、Playables API、高度なブレンドツリーを扱います。

このスキルでは、Animator Controller の基本的な設定にとどまらず、コードからアニメーションを制御し、ゲームプレイのロジックとキーフレームを同期させ、IK、Playables API、Timeline などの高度なシステムを活用するための、本番環境向けのコードパターンを紹介します。

前提条件

  • Animator Controller の基本的なステートと遷移を設定済み
  • Animation clips をインポート済み(状況に応じて Humanoid または Generic リグ)
  • (任意) IK 用の Animation Rigging パッケージ(com.unity.animation.rigging)
  • (任意) カットシーン用の Timeline パッケージ(com.unity.timeline)

クイックスタート

  1. 用途に適したアニメーションシステムを選びます(判断ツリーを参照)
  2. Animator Controller を設定します(ステート、遷移、パラメーター)
  3. コードと連携します(ハッシュのキャッシュ、パラメーター、イベント)
  4. IK、高度なブレンディング、レイヤーで調整します

判断ツリー

Quel systeme d'animation ?
|
+-- Animation simple (porte, plateforme, UI) ?
|   --> Animation component simple (legacy) ou Animator avec 1-2 states
|
+-- Personnage joueur ou ennemi avec etats (idle, run, attack) ?
|   --> Animator Controller + State Machine + code integration
|
+-- Animation cinematique / cutscene ?
|   --> Timeline (PlayableDirector + tracks)
|
+-- Melange dynamique d'animations a runtime ?
|   --> Playables API (mixer custom)
|
+-- IK (personnage regarde/attrape un objet) ?
|   --> Animation Rigging package (Rig Builder + constraints)
|
+-- Besoin de performance extreme (milliers d'entites) ?
    --> DOTS Animation (voir /unity-dots)

ステップバイステップガイド

ステップ 1:Animator の設定とコード連携
[RequireComponent(typeof(Animator))]
public class CharacterAnimator : MonoBehaviour
{
    private Animator animator;

    // TOUJOURS cacher les hash (evite les string lookups chaque frame)
    private static readonly int SpeedHash = Animator.StringToHash("Speed");
    private static readonly int IsGroundedHash = Animator.StringToHash("IsGrounded");
    private static readonly int JumpTrigger = Animator.StringToHash("Jump");
    private static readonly int AttackTrigger = Animator.StringToHash("Attack");

    private void Awake() => animator = GetComponent<Animator>();

    public void SetSpeed(float speed) => animator.SetFloat(SpeedHash, speed);
    public void SetGrounded(bool grounded) => animator.SetBool(IsGroundedHash, grounded);
    public void TriggerJump() => animator.SetTrigger(JumpTrigger);
    public void TriggerAttack() => animator.SetTrigger(AttackTrigger);
}
ステップ 2:Animation Events
// Appele depuis un clip d'animation a un keyframe precis
public void OnFootstep()
{
    audioService.PlaySFX(footstepClip);
}

public void OnAttackHit()
{
    // Activer hitbox au bon moment de l'animation
    hitbox.SetActive(true);
}

public void OnAttackEnd()
{
    hitbox.SetActive(false);
}
ステップ 3:StateMachineBehaviour(ステートに関連付けられたロジック)
public class AttackState : StateMachineBehaviour
{
    public override void OnStateEnter(
        Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        animator.GetComponent<CombatSystem>().OnAttackStart();
    }

    public override void OnStateExit(
        Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        animator.GetComponent<CombatSystem>().OnAttackEnd();
    }
}
ステップ 4:Animator Layers(部分アニメーション)
// Controle dynamique du poids d'un layer (ex: upper body attack)
private static readonly int UpperBodyLayer = 1;

public void EnableUpperBodyOverride(float weight)
{
    animator.SetLayerWeight(UpperBodyLayer, weight);
}
  • Layer 0:ベース(全身の移動)
  • Layer 1:上半身のオーバーライド(攻撃、インタラクション)、Avatar Mask を使用
  • Layer 2:加算(呼吸、被弾リアクション)
ステップ 5:移動用のブレンドツリー

Animator Controller で次のように設定します。

  • 2D Freeform Directional のブレンドツリーを作成します
  • パラメーター:MoveX(float)、MoveY(float)
  • モーション:idle(0,0)、walk forward(0,0.5)、run forward(0,1)、strafe left(-1,0)、strafe right(1,0)
private static readonly int MoveXHash = Animator.StringToHash("MoveX");
private static readonly int MoveYHash = Animator.StringToHash("MoveY");

public void SetMovement(Vector2 input)
{
    // Smooth damp pour eviter les changements brusques
    animator.SetFloat(MoveXHash, input.x, 0.1f, Time.deltaTime);
    animator.SetFloat(MoveYHash, input.y, 0.1f, Time.deltaTime);
}

厳守事項

必ず行うこと:

  • Animator.StringToHash でハッシュをキャッシュします(Update 内で文字列を使わないでください)
  • ロジックとアニメーションの同期には Animation Events を使います(手動タイマーは使わないでください)
  • 部分アニメーションには Animator Layers を使います(上半身の攻撃と下半身の走行など)
  • ブレンドツリーで滑らかに遷移するよう、SetFloat にダンピングを指定します
  • メモリリークを防ぐため、OnDestroy() で PlayableGraph を破棄します

決して行わないこと:

  • Update 内で GetComponent<Animator>() を呼び出すこと。Awake で参照をキャッシュしてください
  • 純粋なロジック用のステートマシンを除き、transition duration = 0 にすること(見た目が急に切り替わる原因になります)
  • Root Motion が有効なときに transform.position を手動で変更すること
  • 理由なく Play() や CrossFade() を使うこと。Animator Controller の遷移を優先してください

優先すること:

  • 方向移動には 2D Freeform のブレンドツリーを使います
  • 複雑な Animator Controller の整理には Sub-State Machines を使います
  • 異なるクリップで同じステートマシンを再利用するには Override Controllers を使います
  • 新しいプロジェクトでは OnAnimatorIK() より Animation Rigging を使います

関連スキル

  • /unity-code-gen -- StateMachineBehaviour と Animator のボイラープレートを生成します
  • /proto -- シンプルなアニメーションで素早くプロトタイプを作成します
  • /unity-dots -- 数千のエンティティをアニメーションさせる DOTS animation
  • /2d -- Sprite Library と Sprite Swap を使った 2D アニメーション

トラブルシューティング

問題解決策
アニメーションが再生されないステートに到達できること(遷移が接続されていること)と、パラメーターが正しく設定されていることを確認します
キャラクターが滑る/浮くRoot Motion の設定が正しくありません。Animator の「Apply Root Motion」とクリップのカーブを確認します
Blend Tree がカクつくクリップの歩行周期が一致していることを確認します。しきい値を調整します
IK が機能しないAnimator Controller でレイヤーの「IK Pass」が有効になっていることを確認します
Animation Event が呼び出されないメソッドは public で、Animator と同じ GameObject 上にあり、シグネチャが正しい必要があります
遷移がブロックされる遷移条件を確認します。即時遷移を行う場合は「Has Exit Time」を無効にします
レイヤーのオーバーライドが機能しないレイヤーの Avatar Mask と、weight が 0 より大きいことを確認します
PlayableGraph のリークOnDestroy() で必ず graph.Destroy() を呼び出します

コメント