【Unreal Engine】チェックポイントとリスポーン:落ちたら最後の目印へ戻る

作成: 2026-07-23最終更新: 2026-09-07

UEのThird Personテンプレートで、足場から落ちたら最後のチェックポイントへ戻る仕組みを作ります。安全な復帰地点、落下速度のリセット、カメラの暗転、二重実行の防止を図解。目印を通る前・通った後・2つ目を通った後で、戻る場所が変わることまで確かめます。

足場を渡って、あと少しでゴール。ところが最後のジャンプに失敗し、また最初からやり直しになってしまう。途中に一つでも再開地点があれば、もう一度挑戦しやすくなります。

チェックポイント は、失敗したときに戻る場所を覚える仕組みです。そして リスポーン は、プレイヤーを再び遊べる状態へ戻す処理です。位置を戻すだけでなく、落下中の速度や一時的に止めた操作も整えます。

この記事では、足場の上の目印に触れたら記録し、落ちたら画面を暗くして、その目印へ戻る流れを作ります。目印にまだ触れていなければ、最初に出現した場所へ戻ります。

足場の目印を記録し、落下後は暗転を挟んで同じ目印へ戻る

この記事でわかること

  • 安全に立てる復帰地点を用意する
  • 最後に通ったチェックポイントを覚える
  • 落下を検知し、停止・暗転・復帰を一つの流れにする
  • 戻る場所と、操作を再開できることを確かめる

UE5のThird Personテンプレートを使います。Blueprintで変数とCustom Eventを作れる人向けです。1人プレイ・同じレベル内で、同じキャラクターを戻す例として進めます。

Sponsored

復帰は「場所を戻す」だけではない

落ちたキャラクターを足場へ移しても、落下速度が残っていれば、復帰直後に勢いよく地面へぶつかります。入力を止めたままなら、戻れても動けません。

今回は次の順に進めます。

  1. 止める:復帰処理中の目印を立て、入力と移動を止める
  2. 暗くして待つ:画面を黒くし、場所が切り替わる瞬間を隠す
  3. 戻す:覚えた場所と向きへキャラクターを移す
  4. 再開する:画面を明るくし、移動と入力を戻す
停止、暗転して待機、位置と向きの復元、操作再開の4段階

この流れを HandlePlayerDeath というCustom Eventへまとめます。Custom Eventは、名前を付けて呼び出せる処理の入口です。少し待つDelayを使うため、通常の関数ではなく、イベントグラフ上に作ります。 落下以外の死因も、後から同じイベントへつなげられます。

チェックポイントの記録は、今回戻すキャラクター自身に持たせます。キャラクターを消さずに移動するので、復帰先の変数も残るからです。レベルを開き直さないため、ほかのActorの状態もそのままです。

準備:3つの足場と、最初の復帰先

1. 歩いて落ちられる場所を作る

Third PersonのBlueprintプロジェクトを開きます。テンプレートに「Variant」の選択がある版では「None」を使い、Playで移動・ジャンプができることを先に確かめてください。

レベルを実験用に複製し、Cubeで3つの足場を作ります。隙間の下に既存の床や障害物がある場合は、後で置く落下検知の範囲へ入る前に着地しない配置にします。

たとえば、標準の100cm角のCubeなら、次の配置で試せます。3つともScaleは (6, 6, 0.5)、Rotationは (0, 0, 0)、Collisionは「BlockAll」です。

足場Location役割
A(0, 0, 300)最初の足場
B(850, 0, 300)1つ目のチェックポイント
C(1700, 0, 300)2つ目のチェックポイント

この寸法では足場の上面がZ=325です。既存のPlayer StartをAの上、たとえば (-150, 0, 425) へ移し、向きはYaw=0にします。Playの開始位置は「Default Player Start」を使います。

3つの足場A・B・Cと、その下を覆う落下検知の箱

まずAへ出現し、足場の上を歩ければ準備できています。ここではまだ落下後には戻りません。

2. キャラクターに2つの変数を作る

Content/ThirdPerson/Blueprints/BP_ThirdPersonCharacter を開き、次を追加します。

変数名初期値・用途
LastCheckpointTransformTransformBeginPlayで実際の出現地点を入れる
bIsDeadBooleanfalse。復帰処理中だけtrueにする

