体力とダメージの仕組みを作って、プレイヤーが死ぬところまでは組めた。でも、死んだあとに何も起きません。画面が止まったまま、その場に倒れて、ゲームが進まなくなります。
死は、ゲームの終わりではなく、やり直しの始まりです。アクションでもアスレチックでもシューターでも、「死んだら少し前から再開する」というループがないと、ゲームは成立しません。この記事では、 死亡演出 → 入力停止 → 少し待つ → 復活 の流れと、最後に触れたチェックポイントから再開する仕組みを、溶岩に落ちたら旗から再開するアスレチックで作ります。
この記事でわかること
- 死んだときに踏むべき 4つの拍子(演出→停止→待ち→復活)
- チェックポイントActorで 最後に触れた地点だけ覚える
- リスポーンの2方式: 作り直す と 置き直す の使い分け
- 奈落の底は Kill Volume で拾う(Blueprintで確実な方法)
- 復活で戻すもの・残すもの(HPは全快、コインは維持)の 設計判断
- 実践: 溶岩に落ちたら旗から再開するアスレチック
死んだら何が起きるべきか
「死んだら復活」と一言で言いますが、いきなり別の場所へワープさせると、プレイヤーは何が起きたか分かりません。良い死は、4つの拍子を順に踏みます。

- 演出する: 倒れる、点滅する、画面が赤くなる。「今死んだ」と伝える
- 入力を止める: 死んでいる間は操作を受け付けない。倒れながら動けると台無しです
- 少し待つ: 0.5〜1秒の間。プレイヤーが状況を飲み込む時間
- 復活する: 保存地点へ戻し、状態をリセットし、入力を返す
この順番を守るだけで、死が「理不尽な中断」から「区切り」に変わります。実装では、この4拍子を1つの関数(たとえば HandlePlayerDeath)にまとめると、どこから死んでも同じ流れを通せます。
チェックポイントで最後の地点を覚える
復活先を決めるのが チェックポイント です。プレイヤーが通過した地点を覚えておき、死んだらそこへ戻します。

仕組みは単純です。旗やかがり火のような BP_Checkpoint(Box Collision付き)を置き、プレイヤーが触れたら その地点を1つだけ記録 します。次のチェックポイントに触れたら上書きされ、常に「最後に触れた地点」が復活先になります。
この記録の置き場所は、 ゲーム全体の状況 なので GameState が自然です(プレイヤーが死んで作り直されても、記録は消えません)。ここでは分かりやすさのため、ルール判定の中心である GameMode に LastCheckpointTransform(Transform型)を持たせます。
記録は保存しない: このチェックポイントは、ゲームを起動している間だけ覚えていれば十分です。だからSave Gameには書き出さず、変数に持つだけにします。ゲームを閉じても進行を残したいなら、その値を Save/Loadシステム でディスクへ書き出します。「セッション内の復活」と「起動をまたぐ保存」は、別の 仕事です。
リスポーンの2方式:作り直すか、置き直すか
復活のやり方には2つの方式があり、それぞれ長所と短所があります。

| 方式 | やること | 長所 | 短所 |
|---|---|---|---|
| ①作り直す | 今のPawnを Destroy → 保存地点で Spawn → Possess(または RestartPlayerAtTransform) | 状態が 確実に初期化 される。持ち越しバグが起きない | UIやカメラがそのPawnを参照していると、参照が切れて作り直しが要る |
| ②置き直す | Set Actor Location で保存地点へ移し、変数(HP等)を手でリセット | 軽い。UI・カメラの参照が 切れない | リセットし忘れた変数がバグの温床になる |
RestartPlayer 系のノード(RestartPlayerAtTransform など)はGameModeが持っていて、Blueprintから呼べます。ただしGameModeはサーバーにしか存在しないので、マルチプレイではサーバー側で呼びます。
個人開発の小規模なゲームでは、 ②置き直す方式 が扱いやすいです。HPバーやカメラがプレイヤーを参照したままでも壊れないからです。この記事も②で組みます。「リセットし忘れ」の短所は、後述の「戻すもの・残すもの」を表にして潰します。
奈落はKill Volumeで拾う
アスレチックの死因は、たいてい「落下」です。ここで初心者がはまるのが、UE標準の Kill Z の扱いです。
World Settingsの Kill Z は、その高さを下回ったActorに処理を呼びます。ただし、その通知(FellOutOfWorld)は C++の関数で、Blueprintからは直接受け取れません 。「Kill Zを設定したのに、Blueprintで死亡処理が呼べない」で手が止まります。

