このプロジェクトは、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つの関数を作成する必要があります。1つの関数は橋を歩行可能にし、タイマーを表示します。もう1つの関数は、プレイヤーが橋をアクティブにするボタンに触れたかどうかを確認します。
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)プロジェクトを実行します。パーツに触れて、Outputウィンドウでprint文を確認します。
トラブルシューティングのヒント
この時点で、橋が意図した通りに機能しない場合は、以下のいずれかを試してください。
問題: "...はworkspaceの有効なメンバーではありません"というエラーメッセージ。
- TimedBridgeスクリプトで、すべてのパーツがExplorerに表示されている通りに正確にスペルされているか確認します。
問題: パーツが見えない。
- すべてのパーツが固定されていることを確認します。
- 橋の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 = countendforループが1秒ごとに実行されるように、task.wait関数を使用します。
for count = timerDuration, 0, -1 dotimerText.Text = counttask.wait(1)endゲームを実行します。ボタンに触れると、橋が表示され、タイマーが開始され、完了します。
橋が再起動しないようにする
ただし、ボタンの上で動き回ると、タイマーが再起動し続けることに注意してください。
これは、ボタンに触れるたびにforループが呼び出され、forループが最初から始まるためです。タイマーが常に再起動しないようにするには、startTimer()が再度呼び出されるかどうかを制御するブール値を追加する必要があります。
ブール値は、他の変数と同じように書かれますが、数字や文字列の代わりにtrueまたはfalseに設定できます。この状況では、スクリプトはタイマーが現在実行中かどうかを確認するためにブール値を使用します。
スクリプトの最上部で、変数の下にtimerActiveという名前の変数を作成し、ボタンがまだ押されていないため、falseに設定します。
local timerDuration = 5local timerActive = falselocal function startTimer()タイマーがtimerActiveブール値がfalseのときのみ開始されるように、buttonPressed()のif文に2つ目の条件を追加します。
local function buttonPressed(otherPart)local character = otherPart.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid and timerActive == false thenstartTimer()endendstartTimer()がタイマーが切れる前に再度実行されないように、ブール値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ブール値を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ループを使用してタイミングブリッジを作成しました。カウントダウン中、プレイヤーは渡るための限られた時間が与えられます。