Transform は、位置・回転・大きさを一組にした値です。ここでは「どこへ、どちら向きで戻るか」をまとめて覚えます。

BeginPlayの白い実行線に Set LastCheckpointTransform をつなぎ、値には Get Actor Transform(TargetはSelf)の出力を渡します。既存のBeginPlay処理がある場合は消さず、その末尾へ追加してください。

BeginPlayで自分のGet Actor TransformをLastCheckpointTransformへ入れる

これで、チェックポイントを一度も通っていなくても、実際に出現した場所 へ戻せます。Transformの初期欄を空のまま使って、ワールドの原点へ飛ばしてしまうのを避けられます。

キャラクターの「Capsule Component」は「Generate Overlap Events」を有効にします。見た目の「Mesh」は同項目を無効にし、この例ではカプセルで領域への侵入を検知します。カプセル は、キャラクターを包む丸みのある当たり判定です。

チェックポイントを通ったら、復帰先を更新する

1. 戻る場所を、足場の上に決めておく

Actorを親に BP_Checkpoint を作り、次の3コンポーネントを追加します。すべてDefaultSceneRootの子にします。

コンポーネント名前設定
Box CollisionTriggerRelative Location=(0,0,100)、Box Extent=(100,100,100)
ArrowRespawnPointRelative Location=(0,0,100)、Relative Rotation=(0,0,0)
Static MeshMarkerCubeを指定。Relative Location=(0,-120,60)、Scale=(0.15,0.15,1.2)、CollisionはNoCollision

Markerは、通過する場所が分かる細い柱です。慣れたら旗やかがり火の見た目へ差し替えられます。

TriggerのCollision Presetsを「Custom」、Collision Enabledを「Query Only」、Object Typeを「WorldDynamic」にします。Pawnへの応答だけを「Overlap」、ほかは「Ignore」にし、「Generate Overlap Events」を有効にしてください。

Overlap は、通り抜けた相手を検知する設定です。今回のTriggerは壁にはせず、キャラクターが入ったことだけを知らせます。

柱の横のTriggerと、カプセル中心を��置く高さのRespawnPoint

RespawnPointは、復帰後の カプセルの中心 を置く目印です。地面すれすれでは体が埋まるため、カプセルの半分の高さより少し上へ置きます。標準サイズでは上の100cmを目安にし、サイズを変えた場合は高さも調整します。壁や足場の端から離れた、十分な広さのある場所を選んでください。

BP_CheckpointをBとCの上へ置きます。先ほどの足場ならLocationはそれぞれ (850,0,325)(1700,0,325) です。ActorのScaleは (1,1,1) を保ち、Triggerの広さはBox Extentで調整します。

2. キャラクターに「ここを覚える」入口を作る

BP_ThirdPersonCharacterへ SetCheckpoint というCustom Eventを作り、入力を1つ追加します。名前は NewCheckpoint、型はTransformです。

白い線をSetCheckpoint→Branchの順につなぎ、ConditionへbIsDeadのGetを渡します。Trueはつながず終了し、Falseから Set LastCheckpointTransform へ進めます。値にはイベントのNewCheckpointをつなぎ、その後のPrint Textで チェックポイントを記録しました と表示します。

チェックポイントから渡された地点を、キャラクターのLastCheckpointTransformへ覚える

bIsDeadを調べるのは、復帰の途中でTriggerへ戻ったときに、記録処理まで動かさないためです。普段はfalseなので、次の目印へ触れるたびに復帰先を上書きします。

この記事のPrint Textは「Print to Screen」「Print to Log」を有効、Duration=5、Key=Noneにします。画面へ5秒間表示し、Output Logにも確認用の記録を残す設定です。

3. 通過した相手へ、目印の場所を渡す

BP_CheckpointでTriggerを選択し、「On Component Begin Overlap」を追加します。このイベントは、相手が領域へ入ったときに呼ばれます。

白い出力を Cast To BP_ThirdPersonCharacter の実行入力へ、Other ActorをObjectへつなぎます。Other Actorは、いま入ってきた相手 です。Castに成功した場合だけ、その相手を今回のキャラクターとして扱います。

Overlapの白い実行線とOther ActorをCastへ渡す

