【Unreal Engine】UE5で「当たった感じ」を作る:ヒットストップ・画面シェイク・ノックバック

作成: 2026-07-20

攻撃が当たった気がしない問題を、演出の重ね掛けで解決。ヒットストップのGlobalとCustom Time Dilationの違い(タイマーの巻き添えまで)、Camera ShakeとStart Camera Shake、Launch Characterによるノックバックを図解し、光・音・数字は専用記事へ委譲して組み合わせと配分に集中する。

敵に攻撃を当てて、ダメージも入る。HPも減る。それなのに、なぜか「当たった気がしない」。数字は動いているのに手応えが軽い、という段階でつまずきます。

原因は1つの機能の不足ではありません。「当たった感じ」は、一瞬止める・画面を揺らす・相手を飛ばす・光らせる・音を鳴らすといった小さな演出を、同じ瞬間に重ねることで生まれます。この記事では、その中核になるヒットストップ・画面シェイク・ノックバックの作り方と、残りの演出を専用記事へ振り分けながら、重ね方と配分に集中して解説します。

攻撃が当たった一瞬に、停止・揺れ・ノックバック・光・音が同時に重なるイメージ

この記事でわかること

  • 手触りは 1つの機能でなく、複数の演出の重ね掛け で生まれる
  • ヒットストップの要、 Global Time Dilation と Custom Time Dilation の違い
  • 画面シェイク(Camera Shake)と ノックバック(Launch Character)
  • 光・音・エフェクト・数字は 専用記事へ委譲 して組み合わせに集中する
  • 実践: 当たった瞬間に「止める+揺らす+飛ばす」を重ねる

Sponsored

「当たった感じ」は演出の合成

まず前提を押さえます。手触りの良い攻撃は、 たった1つの機能で作られているわけではありません 。当たった瞬間に、いくつもの小さな演出が同時に起こっています。

攻撃が当たった1つの瞬間から、停止・揺れ・ノックバック・フラッシュ・エフェクト・音・数字の層が縦に重なる分解図

代表的なのは次の演出です。

演出役割この記事での扱い
ヒットストップ一瞬止めて食い込みを出す本記事で作る
画面シェイク衝撃でカメラを揺らす本記事で作る
ノックバック相手を後ろへ弾く本記事で作る
被弾フラッシュ相手を一瞬光らせる専用記事へ委譲
ヒットエフェクト火花・斬撃線を出す専用記事へ委譲
効果音打撃音を鳴らす専用記事へ委譲
ダメージ数字数値を飛び出させる専用記事へ委譲

大事なのは、これらを 同じ瞬間に、適量ずつ重ねる ことです。1つだけでは物足りず、全部を最大にすると画面が破綻します。そこで本記事では、中核の3つ(止める・揺らす・飛ばす)を自分で作り、残りは既存記事の道具を組み合わせる形にします。

なお、この記事は攻撃が当たったことを検知できている前提で進めます。ダメージを当てて相手のHPを減らす仕組みそのものは、体力とダメージの記事で扱っています。

Sponsored

ヒットストップ:2つのTime Dilation

ヒットストップは、攻撃が当たった ほんの数フレームだけ時間を止める 演出です。パンチや斬撃が「効いた」瞬間の食い込みは、ほとんどこれで作られています。

UEで時間の速さを変える方法は2つあり、 効く範囲が違います 。ここを取り違えるのが最初のつまずきです。

左は画面全体が止まるGlobal Time Dilation、右は敵1体だけが止まりプレイヤーは動けるCustom Time Dilationの対比図
方法何が遅くなるか使いどころ
Set Global Time Dilationワールド全体バレットタイム、全体スロー
Actor の Custom Time DilationそのActorだけ被弾した相手だけ止める

Set Global Time DilationGameplayStatics のノードで、1.0 が通常、0.05 なら5%の速さ(スローモーション)です。ただし プレイヤーもエフェクトも、文字どおり全部 が遅くなります。

一方、Actorには Custom Time Dilation というプロパティがあり、Set Custom Time Dilation で個別に変えられます。あるActorの実際の時間の速さは Global × Custom で決まるので、Globalを 1.0 のままにして被弾した相手のCustomだけ 0.15 にすれば、 その相手だけが一瞬止まり、こちらは普通に動ける 状態になります。

タイマーの落とし穴

ここで、多くの人がはまる落とし穴があります。 タイマーやDelayは、Global Time Dilationの影響を受けます

Global Time Dilation 0.05のとき、0.1秒に設定したタイマーが実時間では約2秒かかることを示した図