Blueprintだけで作るなら、答えはシンプルです。 奈落の底に、大きなBox Collisionの「Kill Volume」を1枚敷きます 。落ちたプレイヤーがそこに触れた瞬間、On Component Begin Overlap で死亡処理を呼びます。Kill Zの高さ判定を毎フレーム自分で見張る必要もなく、コリジョンの当たり判 定 に任せられます。
戻すもの・残すもの
置き直す方式の弱点は「リセットのし忘れ」でした。これは、 復活時に何を戻し、何を残すか を最初に決めておけば防げます。しかもこれは、バグ対策であると同時に ゲームデザインそのもの です。

| 項目 | どうする | 理由 |
|---|---|---|
| HP | 全快に戻す | 瀕死のまま復活させると、また即死する |
| 位置・向き | チェックポイントへ戻す | これが復活の本体 |
| 集めたコイン・鍵 | 残す | 死ぬたびに没収すると、探索の意欲が折れる |
| 開けた扉・倒した敵 | ゲーム次第 | ソウルライク風なら復活、親切設計なら維持。 ここが難度の調整弁 |
「死んだら何もかも巻き戻る」のか「進んだ分は残る」のかで、ゲームの手触りは大きく変わります。この表を、あなたのゲームの難度に合わせて書き換えるのが、リスポーン設計の勘所です。
実践:溶岩アスレチックを作る
3Dアクションの足場地帯、ホラーの即死トラップ、レースのコース復帰。 「落ちたら直前の地点からやり直す」 はジャンルを問わない定番です。ここではその1本を、旗のチェックポイントと溶岩の奈落で組みます。
作るのは、 旗に触れると記録され、溶岩に落ちると画面が暗転して、直前の旗の上でHP全快・コインそのままで復活する アスレチックです。
動かすとこうなります。プレイヤーが足場を渡って旗に触れる。次の足場で踏み外して溶岩に落ちる。画面がスッと暗転し、明けると直前の旗の上に立っていて、HPバーは満タン、集めたコインはそのまま。旗を1本も踏まずに落ちたら、スタート地点へ戻ります。

再現条件
| 項目 | 設定 |
|---|---|
GameMode BP_GameMode | 変数 LastCheckpointTransform(Transform)。初期値は Player Start の位置でよい |
プレイヤー BP_Player(Character) | 変数 CurrentHealth(Float, 100.0)、MaxHealth(Float, 100.0)、bIsDead(Boolean, false) |
チェックポイント BP_Checkpoint | Static Mesh(旗)+ Box Collision。Collision Presets = OverlapAllDynamic |
Kill Volume BP_KillVolume | 大きな Box Collision。溶岩の底を覆う。Collision Presets = OverlapAllDynamic |
| フェード用 | WBP_Fade(全画面の黒いImage)。詳しくは Timelineノード の補間で |
ステップ1:チェックポイントに触れたら記録する
BP_Checkpoint は、触れたプレイヤーの位置を、GameModeの LastCheckpointTransform へ書き込むだけです。

BP_Checkpoint(イベントグラフ)
On Component Begin Overlap(Box)
→ Cast To BP_Player(Other Actor)
→ (成功)Get Game Mode → Cast To BP_GameMode
→ Set LastCheckpointTransform(= Other Actor の GetActorTransform)
→ Print String("チェックポイント記録")
Cast To BP_Player を挟むのは、プレイヤー以外(落ちてきた小物な ど)で記録が上書きされないためです。
ステップ2:溶岩に落ちたら死亡処理を呼ぶ
BP_KillVolume は、触れたプレイヤーの HandlePlayerDeath を呼ぶだけです。
BP_KillVolume(イベントグラフ)
On Component Begin Overlap(Box)
→ Cast To BP_Player(Other Actor)
→ (成功)Call HandlePlayerDeath(Target: Other Actor)
ステップ3:4拍子の死亡処理を組む
BP_Player に HandlePlayerDeath(Custom Event)を作り、演出→停止→待ち→復活を1本に通します。