RespawnPointをグラフへGetとして置き、青い出力から Get World Transform を作ります。TargetがRespawnPointにつながったものを使ってください。

RespawnPointからGet World Transformでレベル内の復帰先を取得する

World Transform は、レベル全体を基準にした位置や向きです。Relative Transformのままだと、BもCも「親から100cm上」という同じ値になり、レベル内の復帰先を表せません。

Cast成功の白い出力から、SetCheckpoint の呼び出しへつなぎます。Targetには「As BP Third Person Character」、NewCheckpointにはGet World Transformの出力を渡します。

CastしたキャラクターをTargetにして、SetCheckpointへ復帰地点を渡す

Cast Failedはつながず、対象外のActorなら何もしません。コンパイルしてPlayし、BやCの柱へ近づいたときに記録メッセージが出れば、通過の検知までできています。

Sponsored

落ちたら止めて、暗転して、戻す

1. 復帰中の二重実行を防ぐ

BP_ThirdPersonCharacterのイベントグラフへ、引数なしのCustom Event HandlePlayerDeath を作ります。

白い線はイベント→Branch、ConditionはbIsDeadのGetです。Trueはつながず終了、Falseから Set bIsDead=true へ進みます。その後のPrint Textに 復帰を開始します と入れておきます。

bIsDeadがfalseのときだけtrueへ変え、復帰処理を開始する

bIsDeadは「今は復帰中です」という札です。先にtrueにすることで、別の領域から同じイベントが呼ばれても、待ち時間や暗転を重ねて始めません。復帰の最後でfalseへ戻します。

2. 入力と、すでに動いている体を止める

Print Textの後へ、次の順で白い実行線をつなぎます。

ノードTarget・入力
1Stop JumpingTargetはSelf
2Disable InputTargetはSelf。Player ControllerへGet Player Controller(Player Index=0)
3Stop Movement ImmediatelyTargetへCharacter MovementのGet
4Disable MovementTargetへ同じCharacter MovementのGet
入力を止める処理と、速度を0にして移動を止める処理を順に実行する

Character Movement は、キャラクターの歩行・ジャンプ・落下を担当するコンポーネントです。「Components」からグラフへGetとして置き、そこからドラッグすると、その部品をTargetにしたノードを作れます。

Player Controller は、プレイヤーの入力や視点を管理する役目です。今回は1人プレイなので、Get Player ControllerのPlayer Indexは0にします。Disable Inputでは「このプレイヤーから、Selfへの入力を止める」と指定しています。

Disable Inputだけでは、落下速度まで消えません。Stop Movement Immediatelyで速度を0にし、Disable Movementで移動モードをNoneにして、待っている間も落ち続けないようにします。Stop Jumpingは、押したままになったジャンプの状態を解除するためです。

3. 画面を黒くして、切り替えの時間を作る

Disable Movementの後へ Start Camera Fade を置きます。Targetには Get Player Camera Manager(Player Index=0)を渡します。

Player Camera Managerは、そのプレイヤーが見る画面を管理するものです。Start Camera Fadeは、指定した色を画面へ重ね、時間をかけて濃さを変えます。

入力暗くするときの値
From Alpha0
To Alpha1
Duration0.2
Color黒(R=0、G=0、B=0)
Should Fade Audiofalse
Hold when Finishedtrue

Alphaの0は透明、1は完全に覆う濃さ です。0から1へ0.2秒で変え、黒くなった状態をHold when Finishedで保ちます。

Start Camera Fadeの白い出力から Delay(Duration=0.5)へつなぎます。Start Camera Fadeの出力は、暗転の完了を待ってくれません。そこでDelayを入れ、0.2秒で黒くなった後も少し待ってから戻します。

暗転0.2秒を含む待機0.5秒の後に移動し、0.2秒で明るくして再開する時間軸

4. 覚えた場所と向きへ戻す

Delayの「Completed」から Set Actor Transform へつなぎます。TargetはSelf、New TransformへLastCheckpointTransformのGetを渡します。「Sweep」はfalse、「Teleport」はtrueにします。

LastCheckpointTransformをSet Actor Transformへ渡してキャラクターを移す

Sweepをfalseにするのは、戻る経路の途中で壁に止められず、指定地点へ直接移すためです。その代わり、復帰先そのものが空いていることを、配置時に確かめます。 Teleportは速度を0にする設定ではないので、手順2の速度リセットも必要です。