たとえば「Globalを 0.05 にして、0.1秒 後に元へ戻す」とタイマーを組んだとします。ところがその 0.1秒遅くなった世界の中での0.1秒 なので、実時間ではおよそ 2秒(0.1 ÷ 0.05)も止まり続けます。「一瞬止めたつもりが、いつまでも戻らない」の正体はこれです。

これを避ける確実なやり方が、 被弾ヒットストップには Custom Time Dilation を使う ことです。 タイマーはGlobal Time Dilationには従いますが、Actorの Custom Time Dilation には従いません 。Globalを 1.0 のまま相手のCustomだけ下げれば、復帰用のタイマーは実時間どおりに動き、素直に戻せます。

やりたいこと使うもの復帰のさせ方
被弾した相手だけ一瞬止めるCustom Time Dilationタイマーで実時間どおり戻る
画面全体をスローにする(演出)Global Time Dilation入力やイベントで戻す(短い固定タイマーは避ける)

画面シェイク

画面シェイクは、衝撃でカメラを短く震わせる演出です。作り方は2ステップです。

  1. シェイクの中身を作る: Blueprint Class を作り、親クラスに Legacy Camera Shake を選ぶ。CS_Hit と名付ける(詳細パネルに揺れの数値が並ぶのはこちら。Camera Shake Base を親にする場合は、後述のとおり Root Shake Pattern の設定が別途必要)
  2. 鳴らす: 攻撃が当たった瞬間に Start Camera Shake を呼ぶ
CS_HitのOscillation設定カードと、Player Camera Managerに対してStart Camera Shakeを呼ぶノードの図

Legacy Camera Shake を選ぶと、クラスの詳細パネルに揺れの設定(Oscillation DurationRot Oscillation)が並びます。まずは回転の揺れ(Rotation Oscillation)を軽く入れるのが扱いやすいです。

補足: 新しい Camera Shake Base を親にする場合は、詳細パネルに数値が直接並びません。Root Shake PatternWave Oscillator(または Perlin Noise)を割り当て、そのPattern側でAmplitude・Frequencyを設定します。手順が変わるので、まずは設定が素直な Legacy Camera Shake から始めるのがおすすめです。

項目値の目安意味
Oscillation Duration0.15揺れる長さ(秒)
Rotation Oscillation → Pitch → Amplitude1.0〜3.0縦揺れの大きさ
Rotation Oscillation → Pitch → Frequency20〜40揺れの速さ
Blend In Time / Blend Out Time0.05 / 0.1立ち上がりと収まり

鳴らす側は、 Player Camera Manager に対して Start Camera Shake を呼びます。Get Player Camera Manager から取り出し、Shake ClassCS_HitScale に強さ(1.0 が基準)を渡します。Player Controllerから呼ぶ Client Start Camera Shake も使えます(マルチプレイでは、そのクライアントのカメラにだけ効かせたいときにこちらを使います)。

位置の揺れ(Location Oscillation)より、回転の揺れ(Rotation Oscillation)を主にする と、酔いにくく、画面の情報も失われにくくなります。位置を強く揺らすのは、大きな爆発など限られた場面に留めるのが無難です。

ノックバック

ノックバックは、当たった相手を後ろへ弾き飛ばす演出です。相手がCharacter(Character Movementを持つ)なら、 Launch Character が最も手軽です。

Launch CharacterのLaunch Velocityに前方向×600を入れ、XY Overrideをオンにしてキャラがずり下がるBlueprintと結果の図
ピン内容
Launch VelocityVector飛ばす速度(cm/s)。向き×大きさ
XY Overridebooltrueなら水平速度を上書き、falseなら加算
Z Overridebooltrueなら垂直速度を上書き、falseなら加算

Launch Velocity向き × 大きさ のベクトルです。攻撃側の前方向(Get Actor Forward Vector)に 600 を掛ければ、殴った方向へ飛びます。ただしこれは攻撃側が敵を向いているときだけ正しく働きます。向きに依存せず「発生源から外へ」飛ばすなら、相手の位置 − 攻撃側の位置 を正規化した方向を使います。

XY Overridetrue にすると、相手がいま歩いている速度を無視してきれいに弾けます。Z Override は、上下を加えたくないなら Launch VelocityのZを 0 にしたうえで false にします(false は「加算」なので、Zに値が入っていると足し込まれます)。

相手がCharacterでない(ただのStatic Meshやトラップの)場合は、Launch Character は使えません。その場合は物理シミュレーションをオンにして Add Impulse を使う形になります。Character側の速度の扱いはCharacter Movementの記事にまとまっています。

Sponsored

光・音・エフェクト・数字は専用記事へ

