Animatorの基礎 と 3Dキャラの実践 で、モーションは再生できるようになりました。でも次の要求で、急に手が止まります。「 剣を振り下ろした瞬間 にだけダメージを出したい」「攻撃の 踏み込みの移動 をアニメ通りにしたい」「はしごや壁に 手をぴたりと合わせたい 」——再生はできても、 アニメとゲーム世界が同期していない のです。
この同期問題を解くのが、今回の3つの道具です。 Animation Event(タイミングの同期)、 Root Motion(移動の同期)、 IK(接触の同期)。それぞれの使いどころと落とし穴を押さえて、最後は「踏み込み斬り」を完成させます。
この記事でわかること
- 3つの道具の役割分担( タイミング・移動・接触 )
- Animation Event でモーションの特定フレームにコードを呼ぶ
- Root Motion をオンにする場面・オフにする場面・
OnAnimatorMoveの折衷- IK で手を対象へ吸着させる(
OnAnimatorIK)- 実践:Root Motion+Animation Eventで 踏み込み斬り を組む
動作確認環境: Unity 2022.3 LTS / Unity 6・Humanoidリグ
3つの道具の役割分担
3つとも「アニメーションとゲーム世界のズレを埋める」道具ですが、埋めるズレの種類が違います。

| 道具 | 同期させるもの | 代表的な用途 |
|---|---|---|
| Animation Event | タイミング(この瞬間に処理を呼ぶ) | 攻撃判定の窓・足音・エフェクト |
| Root Motion | 移動(アニメの移動量=キャラの移動量) | 踏み込み・回避ロール・演出 |
| IK | 接触(手足の位置=世界の対象物) | 壁に手をつく・レバーを掴む・足の接地 |
「どれを使うべきか」で迷ったら、 何がズレているのか を言葉にしてください。タイミングがズレているならEvent、移動距離がズレているならRoot Motion、手足の位置がズレているならIK——それだけで道具は決まります。
Animation Event:モーションの瞬間にコードを呼ぶ
「振り下ろしの瞬間」をコードのタイマーで合わせようとすると、WaitForSeconds(0.37f) のようなマジックナンバーが生まれ、モーションを差し替えるたびに壊れます。正解は逆で、 モーション側に「この瞬間」の目印を打ち、そこからコードを呼びます。それがAnimation Eventです。

打ち方は、対象のアニメーションクリップを選んで Animationウィンドウ(またはモデルのImport SettingsのAnimationタブ > Events)を開き、狙いのフレームで イベント追加ボタン を押して、呼びたい 関数名 を指定するだけです。受け側はこうなります。
// AttackEventReceiver.cs — Animatorと同じGameObjectに付ける
using UnityEngine;
public class AttackEventReceiver : MonoBehaviour
{
[SerializeField] private SwordHitbox hitbox;
[SerializeField] private AudioSource footstepSource;
// 振り下ろし開始のフレームから呼ばれる
public void OpenHitWindow()
{
hitbox.Swing();
}
// 歩きモーションの着地フレームから呼ばれる(footstepイベント)
public void PlayFootstep()
{
footstepSource.Play();
}
}
ここに落とし穴が2つあります。 呼び出し先はAnimatorと同じGameObject上のpublicメソッド に限られること。そして 関数名のタイプミスはエラーにならない こと——Consoleに警告が出るだけで、静かに無反応になります。「イベントが呼ばれない」ときは、まずこの2点です。
SwordHitbox に見覚えがあるでしょうか。ダメージ処理の記事 で作った「判定窓」を、コルーチンの固定秒数ではなく モーションの実フレーム で開閉できるようになった——これがAnimation Eventの実戦価値です。
Root Motion:移動をアニメに任せる
歩きモーションには本来「前に進む」movementが焼き込まれています。 Root Motion はこの移動量をそのままキャラクターの位置に反映する仕組みで、AnimatorコンポーネントのApply Root Motionで切り替えます。

使い分けの感覚はこうです。
- オンが向く: 攻撃の踏み込み、回避ロール、フィニッシュ演出——「 この移動はアニメーターが設計した距離で動いてほしい 」場面。見た目と移動が絶対にズレません
- オフが向く: 通常の走り回り——「 入力に機敏に反応する操作感 」が欲しい場面。CharacterController や Rigidbody で速度を直接制御する方が、ゲームらしいキビキビ感が出ます
そして実戦でいちばん使うのが折衷案です。 OnAnimatorMove() を書くと、Root Motionの移動量を「受け取ってから、自分で適用」できます。
// RootMotionReceiver.cs — Animatorと同じGameObjectに付ける
using UnityEngine;
[RequireComponent(typeof(CharacterController))]
public class RootMotionReceiver : MonoBehaviour
{
private Animator animator;
private CharacterController controller;
void Awake()
{
animator = GetComponent<Animator>();
controller = GetComponent<CharacterController>();
}
// これを書くと、Root Motionの自動適用の代わりにここが呼ばれる
void OnAnimatorMove()
{
// アニメ由来の移動量を受け取る
Vector3 delta = animator.deltaPosition;
// 高さはアニメに任せず、重力は自前の仕組みで管理する
delta.y = 0f;
controller.Move(delta);
transform.rotation *= animator.deltaRotation;
}
}
「水平移動はアニメの踏み込み通り、重力と接地は自前」——Root Motionの説得力とコード制御の安定を両取りする、定番の書き方です。
IK:手足を世界に合わせる
アニメーションクリップは「収録したときの世界」で作られています。実際のゲームでは壁の位置もレバーの高さも毎回違う——だから「手を伸ばすモーション」を再生しても、手は対象から数センチ浮きます。この最後の数センチを埋めるのが IK(Inverse Kinematics) です。ゴール(手の目標位置)を指定すると、肘や肩の角度をUnityが逆算して、手をぴたりと合わせます。

準備は2つ。モデルが Humanoidリグ であること、Animator Controllerの対象レイヤー設定(歯車アイコン)で IK Pass にチェックを入れることです。すると OnAnimatorIK() が呼ばれるようになります。
// HandIK.cs — Animatorと同じGameObjectに付ける
using UnityEngine;
public class HandIK : MonoBehaviour
{
[SerializeField] private Transform target; // 触れたい対象(壁のポイントなど)
[SerializeField, Range(0f, 1f)] private float weight = 1f;
private Animator animator;
void Awake()
{
animator = GetComponent<Animator>();
}
// IK Passが有効なとき、毎フレーム呼ばれる
void OnAnimatorIK(int layerIndex)
{
if (target == null) return;
// 右手のゴールを対象へ。weightが0なら元のアニメのまま、1なら完全に吸着
animator.SetIKPositionWeight(AvatarIKGoal.RightHand, weight);
animator.SetIKPosition(AvatarIKGoal.RightHand, target.position);
}
}
コツは weightを瞬間的に1にしない ことです。0→1へ短時間で補間すると「自然に手が吸い付く」動きになり、対象から離れるときは1→0へ戻します。ドアノブ、レバー、壁への手つき——「世界に触れる」動きの説得力が一段変わります。
実践:踏み込み斬りを組む
3つの道具のうち2つ——Root MotionとAnimation Event——を組み合わせて、アクションゲームの基本形 「踏み込み斬り」 を完成させます。前へグッと踏み込みながら振り下ろし、刃が走る瞬間だけ判定が開く。ソウルライクの強攻撃、無双系のチャージ斬り、アクションRPGの通常コンボ——全部この骨格です。
