この記事で作るもの
スタート地点から移動し、青いチェックポイントに触れると、次に倒れたときはそこから復活する仕組みを作ります。Roblox Studioの標準キャラクターと、自動リスポーンが有効な新規Baseplateを前提にします。
復活先はPlayer.RespawnLocationへ記録します。プレイヤーAがチェックポイントへ到達しても、プレイヤーBの復活先は変えません。接触判定と記録は、サーバー側のScriptで行います。
1. SpawnLocationを2つ置く
新規BaseplateにあるSpawnLocationをStartSpawnへ改名し、もう1つSpawnLocationを追加してCheckpointSpawnと名付けます。通常のPartではなく、SpawnLocation型であることを確認してください。
| Properties | StartSpawn | CheckpointSpawn |
|---|---|---|
| Parent | Workspace直下 | Workspace直下 |
| Position | (0, 0.5, 0) | (0, 0.5, -20) |
| Size | (6, 1, 6) | (6, 1, 6) |
| Anchored | オン | オン |
| CanCollide / CanTouch | 両方オン | 両方オン |
| Enabled / Neutral | 両方オン | 両方オン |
| AllowTeamChangeOnTouch | オフ | オフ |
| 色 | 白など | 青など見分けやすい色 |
SpawnLocationの上にほかのPartを重ねず、キャラクターの足で直接触れられるようにします。この例ではTeamsを作らず、Neutralのスポーン地点を使います。SpawnLocationの公式資料
Positionの数値は、Baseplateの上面がY=0の場合です。床の高さを変えている場合は、各SpawnLocationの底面が床の上に来るようにYも調整します。また、不要な別のSpawnLocationは追加せず、ここではこの2つで確かめます。
Explorerは次の構成になります。CheckpointServerはServerScriptServiceに追加する通常のScriptです。LocalScriptにはしません。
Workspace
Baseplate
StartSpawn (SpawnLocation)
CheckpointSpawn (SpawnLocation)
ServerScriptService
CheckpointServer (Script)
2. サーバーで復活先を記録する
CheckpointServerへ次のコードを貼り付けます。スポーン地点の名前を変えた場合は、コード内の名前も合わせます。
local Players = game:GetService("Players")
local startSpawn = workspace:WaitForChild("StartSpawn")
local checkpointSpawn = workspace:WaitForChild("CheckpointSpawn")
assert(startSpawn:IsA("SpawnLocation"), "StartSpawnはSpawnLocationにしてください")
assert(checkpointSpawn:IsA("SpawnLocation"), "CheckpointSpawnはSpawnLocationにしてください")
local function preparePlayer(player)
player.RespawnLocation = startSpawn
end
Players.PlayerAdded:Connect(preparePlayer)
for _, player in Players:GetPlayers() do
preparePlayer(player)
end
checkpointSpawn.Touched:Connect(function(hit)
local character = hit:FindFirstAncestorOfClass("Model")
if not character then
return
end
local player = Players:GetPlayerFromCharacter(character)
if not player then
return
end
local humanoid = character:FindFirstChildOfClass("Humanoid")
if not humanoid or humanoid.Health <= 0 then
return
end
if player.RespawnLocation == checkpointSpawn then
return
end
player.RespawnLocation = checkpointSpawn
print(player.Name .. " のチェックポイントを更新しました")
end)
参加したプレイヤーには最初にStartSpawnを割り当てます。接触時は、触れたPartからキャラクターをたどり、実際のプレイヤーか、キャラクターが生きているかを確認してから更新します。
Touchedは体の複数のPartから通知されることがあります。すでに同じ復活先なら戻る条件を入れることで、立ち続けていても到達ログを繰り返し出さない形にしています。全員で共有する1個のフラグを使わないため、あとから来た別のプレイヤーも到達できます。
RespawnLocationを変えても、その瞬間にキャラクターは移動しません。変わるのは次回の復活先です。リスポーンそのものは標準の仕組みに任せます。Player.RespawnLocationの公式資料
3. 1人で復活位置を確認する
- 実行中ならStopし、スクリプトを保存してからPlay相当のテスト(現行UIではTest、F5)で入り直します。Test Hereはカメラ付近から始まるため、最初の出現位置の確認には使いません。キャラクターを作らないRunでも確認できません。
- スタート地点から青いCheckpointSpawnまで歩き、直接その上に乗ります。
- OutputでServer側のメッセージが見えるようにし、自分の名前を含む到達ログが出ることを確認します。立ち続けても同じログが増え続けないことも確認します。
- テスト中のキャラクターをリセットし、標準の復活待ち時間の後、CheckpointSpawnから復活することを確認します。
- StartSpawnへ戻ってからもう一度リセットします。この例ではスタート地点に触れる処理を登録していないので、復活先はチェックポイントのままです。
4. 2人の復活先を比べる
1人テストをStopしてから、StudioのテストモードでServer & Clientsを選び、クライアント数を2にして開始します。同じローカルサーバーへ2人が接続した状態で、片方だけが青い地点へ移動し、それぞれのキャラクターをリセットして確認します。別々に1人テストを2回起動しても、同じサーバーでの比較にはなりません。テストモードの公式資料
| プレイヤー | 青い地点への到達 | 次の復活先 |
|---|---|---|
| A | 到達済み | CheckpointSpawn |
| B | 未到達 | StartSpawn |
| B | その後に到達 | CheckpointSpawn |
この例は床の色をプレイヤー別には変更しません。青い床は常に青いままで、到達の確認はOutputと実際の復活位置で行います。
プロパティも見る場合は、テストのServer側でExplorerのPlayersを開き、各PlayerのRespawnLocationを確認します。AはCheckpointSpawn、未到達のBはStartSpawnというように、値が別々になっていることを確かめます。
うまく動かないとき
- WaitForChildの警告が出る:Workspace直下の名前が
StartSpawn・CheckpointSpawnと完全一致するか確認します。 - 触れてもログが出ない:CanTouchがオンか、床の装飾ではなくSpawnLocation本体へ歩いて接触しているか確認します。Touchedは物理的な接触を使うので、位置をコードで重ねるだけの確認とは分けます。BasePart.Touchedの公式資料
- 違う場所へ復活する:EnabledとNeutralを確認し、ほかのスクリプトがRespawnLocationやキャラクター生成を変更していないか調べます。
- スタート地点から始まらない:配置とScriptを編集した後にStopしてPlayをやり直します。動作中にScriptを追加した場合、すでに出現しているキャラクターの位置は変わりません。
この例の記録範囲
復活先は今回のプレイ中だけの記録です。退出後や新しいテストの開始後まで到達状態を残すには、DataStoreなどを使う別の保存設計が必要です。また、不正な移動を判定する仕組みや、複数チェックポイントの順番制御は含めていません。
床の設定が不安ならPartとAnchoredの基本、プレイヤーごとの値を表示したい場合はleaderstatsの基本へ進めます。
この記事のまとめ
Roblox StudioでSpawnLocationとサーバーのScriptを使い、プレイヤーごとに復活地点を記録します。配置・接触判定・多重通知の防止・2人での確認を図とコードで解説します。