止める・揺らす・飛ばすの3つを土台にしたら、残りの演出は すでにある記事の道具を重ねるだけ です。この記事で全部を作り込むより、専用記事へ委ねて組み合わせに集中します。

演出使う道具参照する記事
被弾フラッシュ(一瞬白く光る)Dynamic Material InstanceDynamic Material Instanceの記事
ヒットエフェクト(火花・斬撃線)NiagaraNiagaraの記事
効果音(打撃音)Sound Cue / MetaSoundsSound Cueの記事
ダメージ数字Widget Component / 画面投影頭上バーとダメージ数字の記事
当たる瞬間の特定Anim NotifyAnimation Montageの記事

被弾フラッシュは、相手のマテリアルをDynamic Material Instanceにして、発光のスカラー値を一瞬だけ上げてから戻すのが定番です。値を滑らかに戻すにはTimelineによる補間が向いています。当たった瞬間の火花はNiagara、打撃音はSound Cueの記事、飛び出すダメージ数字は頭上バーとダメージ数字へ、それぞれつなげます。

このように、手触りの土台さえ持っておけば、あとは各記事の部品を1つずつ足していくだけで画面が仕上がります。


実践:斬撃が当たった瞬間を作り込む

ベルトスクロールの殴り、ARPGの斬撃、2Dアクションの踏みつけ。 攻撃が当たった0.1秒をどう見せるか は、ジャンルを問わず手触りを左右します。ここでは、当たった瞬間に「止める+揺らす+飛ばす」の3つを同時に重ねます。

動かすとこうなる

演出が何も無いと、当たっても敵は棒立ちのままです。3つを重ねると、当たった瞬間に画面が一度カクッと揺れ、敵が一瞬固まってから後ろへずり下がります。

演出なしでは敵が反応しない画面と、停止・シェイク・ノックバックを重ねて敵がのけぞる画面の前後比較図

再現条件

Third Person テンプレート で新規プロジェクトを作り、次を用意します。攻撃の当たり判定とApply Damage体力とダメージの記事の実践をそのまま使えます。

用意するもの内容
BP_Enemy親クラスを Character にした敵(ノックバックのためCharacterにする)
CS_Hit親クラスを Legacy Camera Shake にしたシェイク(上の表の値で設定)
攻撃入力BP_ThirdPersonCharacter に、正面へLine Traceを飛ばす攻撃を用意

攻撃側の BP_ThirdPersonCharacter に、次の変数を持たせます。

変数名既定値用途
HitStopScaleFloat0.15止めるときのCustom Time Dilation
HitStopTimeFloat0.07止める長さ(秒・実時間)
KnockbackStrengthFloat600.0ノックバックの強さ
ShakeScaleFloat0.5画面シェイクの強さ
LastHitActorActor(参照)なし復帰時に元へ戻す相手を覚えておく

当たった瞬間のグラフ

Line Traceが敵に当たり、Apply Damage を送った直後に、Hit Actor を握った状態で次を組みます。カメラを持っているのは攻撃側なので、演出も攻撃側にまとめます。

On HitからCustom Time Dilationの停止・復帰タイマー・Start Camera Shake・Launch Characterへ分岐するBlueprintノードグラフ
On Hit Confirmed(Hit Actor を持っている)
  → Set LastHitActor = Hit Actor
  // (1) ヒットストップ:相手と自分だけ止める。Global は触らない
  → Set Custom Time Dilation(Target = Hit Actor, Value = HitStopScale 0.15)
  → Set Custom Time Dilation(Target = Self,      Value = HitStopScale 0.15)
  → Set Timer by Event(Time = HitStopTime 0.07, Looping = false)→ EndHitStop
  // (2) 画面シェイク
  → Get Player Camera Manager → Start Camera Shake(Shake Class = CS_Hit, Scale = ShakeScale 0.5)
  // (3) ノックバック
  → Cast Hit Actor To Character
        → Launch Character
              Launch Velocity = Get Actor Forward Vector(Self) × KnockbackStrength(600)
              XY Override = true / Z Override = false

カスタムイベント EndHitStop
  → Set Custom Time Dilation(Target = LastHitActor, Value = 1.0)
  → Set Custom Time Dilation(Target = Self,         Value = 1.0)

止めるのに Custom Time Dilation を使うのがポイントです。Globalを触らないので、復帰用の Set Timer by Event実時間どおりの 0.07秒EndHitStop を呼び、素直に元へ戻ります。もしここを Set Global Time Dilation にすると、前述のとおり復帰タイマーまで遅くなって戻らなくなります。

確認する

