STEP 05

初心者編 5 / 9

途中から再開しよう:チェックポイントを作る

2つのSpawnLocationと短いLuauコードを使い、溶岩で失敗しても最後に触れたチェックポイントから再開できるようにしよう。

公開日
3ステージのアスレチックに2つの水色のチェックポイントを置いた完成画面

前の記事では、コースから落ちると溶岩で倒れ、開始地点へ戻る仕組みを作った。長いコースで毎回最初からやり直すのは大変だ。Stage 1とStage 2の終点へ水色のチェックポイントを置き、最後に通った場所から再開できるようにしよう。

Stage 1とStage 2の終点に水色のチェックポイントを置いたコース

チェックポイントには、RobloxにもともとあるSpawnLocationを使う。公式のSpawnLocationは、キャラクターを出現させる場所だ。今回は「最初に出る場所」と「失敗後に戻る場所」をScriptで分ける。

最初の出現地点を固定する

チェックポイント用のSpawnLocationを増やすと、最初から途中の地点へ出ることがある。元のSpawnLocationへScriptを追加し、名前をStartAtBeginningに変えよう。最初から入っているコードを消し、次を貼り付ける。

local Players = game:GetService("Players")
local startSpawn = script.Parent

local function setStart(player)
	player.RespawnLocation = startSpawn
end

Players.PlayerAdded:Connect(setStart)

for _, player in Players:GetPlayers() do
	if player.RespawnLocation == nil then
		setStart(player)
	end
end

元のSpawnLocationに入れたStartAtBeginningのコード

Tip:Robloxの「サービス」とは

サービスは、ゲーム全体で使う機能や情報をRobloxがまとめて用意したものだ。game:GetService("Players")は、参加しているPlayerの一覧や、新しい参加を知らせる合図を持つPlayersサービスを受け取る。たとえば2人で遊んでいるなら、Playersから2人分のPlayerを扱える。

PlayerAddedは新しい参加者が入った合図で、setStartへそのPlayerを渡す。最後のforは、Playを押した直後など、Scriptが動き始めた時点ですでにいるPlayerも確認する処理だ。

上から順に読むと、最初の2行は使うものへ短い名前を付けている。Playersは参加者の一覧、startSpawnはこのScriptを中に持つ元のSpawnLocationだ。setStart(player)が呼ばれると、受け取ったPlayerの再出発地点をstartSpawnへ変える。新しく入った人にはPlayerAddedから実行し、すでにいる人には最後の繰り返しから実行する。どちらも同じsetStartを使うので、開始地点をあとで変えたくなっても直す場所は1か所で済む。

player.RespawnLocation == nilは、まだ再出発地点が決まっていないかを確かめる条件だ。チェックポイントを通過したPlayerにはすでに場所が入っているため、あとからこの確認が動いても、水色の地点を開始地点で上書きしない。

Tip:Playerとキャラクターは別のもの

Playerは参加者ごとの記録を持つもの、キャラクターは3D世界で歩いたり倒れたりする体だ。2人で遊べばPlayerは2つあり、それぞれが自分のキャラクターを持つ。RespawnLocationはPlayer側へ覚えさせるため、2人のチェックポイントが混ざらない。

Checkpoint1を作る

Explorerで元のSpawnLocationを選び、⌘D(WindowsはCtrl+D)で複製する。名前をCheckpoint1へ変え、Stage 1の最後に置こう。Propertiesは次の値にする。

  • Position: 3, 4.75, -35
  • Size: 6, 0.5, 5
  • Anchored: オン
  • Enabled: オン
  • Neutral: オン
  • Duration: 0
  • Material: Neon
  • Color: 水色

Checkpoint1のEnabled、Neutral、Anchoredを示したProperties

Enabledがオンなら再出現地点として使える。NeutralがオンならTeamに関係なく使える。今回はTeamを作らないが、複製元と同じくオンにしておこう。Duration0にすると、出現したときの保護バリアを表示しない。

水色とNeonは、触れる場所をプレイヤーがすぐ見つけるための見た目だ。色そのものがScriptを動かすわけではない。チェックポイントの面を足場より少し上へ出すと、キャラクターの足が確実に触れ、通常の足場と区別もしやすい。Play中に段差へ引っ掛かる場合は、Y座標を大きく変えず、厚さを0.5へ戻そう。

触れたPlayerの再出現地点を変える

Checkpoint1の子へScriptを追加し、名前をSetCheckpointへ変える。次のコードを貼り付けよう。

local Players = game:GetService("Players")
local checkpoint = script.Parent

local function setCheckpoint(otherPart)
	local character = otherPart.Parent
	local player = Players:GetPlayerFromCharacter(character)
	if player then
		player.RespawnLocation = checkpoint
	end
