Unity Animation について
Unity Animation は、Unity 開発者向けのアニメーション実装ガイドです。Animator とのコード連携、IK、Root Motion、Timeline、Playables API を扱い、ゲームロジックとアニメーションの同期パターンを紹介します。
主な機能
- 01コードと Animator Controller の連携
- 02Animation Events によるロジック同期
- 03Animator Layers と Blend Trees の設定
- 04IK と Root Motion の活用
- 05Timeline と Playables API の利用
活用シーン
- 01キャラクターの移動状態を Blend Tree に連携
- 02アニメーションのキーフレームで攻撃や足音の処理を実行
- 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)
クイックスタート
- 用途に適したアニメーションシステムを選びます(判断ツリーを参照)
- Animator Controller を設定します(ステート、遷移、パラメーター)
- コードと連携します(ハッシュのキャッシュ、パラメーター、イベント)
- 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() を呼び出します |
コメント
Markdown 対応