このプロジェクトは、forループを実用的に使用する別の例です。この橋では、プレイヤーがボタンに触れると、橋が限られた時間だけ歩行可能になり、その後消えます。タイマーを作成し、プレイヤーに残り時間を表示するために、forループを使用します。
プロジェクトのセットアップ
この橋は、オビーのような移動ベースのチャレンジを持つ任意のRobloxプロジェクトに含めることができます。
パーツの作成
橋を作る場所を見つけてください。川やオビーの大きなギャップなどです。以下のように3つの固定パーツを作成します。
- TimerDisplay
- Bridge
- ButtonBridge

非アクティブな状態のとき、橋は半透明になります。そのために、Bridgeを選択してそのプロパティを変更します。
- Transparency = 0.8
- CanCollide = False
タイマーディスプレイの作成
橋を渡る際、プレイヤーは橋が消える前にあと何秒残っているかを確認する必要があります。画像やテキストを表示する一つの方法は、パーツにSurface GUIと呼ばれるオブジェクトを追加することです。Surface GUIは、ゲーム内のサイン、カスタムヘルスバー、インベントリシステムを作成するためにも使用できます。このチュートリアルではこれを迅速に進めますが、詳細はチュートリアルセクションにあります。
TimerDisplayを選択し、SurfaceGuiを追加します。次に、Surface Guiに親を持つTextLabelを追加します。