end

checkpoint.Touched:Connect(setCheckpoint)

Checkpoint1へ入れたSetCheckpointのコード

Touched、関数、otherPart溶岩の記事と同じ仕組みだ。違うのは、体力を0にする代わりに、触れた体からPlayerを探すところだ。

otherPart.Parentでキャラクター全体を取り出し、公式のPlayers.GetPlayerFromCharacter()で、その体を動かしているPlayerを探す。体以外のPartが触れた場合はPlayerが見つからずnilになる。if player thenは、Playerが見つかったときだけ次へ進む確認だ。

player.RespawnLocation = checkpointが「次はここから再出発する」と覚える行だ。公式のPlayer.RespawnLocationのように、Workspace内の有効なSpawnLocationを設定できる。

このScriptは、水色の面へ触れるたびに同じ場所をもう一度設定しても問題ない。キャラクターは手や足など複数のPartでできているため、Touchedが短時間に何度か起きる場合がある。それでも最後に代入される値は同じCheckpoint1だ。特別な回数制限や待ち時間を追加しなくても、今回の目的には十分だ。

Checkpoint2を複製する

ExplorerでCheckpoint1を選び、もう一度複製する。Scriptも一緒に複製されるので、名前をCheckpoint2へ変え、Positionを-4, 5.75, -62にしてStage 2の最後へ置こう。

Checkpoint1とCheckpoint2の中にSetCheckpointがあるExplorer

Explorerで、Checkpoint1Checkpoint2の両方にSetCheckpointが1つずつ入っていれば準備完了だ。

複製したScriptのscript.Parentは、複製後の親であるCheckpoint2を指す。同じコードを書き直さなくても、Checkpoint1の中ではCheckpoint1、Checkpoint2の中ではCheckpoint2がcheckpointになる。ここがscript.Parentを使う利点だ。もしCheckpoint2を別の名前へ変えても、親子関係が同じならコードはそのまま動く。

Playして途中から戻れるか確認する

Playを押し、次の順で試そう。

  1. Checkpoint1の手前から水色の面へ歩いて乗る
  2. コースの横へ歩き、LavaFloorへ落ちる
  3. 倒れたあと、Checkpoint1へ戻ることを確認する
  4. Checkpoint2まで進み、同じように落ちてCheckpoint2へ戻ることを確認する

Checkpoint1へ歩いて触れ、溶岩で倒れたあとCheckpoint1から再出現するPlayテスト

Checkpoint1から再出現したキャラクター

最初の水色面へ触れる前に溶岩へ落ちたときは、元のSpawnLocationへ戻れば正しい。Studioの複数クライアントテストでも、2人が別々のチェックポイントを持ち、片方の通過がもう片方へ影響しないことを確認できる。通常の記事どおり1人で作るときは、上の4手順だけで十分だ。

確認は「まだ触れていない」「Checkpoint1だけ触れた」「Checkpoint2まで触れた」の3通りに分けると原因を見つけやすい。最初の確認で途中へ出たらStartAtBeginning、Checkpoint1だけ失敗するならその子のSetCheckpoint、両方とも開始地点へ戻るなら共通のコードやEnabledを見直そう。Checkpoint2だけ失敗するときは、複製後に名前だけでなくPositionを変えたか、ExplorerでScriptまで一緒に複製されたかを確認する。

動かないときの確認順

  1. 元のSpawnLocationStartAtBeginningがあるか確認する
  2. 2つのチェックポイントでEnabled、Neutral、Anchoredがオンか確認する
  3. それぞれの子にSetCheckpointがあるか確認する
  4. GetPlayerFromCharacterRespawnLocationの大文字・小文字を見直す
  5. WindowからOutputを開き、赤いエラーの行番号を見る

水色面に乗ったのに開始地点へ戻る場合は、キャラクターの足がCheckpointへ触れたかを確認しよう。面が小さすぎると飛び越えるため、Sizeを6, 0.5, 5へ戻す。

ここまでの完成チェック

  • 最初はStartIslandのSpawnLocationから始まる
  • Checkpoint1通過後はCheckpoint1から再開する
  • Checkpoint2通過後はCheckpoint2から再開する
  • 2つの中にSetCheckpointが1つずつある
  • 普通の足場へ触れても再出現地点は変わらない

これで、失敗しても途中から再挑戦できるようになった。次は黄色い仮ゴールへ大きなGOAL表示を付け、スタートから最後まで通して遊べるアスレチックへ完成させよう。

前の記事: 触れるとやり直し:溶岩の床をLuauで作る

次の記事: ゴールを作って完成:アスレチックを通しテストする

この記事で参照した公式情報