キャラクターが歩いて走って跳べるようになると、次は攻撃を入れたくなります。ところが、State Machineに Attack 状態を足すと途端に扱いにくくなります。攻撃が終わったことをどう検知するか、移動中に割り込ませるとどうなるか、コンボはどう組むか。遷移の線が増えるほど、絵として読めなくなっていきます。
UEには、こうし た 1回きりの動作 を担当する別の仕組みがあります。 Animation Montage です。この記事では、State Machineとの役割分担、Montageが再生されない原因になりやすいSlotノード、そして攻撃判定のタイミングを打つAnim Notifyまでを解説します。
この記事でわかること
- 繰り返す状態はState Machine、単発の割り込みはMontage
- Montageが映らない原因No.1は Slotノードの挿し忘れ
Play Montageの出力ピンで 終了・中断・通知 を受け取る- Anim Notify で「攻撃判定が出る瞬間」を打つ
- 実践: 振りかぶり中は当たらず、振り下ろしの区間だけ当たる斬撃
State MachineとMontageの役割分担
どちらもアニメーションを再生する仕組みですが、向いている対象がはっきり分かれています。

| State Machine | Animation Montage | |
|---|---|---|
| 担当 | 続いている状態 | 1回きりの動作 |
| 例 | 待機、歩行、走行、落下 | 攻撃、被弾、回避、扉を開ける |
| 終わり方 | 条件が変わるまで続く | 再生し終わったら勝手に戻る |
| きっかけ | 変数の変化(bIsInAir など) | Blueprintから明示的に再生 |
| 書く場所 | Anim Graph(アセット側) | ゲーム側のBlueprint |
判断の基準は 「終わりが自分で決まるか」 です。走行には終わりがあり ません。スティックを離すまで続きます。一方、剣を振る動作は1.0秒で必ず終わります。 終わりを持つ動作はMontage と考えてください。
State Machineに攻撃を足すと、「攻撃アニメが終わったかどうか」を毎フレーム調べて、遷移条件に書くことになります。Montageなら、その判定は仕組みの側が持っています。
移動アニメの土台そのものはState MachineとBlend Spaceの記事で扱っています。この記事は、そこへ攻撃を割り込ませる続きにあたります。
Montageを作る
作り方は2通りありますが、既にアニメーションアセットがあるなら1つ目が早いです。
方法1:AnimSequenceから作る。 コンテンツブラウザで攻撃のAnimation Sequenceを右クリックし、 Create > Create AnimMontage を選びます。同じ内容を持つMontageが1本できます。
方法2:空から作る。 右クリック > Animation > Animation Montage を選び、スケルトンを指定します。開いたら、下部のMontageトラックへAnimation Sequenceをドラッグして並べます。
Montageエディタを開くと、下部にトラックが縦に並んでいます。最初に押さえるのは3つです。
| トラック | 中身 |
|---|---|
| Montage | 実際に並んだアニメーション。複数つなげられる |
| Sections | 区間の名前。既定で Default が1つある |
| Notifies | 途中で飛ばす通知の置き場。この記事の主役 |
詳細パネルの Blend In と Blend Out は、再生の入りと抜けの滑らかさです。既定の0.25秒前後で自然に見えますが、素早い攻撃なら0.1秒程度まで詰めると、反応が良く感じられます。
Slotノードを挿す
ここが、Montageで最初にして最大のつまずきです。
Montageを再生しても、Animation Blueprint側に受け皿がなければ何も起きません。 Montageは自分で画面に出るのではなく、 Anim Graphの決められた場所にポーズを差し込む 仕組みだからです。その場所が Slot です。

Animation Blueprintを開き、Anim Graphで次のようにつなぎます。
Locomotion(State Machine)
→ Slot 'DefaultSlot' ← 右クリックして「Slot」で検索
→ Output Pose
既定のスロット名は DefaultSlot で、Montage側も既定でここを使います。何も設定を変えていなければ、この1ノードを挿すだけでつながります。
挿さっていないときの症状は独特です。 Montageは再生されており、Play Montage の On Completed も正しく呼ばれるのに、キャラクターだけが歩き続けます。 ログを出すと動いているように見えるので、原因にたどり着きにくいのが厄介なところです。
Slotが増えたら: 「走りながら上半身だけ攻撃する」のように部位を分けたくなったら、
UpperBodyのようなSlotを追加し、Layered blend per boneと組み合わせます。Slotの追加と管理は Window > Anim Slot Manager から行い、Montage側の詳細パネルで使うSlotを指定します。
Play Montageで再生する
再生ノードは複数あり、名前が似ているので混同しやすい部分です。
| ノード | Target | 特徴 |
|---|---|---|
| Play Montage | Skeletal Mesh Component | 終了・中断・通知を 出力ピンで受け取れる 。Blueprint向き |
| Play Anim Montage | Character | 手軽。戻り値は再生時間(秒)だけ |
| Montage Play | Anim Instance | 低レベル。戻り値は再生時間だけ |
Blueprintで組むなら Play Montage を選んでください。 「攻撃が終わったら次の処理へ」を、追加の判定なしに書けます。