Playして敵を斬ってください。

  • 当たった瞬間 → 画面が一度カクッと揺れる(約 0.15秒
  • 同時に → 敵とプレイヤーが 0.07秒 だけ止まり、その直後に敵が後ろへ弾かれる(飛ぶ距離は初速だけでなく床の摩擦や減速で変わるので、Launch Velocity の大きさで手触りを調整する)
  • 演出なしと比べると → 明らかに「効いた」手応えが出る

うまくいかないときの切り分けです。

  • 揺れないStart Camera Shake のターゲットが Player Camera Manager でない、または Shake Class が空
  • 止まらないSet Custom Time DilationSet Global Time Dilation と取り違えている(Globalは画面全部が止まる)
  • ずっと止まったまま → 復帰を Delay で書き、しかも Global Time Dilation を下げている。Delayも遅くなって戻らない。Custom+Timerに直す
  • ノックバックしない → 対象がCharacterでない。Launch Character はCharacter専用(Static Meshは物理+Add Impulse
  • 敵が吹っ飛びすぎ/滑らないKnockbackStrength の大きさか、XY Override の扱い(trueで上書き、falseで加算)

ポイントは2つです。

  • 止めるのはCustom、スローはGlobal: 個別の被弾はCustom Time Dilationで相手だけ止めれば、復帰タイマーが巻き添えを食いません。画面全体のバレットタイムを出したいときだけGlobalを使います
  • 一番効くのは最初の数フレーム: ヒットストップ 0.07秒 +シェイク 0.5 +ノックバックを同じ瞬間に重ね、そこへ光や音(NiagaraSound Cue)を足すのが基本形です。全部を最大にすると、逆に何が起きたか読めなくなります(次の節)
Sponsored

やりすぎの見分け方

演出は足すほど良くなる、わけではありません。全部を最大にすると、 画面が情報で埋まって、かえって手応えが消えます

  • ヒットストップを長くしすぎる: 0.3秒 を超えると「重い」ではなく「もたつく」に変わります。通常攻撃は 0.05〜0.1秒、必殺技だけ少し長く、が目安です
  • シェイクを強くしすぎる: 毎回大きく揺れると酔います。Scale は弱めを基準に、強い攻撃のときだけ上げます
  • 強弱に差をつける: 弱攻撃・強攻撃・必殺技で 演出の量そのものに段差 をつけると、攻撃の強さの違いが手触りで伝わります。全部が最大だと、強弱の情報が消えます

手触りは足し算ではなく 配分 です。弱い攻撃はヒットストップだけ、強い攻撃でシェイクとノックバックも足す、というように段階をつけると、読みやすく気持ちいい画面になります。

おまけ:先に知っておくと良いこと

  • 当たった瞬間の特定はAnim Notifyで: 演出を「攻撃ボタンを押した瞬間」に出すと、空振りでも発動して興ざめします。剣が相手に触れる瞬間は、攻撃アニメのAnim Notifyで正確に取れます
  • Tickでカメラを揺らさない: Event Tick で毎フレームカメラ位置を自作でずらす揺れは、フレームレートによって挙動が変わります。Camera Shake を使えば時間ベースで安定します(→ Tickに頼らない設計
  • ヒットストップ中もタイマーは動く: 復帰にDelayでなくTimerを使うのは、前述のGlobal Time Dilationの巻き添えを避けるためです。Custom Time Dilationなら、復帰タイマーは実時間どおりに動きます
  • ノックバックの向きは「発生源から外へ」: 攻撃側の前方向でも、相手の位置 − 攻撃側の位置 の方向でも作れます。爆発のように発生源が点のときは後者が自然です(→ ダメージの記事のDamage Causer)
  • 効かないと感じたら足すより引く: 手応えが弱いとき、つい演出を足しがちですが、既存の演出が互いを打ち消していることもあります。一度すべて切って、ヒットストップ1つだけから積み直すと、どれが効いているかが分かります

まとめ

  • 「当たった感じ」は1つの機能でなく、 止める・揺らす・飛ばす・光る・鳴る の重ね掛けで生まれる
  • ヒットストップは Custom Time Dilationで相手だけ止める のが安全。Globalは画面全体とタイマーまで巻き込む
  • 画面シェイクは Legacy Camera Shake + Start Camera Shake(ターゲットはPlayer Camera Manager)
  • ノックバックは Launch Character 。相手がCharacterのときに使える
  • 光・音・エフェクト・数字は 専用記事へ委譲 し、この記事は 重ね方と配分 に集中する
  • 足し算ではなく配分。 全部を最大にすると、かえって手応えが消える

いま作っている攻撃は、当たったとき画面のどこかが動いているでしょうか。まずはヒットストップ1つを足すところから始めてみてください。