本記事は、以下の記事にあるような見た目の床を置く作業をマスターしている方向けです。

見た目の床を置く作業について知りたい方は、上の記事からどうぞ!
Checkpointとは
Checkpointはコースの途中の「区切り地点」です。
Respawn時、このCheckpointから復帰します。
Roblox Studioで作るときに必要なのは2つです。
- 復活地点として使う
SpawnLocation - プレイヤーが触れたときに、その場所を復活先に設定するスクリプト
Partを置いただけだと動かないのは、スクリプト側がないからです。
試作:まず1個のCheckpointを作ってみる
Obbyで「落ちたら復活」を試したいとき、Baseplate が下に残っていると、落ちてもそのまま着地してしまうことがあります。
この場合は死亡扱いにならないので、Checkpoint の動作確認もしにくくなります。
コースの真ん中あたりに、通常の足場より少し広めの足場を1つ作ります。
小さいと着地してそのまままた落ちるので、前後の足場より一回り大きいくらいがちょうどいいです。
ExplorerのWorkspaceから + を押して SpawnLocation を追加します。
名前を Checkpoint に変更して、さっき作った足場の上に重ねて配置します。
ポイントは「見た目の床」と「SpawnLocation」を分けて考えること。
チェックポイント用の床を作って、その上にSpawnLocationを乗せるイメージです。
Checkpoint を選んでPropertiesを開き、以下を確認してください。
Neutral→ falseAllowTeamChangeOnTouch→ trueEnabled→ true
Enabled がオフのままだと見た目は置けてても復活地点として機能しません。
動かないときに最初に疑う項目です。
ExplorerのServerScriptServiceを右クリックして Script を追加します。
名前は CheckpointScript にしておきましょう。後で見返しやすいです。
最初から入ってるHelloWorldのコードを消して、以下に置き換えます。
local Players = game:GetService("Players")
local checkpoint = workspace:WaitForChild("Checkpoint")
checkpoint.Touched:Connect(function(hit)
local character = hit.Parent
if not character then return end
local humanoid = character:FindFirstChildOfClass("Humanoid")
if not humanoid then return end
local player = Players:GetPlayerFromCharacter(character)
if not player then return end
player.RespawnLocation = checkpoint
end)
やっていることはシンプルです。Checkpointに何かが触れたら、それがプレイヤーのキャラクターかどうか確認して、プレイヤーだったら復活先をそこに設定する。Humanoid の有無を見てるのは、パーツなど関係ないものが触れても反応しないようにするためです。
- スタート地点から始まる
- Checkpointに触れる
- そのあと落ちる
- Checkpointから復活する
この流れで動けば1個版は完成です。
ここで動かない場合は複数化に進む前に必ず見直してください。
複数のCheckpointにする
実際のゲーム制作では、2個以上のCheckpointが必要になると思います。
次は複数のCheckpointを作成してみましょう。
Checkpoint2・Checkpoint3と名前を増やすたびにスクリプトも書き足す形になると管理がしんどくなります。
足場を足すのに備えて、フォルダで管理する形にしておくのがおすすめです。
WorkspaceにFolderを追加して、名前を Checkpoints にします。
その中にチェックポイント用のSpawnLocationをまとめていきます。
名前はコースの順に Checkpoint1Checkpoint2Checkpoint3 とそろえておくと後で分かりやすいです。
Checkpoint1個版のScriptを以下の内容に差し替えます。
local Players = game:GetService("Players")
local checkpointsFolder = workspace:WaitForChild("Checkpoints")
local function onCheckpointTouched(checkpoint, hit)
local character = hit.Parent
if not character then return end
local humanoid = character:FindFirstChildOfClass("Humanoid")
if not humanoid then return end
local player = Players:GetPlayerFromCharacter(character)
if not player then return end
player.RespawnLocation = checkpoint
end
for _, checkpoint in ipairs(checkpointsFolder:GetChildren()) do
if checkpoint:IsA("SpawnLocation") then
checkpoint.Touched:Connect(function(hit)
onCheckpointTouched(checkpoint, hit)
end)
end
end
CheckpointsフォルダにあるSpawnLocationを全部まとめて読み取って、それぞれにTouchedをつないでいます。
あとからCheckpointを増やしたくなったときも、SpawnLocationをフォルダに入れて配置するだけでスクリプトは触らなくてOKです。
複数個のCheckpointが思惑通りに動くはずです!
うまく動かないときの確認ポイント
落ちても復活せずそのまま落ちていく
死亡扱いになっていない可能性が高いです。
Baseplateが残ってるか、下に別の床があるか確認してください。
Checkpointに触れたのにスタート地点に戻る
以下を確認してください。
- ScriptがServerScriptServiceに入ってるか
- SpawnLocationの名前がScriptと合ってるか
- Enabledがオフになってないか
見た目の床に触れても、SpawnLocation自体が小さいままだと反応しないことがあります。
Checkpointを複数置いたら変な場所に戻る
Checkpointsフォルダの中身をExplorerで確認してください。
試作中に複製が増えて、SpawnLocationが重なってることがよくあります。
古いチェックポイントがWorkspace直下に残ってないかも見てみてください。
Scriptを直したのに反映されない
RunではなくPlayで確認してみてください。
スタートから進んで触れて落ちる、という流れを通しで試すとどこでずれてるか見つけやすいです。
まとめ
Checkpointは、Obbyを最後まで遊んでもらうための土台になる部分です。
見た目の床を置くだけでは動きません。
SpawnLocationを用意して、触れたときに復活先を設定するスクリプトを書く
この2つがそろって初めて機能します。
慣れてきたら演出も追加してみると良いでしょう。
触れた瞬間に色が変わったり音が鳴ったりすると、「ちゃんとセーブされた」感が出て遊びやすくなります。
ただ、演出はあとからいくらでも足せるので、まずは「ちゃんと戻れる」を安定させることを優先してください。
ゲームを閉じて入り直したあとも続きから再開したい場合は、別でデータ保存の仕組みが必要になり、そちらはまた別の話となります。