出力ピンは5つあります。
| ピン | 出るタイミング | 使いどころ |
|---|---|---|
| On Completed | 最後まで再生し終わったとき | 攻撃状態の解除、次の入力を受け付ける |
| On Blend Out | 抜けのブレンドが始まったとき | On Completed より少し早い後処理 |
| On Interrupted | 別のMontageに割り込まれたとき | コンボの途中打ち切り、被弾で中断 |
| On Notify Begin | Montage Notifyが来たとき | 当たり判定ON、エフェクト、効果音 |
| On Notify End | Montage Notify Windowが終わるとき | 当たり判定OFF |
On Notify Begin と On Notify End には Notify Name の出力があります。通知を複数打つ場合は、この名前を Switch on Name で振り分けます。
重要な制限:
On Notify Begin/On Notify Endが反応するのはMontage NotifyとMontage Notify Windowだけです。通常のAnim Notifyを打っても、このピンは沈黙します。理由は次の節で扱います。
Anim Notifyでタイミングを打つ
Anim Notify は、アニメーションの特定のフレームに置く印です。再生がその位置を通過した瞬間に、イベントが飛びます。

「攻撃の何フレーム目から当たり判定を出すか」は、この印で決めます。Notifiesトラックの置きたい位置で右クリックし、Add Notify から種類を選びます。
種類は大きく2系統あります。
| 種類 | 形 | 受け取り方 |
|---|---|---|
| Montage Notify | 瞬間(点) | Play Montage の On Notify Begin |
| Montage Notify Window | 区間(幅を持つ) | On Notify Begin と On Notify End |
| New Notify(通常) | 瞬間(点) | Animation Blueprintの AnimNotify_名前 イベント |
| Anim Notify State(自作) | 区間 | 自作クラスの Notify Begin / Notify Tick / Notify End |
上2つは Montage専用 で、再生元のBlueprintへ直接返ってきます。攻撃判定のように Montageを再生した本人が受け取りたい ものは、こちらが手軽です。
下2つはアニメーション自体に紐づく通知です。足音やエフェクトのように 誰が再生しても同じことが起きてほしい ものに向いています。この場合はAnimation BlueprintのEvent Graphで右クリックし、AnimNotify_Footstep のような名前のイベントを追加して受けます(イベント名は AnimNotify_ に通知名をつなげた形で自動的に用意されます)。
区間で扱うか、点2つで扱うか。 当たり判定は「ONにしてOFFにする」なので、どちらでも書けます。Montage Notify Window を1つ置くほうが、開始と終了がずれる心配がなく確実です。一方、点を2つ置く形は、判定のONとOFFのタイミングを後から個別に動かしやすいという利点があります。
自作の Anim Notify State を作る場合は、コンテンツブラウザで右クリック > Blueprint Class から親クラスに AnimNotifyState を選び、Received Notify Begin と Received Notify End をオーバーライドします。「どのアニメーションでも、置くだけで無敵時間が付く」といった再利用は、この形にすると効きます。
Sectionでコンボへつなげる
Section は、Montageを区間に区切って名前を付ける機能です。1本のMontageに3連撃を並べ、Attack1 Attack2 Attack3 と名付 けておくイメージです。

Sectionsトラックで右クリックして追加し、詳細パネルの Section順序 で、どの区間の次にどこへ進むかを設定します。ここを未設定(None)にしておくと、その区間が終わった時点でMontageが終了します。
コンボの基本形はこうです。
- Section順序を全て
Noneにして、 区間ごとに止まる ようにする Attack1を再生する- 受付時間内にもう一度攻撃が押されたら、
Montage Set Next Section(Anim Instance)でAttack1の次をAttack2に指定する - 押されなければ、
Attack1が終わってMontageも終わる
Montage Jump to Section は その場で即座に飛ぶ ノードなので、コンボには向きません。区切りの良いところまで再生してから移りたいので、Montage Set Next Section を使います。
「受付時間内かどうか」は、Notifyで作ります。ComboWindowStart と ComboWindowEnd を打ち、その間だけ入力を受け付ける変数を立てておく形です。この記事の実践で作る当たり判定と、まったく同じ構造になります。
実践:振り下ろしの区間だけ当たる斬撃
ベルトスクロールアクションの殴り、見下ろし型ARPGの剣、2Dアクションの近接攻撃。 「振りかぶり中は当たらず、振り下ろしの瞬間だけ当たる」 は、ジャンルを問わず攻撃の手触りを決める部分です。ここでは、その最小構成を組みます。
完成形
攻撃ボタンを押すと剣を振ります。振りかぶっている間に敵へ触れてもダメージは入らず、振り下ろしの区間に入った瞬間だけ当たります。同じ振りで同じ敵に2回ダメージが入ることもありません。