Surface GUIを選択します。プロパティで次の変更を行います:
- Faceを変更して、プレイヤーが見ているタイマーの前面にテキストラベルが表示されるようにします。
TextLabelを選択します。プロパティで、次の変更を行います:
- Sizeを{1, 0},{1, 0}に設定します。
- TextScaledをtrueに設定します。
- Textを空白に設定します。テキストはスクリプトを使用して更新されます。
スクリプトのセットアップ
タイマーが配置されたので、橋を制御し、プレイヤーにカウントダウン番号を表示するスクリプトを作成します。
Bridgeパーツに、TimedBridgeという新しいスクリプトを追加します。そのスクリプト内で、次の変数を作成します。
local bridge = script.Parentlocal button = workspace.ButtonBridgelocal timerText = workspace.TimerDisplay.SurfaceGui.TextLabel-- 橋が固体である時間local timerDuration = 5
タッチインタラクションのコーディング
橋を使用するには、2つの関数を作成する必要があります。一つの関数は、橋を歩行可能にし、タイマーを表示します。もう一つの関数は、橋をアクティブにするボタンにプレイヤーが触れたかどうかを確認します。
startTimer()という名前の新しい関数を作成し、内部にprint文を含めます。このprint文は、コードをテストするために使用します。
local timerDuration = 5local function startTimer()print("カウントダウン開始")endbuttonPressed()という名前の関数をコーディングして、ヒューマノイドがボタンに触れるかどうかを確認します。この関数はpartTouchedというパラメータを受け入れ、そのパーツ内にヒューマノイドが検出された場合には空のif文を持ちます。
local function startTimer()print("カウントダウン開始")endlocal function buttonPressed(partTouched)local character = partTouched.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenendendタイマーを開始するために、if文内でstartTimer()関数を呼び出します。
local function buttonPressed(otherPart)local character = otherPart.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenstartTimer()endendbuttonPressed()の終わりの下で、ボタンのTouchedイベントにbuttonPressed()関数を接続します。
local function buttonPressed(otherPart)local character = otherPart.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenstartTimer()endendbutton.Touched:Connect(buttonPressed)プロジェクトを実行します。パーツに触れ、出力ウィンドウでprint文を確認します。
トラブルシューティングのヒント
この時点で、橋が意図した通りに機能しない場合は、以下のいずれかを試してください。
問題:エラーメッセージが表示されます:"...はworkspaceの有効なメンバーではありません"。
- TimedBridgeスクリプト内で、すべてのパーツがExplorerで見える通りに正確にスペルされているか確認します。
問題:パーツが見えない。
- すべてのパーツがAnchoredになっていることを確認してください。
- 橋のTransparencyプロパティを確認してください。
タイマーを作成する
プレイヤーが橋に踏み込むたびに、startTimer()が橋を歩行可能にし、タイマーを開始します。タイマーが0に達すると、橋は歩行不可になり、十分に早くない人は落ちてしまいます。
橋を歩行可能にする
最初に、スクリプトは橋を固体または衝突可能にし、その後歩行不可になるまでタイマーを開始する必要があります。
橋を歩行可能にするために、startTimer()内で橋のTransparencyプロパティを0(不透明)に、CanCollideプロパティをtrueに変更します。
local function startTimer()-- 橋を表示可能かつ歩行可能にするbridge.Transparency = 0bridge.CanCollide = trueendカウントダウンするタイマーを作成するために、次の値を持つforループを作成します。
- 制御変数:countという名前にし、timerDurationに設定します。
- 終了:0
- インクリメント:-1
local function startTimer()-- 橋を表示可能かつ歩行可能にするbridge.Transparency = 0bridge.CanCollide = truefor count = timerDuration, 0, -1 doendendプレイヤーにタイマーを表示するために、timerTextのテキストをcountを表示するように変更します。forループがイテレーションを通過するたびに、プレイヤーにタイマーの次の数字が表示されます。
for count = timerDuration, 0, -1 dotimerText.Text = countendtask.wait関数を使用して、forループが1秒に1回のみ実行されるようにします。
for count = timerDuration, 0, -1 dotimerText.Text = counttask.wait(1)end経験を実行します。ボタンに触れると、橋が表示され、タイマーが開始され、完了します。
橋が再起動するのを防ぐ
ただし、ボタンの上で動き回ると、タイマーが再び始まります。
これは、ボタンに触れるたびにforループが呼び出され、forループが最初から開始されるためです。タイマーが常に再起動しないようにするには、boolean型の変数を追加し、startTimer()が再び呼び出されることができるかどうかを制御する必要があります。
Booleanは、他の変数と同様に書かれますが、数字や文字列の代わりにtrueまたはfalseにのみ設定できます。この状況では、スクリプトはタイマーが現在実行中かどうかを確認するためにbooleanを使用します。
スクリプトの最上部、変数の下に、timerActiveという名前の変数を作成し、ボタンが押されていないのでfalseに設定します。
local timerDuration = 5local timerActive = falselocal function startTimer()buttonPressed()のif文に、timerActiveがfalseの場合にのみタイマーが開始されるようにするために、2つ目の条件を追加します。
local function buttonPressed(otherPart)local character = otherPart.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid and timerActive == false thenstartTimer()endendタイマーがタイマーの終了前に再度実行されないようにするために、boolean timerActiveをtrueに設定します。
local function startTimer()timerActive = truebridge.Transparency = 0bridge.CanCollide = truestartTimer()関数内で、forループの後に橋を元のプロパティに戻すために、橋の透明度を0.8に、CanCollideをfalseに変更します。
local function startTimer()timerActive = truebridge.Transparency = 0bridge.CanCollide = true-- timerDurationからカウントダウンするforループfor count = timerDuration, 0, -1 dotimerText.Text = counttask.wait(1)end-- 橋を歩行不可にするbridge.Transparency = 0.8bridge.CanCollide = falseend橋をリセットするための最後の作業は、timerTextを元のように空の文字列に変更し、timerActive booleanをfalseに設定することです。
bridge.Transparency = 0.8bridge.CanCollide = falsetimerText.Text = ""timerActive = falseプレイテストを行い、橋が複数回使用できることを確認します。
完成したタイムドブリッジスクリプト
local bridge = script.Parent
-- Explorerに表示されているようにボタンを取得
local button = workspace.ButtonBridge
-- ディスプレイ用のパーツを取得
local timerPart = workspace.TimerDisplay
-- タイマーを表示するテキストを取得
local timerText = timerPart.SurfaceGui.TextLabel
-- プレイヤーが橋を渡るための時間
local timerDuration = 5
local timerActive = false
local function startTimer()
print("カウントダウン開始")
timerActive = true
bridge.Transparency = 0
bridge.CanCollide = true
-- timerDurationからカウントダウンするforループ
for count = timerDuration, 0, -1 do
timerText.Text = count
task.wait(1)
end
-- 橋を歩行不可にする
bridge.Transparency = 0.8
bridge.CanCollide = false
timerText.Text = ""
timerActive = false
end
local function buttonPressed(partTouched)
local character = partTouched.Parent
local humanoid = character:FindFirstChildWhichIsA("Humanoid")
print("パーツが触れられました")
if humanoid and timerActive == false then
print("タイマーを開始します")
startTimer()
end
end
button.Touched:Connect(buttonPressed)
まとめ
ループは、さまざまな対話手段と組み合わせることで、楽しいゲームプレイの瞬間を作り出すことができます。このチュートリアルでは、カウントダウンとして機能するforループを使用して、時間制限のある橋を作成しました。カウントダウン中、プレイヤーは制限時間内に橋を渡る機会を与えられます。