続いて Set Control Rotation をつなぎます。TargetはGet Player Controller(Player Index=0)。LastCheckpointTransformから Break Transform を作り、そのRotationをNew Rotationへ渡します。

キャラクターを置く向きと、Controllerが向く方向を復帰地点へそろえる

Third Personのカメラは、キャラクターの体とは別にControllerの向きを使います。体だけ戻しても、カメラが落下前の方向を向くことがあるため、こちらもそろえます。

5. 明るくして、操作を返す

Set Control Rotationの後へ、もう1つ Start Camera Fade を置きます。Targetは同じGet Player Camera Managerです。今度はFrom Alpha=1、To Alpha=0、Duration=0.2、Color=黒、Should Fade Audio=false、Hold when Finished=falseにします。

その白い出力からDelay(Duration=0.2)へつなぎ、「Completed」の後を次の順にします。

  1. Character MovementをTargetにした Set Movement Mode。New Movement Modeは「Walking」
  2. SelfをTargetにした Enable Input。Player ControllerはGet Player Controller(Player Index=0)
  3. Set bIsDead=false
  4. Print Textで 復帰しました

Walkingは、地面を歩ける通常の移動モードです。入力だけ戻しても移動モードがNoneのままだと歩けないので、両方を戻します。

これでHandlePlayerDeathは、途中のDelayを含めて、開始から最後まで白い実行線がつながります。

6. 足場の下からHandlePlayerDeathを呼ぶ

Actorを親に BP_KillVolume を作り、Box Collisionを追加して KillBox と名付けます。Collisionの設定はチェックポイントのTriggerと同じ、Query Only・PawnだけOverlap・Generate Overlap Events有効です。

KillBoxの「On Component Begin Overlap」からCast To BP_ThirdPersonCharacterへ、白い線とOther Actor→Objectをつなぎます。Cast成功から HandlePlayerDeath を呼び、Targetへ「As BP Third Person Character」を渡します。Cast Failedはつながず終えます。

このBP_KillVolumeを足場の下へ置きます。先ほどの配置なら、ActorのLocationは (850,0,100)、Scaleは (1,1,1)、KillBoxのBox Extentは (2000,800,50) が一例です。箱の上面Z=150で、足場から落ちたキャラクターを受け止めずに検知できます。

World SettingsのKill Zより上で検知する ことも確認してください。Kill Zは、ワールドの下へ落ちすぎたActorを処理する高さです。先にキャラクターが破棄されると、この「同じキャラクターを戻す」処理は続けられません。

ここで作るBP_KillVolumeは、ActorとBox Collisionで作った独自の検知領域です。標準の「Kill Z Volume」を置く手順とは区別してください。

Sponsored

確認:最後に通った目印へ戻れるか

すべてをコンパイルして保存し、Playします。画面をクリックして操作し、次の順に確かめます。

操作期待する結果
Bへ行く前に、Aから横へ落ちる暗転後、Aの最初の出現地点へ戻る
Bの柱へ近づき、記録メッセージを見てから落ちるBのRespawnPointへ戻る
Cでも記録してから落ちる今度はCへ戻る
復帰後に歩く・視点を動かす・ジャンプするいずれも再び操作できる
もう一度落ちる再び1回の復帰処理が動く
Playを停止し、もう一度Playする記録は最初の出現地点からやり直しになる
未通過ならA、Bを通った後はB、Cを通った後はCへ戻る確認例

Output Logでも、1回の落下につき 復帰を開始します復帰しました が1組ずつ出るかを見ます。復帰中に移動キーを押してみて、勝手に走り出さず、画面が戻った後に操作できるかも確認してください。

症状まず見るところ
記録メッセージが出ないTriggerとCapsuleのGenerate Overlap Events、PawnへのOverlap、CastのObject
落ちても復帰が始まらないKillBoxへ入る前に床へ着地していないか。Cast成功からのTargetと白い線
原点へ戻るBeginPlayでLastCheckpointTransformへ値を入れたか
BもCも同じ場所へ戻るRespawnPointのGet World Transformを使っているか
復帰後に動けないSet Movement Mode=WalkingとEnable Inputの両方が通ったか
黒い画面のままになる2つ目のStart Camera Fadeが1→0になっているか。Delayの先の白い線
復帰直後にまた落ちるRespawnPointの高さ・足場の広さ・KillBoxとの位置関係
2回目の落下では戻らない最後のSet bIsDead=falseが通ったか