再現条件
Third Person テンプレート で新規プロジェクトを作り、次を用意します。攻撃アニメーションは、マーケットプレイスの無料アセットやMixamoのものを取り込んでください。
| 種類 | 名前 | 設定 |
|---|---|---|
| Animation Montage | AM_Attack | 攻撃アニメーションから作成。全長 約1.0秒 |
AM_Attack のNotify | HitStart(Montage Notify) | 位置 0.20秒 (振り下ろしが始まる瞬間) |
AM_Attack のNotify | HitEnd(Montage Notify) | 位置 0.45秒 (振り切った瞬間) |
| Animation Blueprint | ABP_Player | Anim Graphに Slot 'DefaultSlot' を挿してある |
| Input Action | IA_Attack | Digital (Bool)。IMC_Default で 左マウスボタン に割り当て |
BP_ThirdPersonCharacter のコンポーネント | WeaponCollision(Box Collision) | 剣の位置に配置。Collision Presets を OverlapAllDynamic 、 Collision Enabled を No Collision |
BP_ThirdPersonCharacter の変数 | HitActors(Actor の 配列) | 初期値 空 |
BP_ThirdPersonCharacter の変数 | bIsAttacking(Boolean) | 初期値 false |
WeaponCollision は、剣を持たせているならソケットへアタッチします。持っていない場合は、キャラクターの前方80cmあたりに置けば動作確認には十分です。
Collision Enabled を 最初から No Collision にしておくのが要点です。 既定のままだと、立っているだけで敵に当たり続けます。
チャンネルを分 けて厳密に扱いたい場合はコリジョンチャンネルの記事を参照してください。ここでは既存プリセットのまま進めます。
ステップ1:攻撃を再生する
BP_ThirdPersonCharacter のイベントグラフに組みます。