BP_Player(イベントグラフ)
HandlePlayerDeath(Custom Event)
→ Branch(bIsDead == true)→ True: Return // 二重死亡を防ぐ
→ Set bIsDead = true
// ① 演出+② 入力停止
→ Disable Input(Get Player Controller 0)
→ WBP_Fade を Add to Viewport → フェードイン(画面を黒く)
// ③ 少し待つ
→ Delay(Duration = 0.5)
// ④ 復活:置き直す
→ Get Game Mode → Cast To BP_GameMode → Get LastCheckpointTransform
→ Set Actor Transform(Target: self, New Transform = LastCheckpointTransform)
→ Set CurrentHealth = MaxHealth // HP全快(戻すもの)
→ フェードアウト(画面を明るく)→ WBP_Fade を Remove from Parent
→ Enable Input(Get Player Controller 0)
→ Set bIsDead = false
先頭の bIsDead チェックが要点です。落下中にKill Volumeへ複数回触れても、死亡処理は 一度しか走りません 。コインや鍵はここで何もしていないので、そのまま 残ります(戻すもの・残すものの表のとおり)。
確かめる
Playして、旗に触れてから溶岩へ飛び込んでください。うまくいけば、画面が0.5秒かけて暗転し、明けると 直前の旗の上に立っていて、HPバーは満タン、コインはそのまま です。旗を1本も踏まずに落ちたら、LastCheckpointTransform の初期値(Player Start)へ戻ります。
うまくいかないときの切り分けです。
- 落ちても何も起きない → Kill Volumeの
Collision PresetsがOverlapAllDynamicか、Generate Overlap Eventsにチェックが入っているかを確認 - 暗転したまま戻ってこない →
Enable InputかRemove from Parentが呼ばれていません。Delayの先がつながっているか確認 - 復活を何度も繰り返す →
bIsDeadのチェックが抜けています。Kill Volumeに触れ続けてHandlePlayerDeathが連発しています
ポイントは2つです。
- 死は1つの関数に集約する: 落下death・敵にやられるdeath・トラップdeath、入口は違っても、行き着く先は同じ
HandlePlayerDeathに。4拍子を一箇所に書けば、どこから死んでも同じ手触りになります - 戻すものと残すものを先に決める: HPは全快、コインは維持。この仕分けが難度そのものなので、体力とダメージ の死亡判定とセットで設計してください
おまけ:先に知っておくと良いこと
作り直す方式が要るとき。 状態が複雑に絡んで「置き直しでは初期化しきれない」と感じたら、RestartPlayerAtTransform(GameModeが持つ)でPawnごと作り直します。この場合、UIやカメラの参照は自分で張り直す必要があります。小規模なうちは置き直し、複雑になったら作り直し、と考えてください。
チェックポイントを「1つだけ」にしない発展。 ローグライクの階層セーブや、戻れる分岐路がある探索ゲームでは、複数のチェックポイントを覚えたくなります。そのときは Transform 1個ではなく、チェックポイントの配列やIDで管理します。まずは「最後の1つ」で仕組みを掴んでからで十分です。
起動をまたいで残すなら保存する。 この記事の記録は、ゲームを閉じると消えます。「昨日の続きから」を実現したいなら、LastCheckpointTransform やコイン数を Save/Loadシステム でディスクへ書き出します。セッション内の復活(この記事)と、起動をまたぐ保存(save-load)は、両輪です。
まとめ
死んでもやり直せるゲームは、次の4拍子で組み上がります。
| 拍子 | やること | 実装 |
|---|---|---|
| 演出 | 死んだと伝える | 倒れる・点滅・画面を暗く |
| 停止 | 操作を止める | Disable Input |
| 待つ | 状況を飲み込ませる | Delay(0.5〜1秒) |
| 復活 | 保存地点へ戻す | 置き直し(Set Actor Transform+HP全快) |
そして忘れてはいけないのが、 戻すもの(HP)と残すもの(コイン)の仕分け です。これが難度の調整弁になります。
これで「動かす → 当てる → 死ぬ → やり直す」のループが閉じました。あなたのゲームで、プレイヤーが一番よく死ぬのはどの場所でしょうか。そこに、最初の旗を1本立ててみてください。
さらに学ぶために
- 体力とダメージ(Apply Damage) — 死亡判定の発生源
- Save/Loadシステムの実装 — 起動をまたいで進行を残す
- GameInstanceでデータを持ち越す — レベルをまたぐ記録の置き場所
- UE5公式ドキュメント:Game Mode and Game State