Begin Overlapは、領域内にいる間ずっと呼ばれるイベントではありません。復帰を繰り返すときは、二重実行の防止だけでなく、危険な場所へ戻して入り直していないかも見直します。

おまけ:HP・保存・作り直す方式

HPを戻し、コインを残すなら

体力や収集物を組み合わせるときは、復帰時の扱いを先に決めます。たとえば、次のようなルールにできます。

項目ルールの例追加する場所・処理
HP全快にする位置を戻した後、画面を明るくする前にCurrentHealthへMaxHealthを代入
集めたコイン今回の獲得分を残す復帰処理ではコイン数を変更しない
攻撃中・無敵中などの状態通常状態へ戻す対応する変数やタイマーも、明るくする前に戻す
敵や扉ゲームのルールで決める必要なActorへリセットを知らせる

同じキャラクターを戻すだけでは、変数やタイマーまで自動で元には戻りません。「位置は戻ったが、攻撃できない」といった不具合を防ぐために、戻す状態を一つずつ確かめます。

体力とダメージの記事と組み合わせるなら、HPが0になったときの入口をHandlePlayerDeathへつなぎます。ダメージを受ける側でもbIsDeadを確認し、復帰中の追加ダメージを通さないようにします。

コインを残す設計なら、拾ったコインActorも消えた状態を保つなど、所持数と、ステージ上に残る収集物をセットで考えます。 所持数だけ残してコインを毎回復活させると、同じ場所で何度でも集められてしまいます。

キャラクターを作り直す方式との違い

今回のように同じキャラクターを移動する方法のほか、古いPawnを破棄し、新しいPawnを作る方法もあります。Pawn は、Controllerが操作する対象です。Characterは、歩行などの仕組みを備えたPawnの一種です。

同じキャラクターを移動する方法と、新しいキャラクターへ交代する方法
方式何が変わるか確認すること
置き直す同じキャラクターを使い続けるHP・速度・攻撃状態など、戻すものを自分で指定する
作り直す新しいPawnへ操作対象が変わる残す記録の置き場所、生成の成否、操作の引き継ぎ、UIの参照を整える

GameModeの RestartPlayerAtTransform などが、指定した地点へPawnを生成するための入口になります。ただし、呼ぶだけでゲーム全体の状態がすべて初期化されるわけではありません。古いPawnやControllerの状態も含めた手順が必要です。

作り直すなら、チェックポイントは破棄するPawnの外へ持たせます。1人プレイ・同じレベル内ならGameModeなどが候補です。GameModeはレベルを開き直すと作り直されるため、ゲーム起動中ずっと残る置き場所ではありません。Game Frameworkの記事で役割を整理できます。

ゲームを閉じても残すなら

この例のLastCheckpointTransformは、現在のキャラクターが覚えている値です。Playの停止やレベルの再読み込みを越えては残りません。

レベルをまたいで一時的に持ち越すならGameInstance、ゲームを閉じても残すならSave Gameを使います。別のレベルへ戻る場合は位置だけでなく、どのレベルのどのチェックポイントかも記録します。

レベルの配置を後で変えるゲームなら、座標そのものより Checkpoint_B のようなIDを保存し、現在のレベルで対応する目印を探す方法もあります。まずはA→B→Cと戻り先が切り替わることを確かめ、ゲームに必要な保存範囲へ広げてください。

まとめ

  • 復帰は「場所を戻す」だけでなく、止める・暗転する・操作を返すまでが1組
  • 通った目印を覚えておき、落ちたらそこへ戻す
  • 戻す先は、必ず落下判定より上に置く
  • 戻した直後に操作を再開できるかまで確かめる

作ったあとの問いかけは、「戻った瞬間、そのまま動き出せるか」 です。止まったままなら、操作を返す処理が抜けています。

記録を次のレベルへ持ち越すなら GameInstance、次回の起動まで残すなら Save Game へ。

参考: カメラフェードの公式説明Stop Movement ImmediatelySet Actor Transform

Unreal Engine このセクションのノート98