Enhanced Input Action IA_Attack
Started
→ Branch(Condition: bIsAttacking)
True → (何もしない。連打を無視する)
False
→ Set bIsAttacking(true)
→ Clear(Target: HitActors) ← 前回の記録を消す
→ Play Montage
In Skeletal Mesh Component : Mesh
Montage to Play : AM_Attack
bIsAttacking で弾いておかないと、連打のたびにMontageが最初から再生され、HitEnd が来る前に次の HitStart が入って判定が出っぱなしになります。
ステップ2:Notifyを受けて判定を切り替える
Play Montage の出力ピンから続けます。
Play Montage
On Notify Begin(Notify Name)
→ Switch on Name(Target: Notify Name)
HitStart → Set Collision Enabled(WeaponCollision, Query Only)
HitEnd → Set Collision Enabled(WeaponCollision, No Collision)
On Completed → Set bIsAttacking(false)
On Interrupted → Set bIsAttacking(false)
→ Set Collision Enabled(WeaponCollision, No Collision)
On Interrupted でも判定を切ることが大事です。 被弾などで攻撃が中断されると HitEnd は来ません。 ここを書き忘れると、以降ずっと当たり判定が出たままになります。
ステップ3:当たったときの処理
WeaponCollision を選び、詳細パネルから On Component Begin Overlap を追加します。
On Component Begin Overlap(WeaponCollision)
Other Actor
→ Branch(Condition: Other Actor == Self を Not) ← 自分を除外
→ Contains(Array: HitActors, Item: Other Actor)
→ Branch(Condition: Contains の結果を Not)
True
→ Add(Array: HitActors, Item: Other Actor)
→ Apply Damage(Damaged Actor: Other Actor, Base Damage: 20.0)
HitActors に記録してから確認する形にすると、 同じ振りで同じ敵に2回入ることがなくなります 。オーバーラップは、判定が有効な間に相手が動くたび発生しうるためです。ダメージを受けた側の処理はHPとダメージの記事にまとめています。
確認する
敵役として、Apply Damage を受けて Print String を出すだけのActorを1体置いてPlayしてください。
敵に密着して攻撃ボタンを押し、振りかぶっている間は何も出ず、剣が振り下ろされた瞬間に1回だけログが出れば成功です。 1回の攻撃でログが1行だけ、というのが答え合わせになります。
次に、AM_Attack の HitStart を 0.20秒から0.00秒へ動かし て ください。今度は振りかぶった瞬間から当たります。 Notifyの位置が、そのまま攻撃の手触りになる ことが体感できます。
うまくいかないときの切り分けです。
- 剣を振るモーションが出ない → Anim Graphに
Slot 'DefaultSlot'が挿さっていない - モーションは出るがログが出ない →
WeaponCollisionの位置が敵に届いていない、またはGenerate Overlap Eventsがオフ On Notify Beginが呼ばれない → Notifyの種類がMontage Notifyではなく通常のNotifyになっている- 1回の攻撃でログが何行も出る →
HitActorsの確認が抜けている - 攻撃していないのに当たる →
Collision Enabledの初期値がNo Collisionになっていない - 一度攻撃すると当たりっぱなし →
HitEndが打たれていないか、On Interruptedの処理が抜けている - 連打すると判定が残る →
bIsAttackingによる多重再生の防止が入っていない
ポイントは2つです。
- 判定の出し入れは、アニメーション側が持つ: 「0.2秒後に判定を出す」とタイマーで書くと、アニメーションを差し替えた瞬間にずれます。Notifyならアセット側に印が残るので、モーションを変えても位置を動かすだけで済みます
- 切るほうの経路を先に用意する:
On Interruptedと、開始時のClearです。攻撃の不具合は「出ない」より「消えない」で起きます。ONを書いたら、その場でOFFの経路を全て埋め てください
3連撃へ広げるなら、この構造のまま Montage Set Next Section を足します。ヒット時の手触りをさらに詰めるなら、Notifyの位置に効果音とカメラの揺れを足すところからが分かりやすいです(ヒットストップ・画面シェイク・ノックバックのまとめは 「当たった感じ」を作る記事 にあります)。
おまけ:先に知っておくと良いこと
- Root Motionを使うかどうかは先に決める: 踏み込みながら斬る動作は、アニメーション側に移動量を持たせる(Root Motion)ほうが自然です。使うにはAnimation Sequenceの
Enable Root Motionをオンにし、Animation BlueprintのRoot Motion ModeをRoot Motion from Montages Onlyにします。使わない場合は、Character Movementの記事の要領でBlueprint側から移動させます - Montageの再生中に移動を止めたいなら: 攻撃中に歩けてしまうのが気になるときは、
bIsAttackingを移動処理の手前に置いて弾くか、Set Movement Modeで一時的に止めます。State Machineに攻撃状態を作る必要はありません - Notifyの位置はスローで確認する: Montageエディタのタイムラインをドラッグして、判定を出したいフレームを目で探してください。再生速度を落として見ると、振り下ろしの開始位置が正確に取れます
- AnimNotify_のイベントはAnimation Blueprint側に出る: 通常のNotifyをキャラクターBlueprintで受けようとしても出てきません。Animation Blueprint側で受けて、そこからキャラクターへ渡す形になります。受け取り先を1箇所にまとめたいなら、Event Dispatcherの記事の方法が使えます
- 同じSlotのMontageは同時に鳴らない: 攻撃中に被弾のMontageを再生すると、攻撃側は
On Interruptedで止まります。これは仕様どおりの挙動で、上書きされたくない場合はSlotを分けます - 動いているか分からないときはログを1つ:
On Notify BeginにPrint Stringを挿し、Notify Nameを繋いでください。名前が流れていればMontage側は正常で、問題はコリジョン側です(→ Print Stringで値を確認する)
まとめ
Montageは、State Machineが苦手な部分をちょうど埋める道具です。
| やりたいこと | 使うもの |
|---|---|
| 続く動作を切り替える | State Machine |
| 単発の動作を割り込ませる | Animation Montage |
| Montageを画面に出す | Anim Graphの Slot 'DefaultSlot' |
| 終了・中断を受け取る | Play Montage の出力ピン |
| 途中のタイミングを取る | Anim Notify |
| 区間を区切ってコンボにする | Montage Section |
そして、つまずいたときに真っ先に見る場所は決まっています。 映らないならSlot、タイミングが取れないならNotifyの種類 です。この2つで、Montageの不具合のほとんどは説明がつきます。
あなたの攻撃モーションは、何秒目から当たるのが気持ちいいでしょうか。まずはNotifyを1つ打って、動かしながら探してみてください。