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で切り替えます。
