このプロジェクトは、forループを実用的に使用する別の例です。このブリッジでは、プレイヤーがボタンに触れると、制限時間内に歩行可能なブリッジが作成され、その後消えます。タイマーを作成し、プレイヤーに残り時間を表示するために、forループを使用します。
プロジェクトのセットアップ
このブリッジは、オビーのような動きに基づく挑戦を含む任意のゲームプロジェクトに組み込むことができます。
パーツを作成する
ブリッジを構築する場所を見つけます。川やオビーの大きなギャップなどです。以下のように3つのアンカー付きパーツを作成してください。
- TimerDisplay
- Bridge
- ButtonBridge
非アクティブなとき、ブリッジは半透明になります。これを実現するには、Bridgeを選択し、そのプロパティを変更します。
- Transparency = 0.8
- CanCollide = False
タイマーディスプレイを作成する
プレイヤーがブリッジを渡るとき、ブリッジが消える前に残りの秒数を知る必要があります。画像やテキストを表示する方法の1つは、パーツにSurface GUIと呼ばれるオブジェクトを追加することです。Surface GUIは、ゲーム内サイン、カスタムヘルスバー、インベントリシステムを作成するためにも使用できます。このチュートリアルではこれを迅速に進めますが、Tutorialsセクションでさらに情報が得られます。
TimerDisplayを選択し、SurfaceGuiを追加します。次に、Surface Guiに親子関係を持たせてTextLabelを追加します。
Surface GUIを選択します。プロパティで以下の変更を行います。
- Faceを変更して、プレイヤーが見ているタイマーの前面にテキストラベルが表示されるようにします。
TextLabelを選択します。プロパティで以下の変更を行います:
- Sizeを{1, 0},{1, 0}に設定します。
- TextScaledをtrueに設定します。
- Textを空白に設定します。テキストはスクリプトを使用して更新されます。
スクリプトのセットアップ
タイマーが設置されたので、ブリッジを制御し、カウントダウン番号をプレイヤーに表示するスクリプトを作成します。
Bridgeパーツの中に、新しいスクリプトをTimedeBridgeという名前で追加します。そのスクリプトの中に、以下の変数を作成します。
local bridge = script.Parentlocal button = workspace.ButtonBridgelocal timerText = workspace.TimerDisplay.SurfaceGui.TextLabel-- ブリッジが固体として維持される時間local timerDuration = 5
タッチインタラクションをコード化する
ブリッジを使用するには、2つの関数を作成する必要があります。1つの関数はブリッジを歩行可能にし、タイマーを表示します。もう1つの関数は、プレイヤーがブリッジをアクティブにするボタンに触れたかどうかをリスニングします。
startTimer()という新しい関数を作成し、その中にプリントステートメントを入れます。コードのテストにプリントステートメントを使用します。
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)プロジェクトを実行します。パーツに触れ、出力ウィンドウでプリントステートメントを確認します。
トラブルシューティングのヒント
この時点で、ブリッジが意図した通りに動作しない場合は、以下のいずれかを試してください。
問題:エラーメッセージが表示されます:"...はworkspaceの有効なメンバーではありません"。
- TimedBridgeスクリプトで、すべてのパーツのスペルがExplorerで見える通りに正確であることを確認してください。
問題:パーツが見えない。
- すべての3つのパーツが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ループが1回の反復を通過する際に、プレイヤーにタイマーの次の数字が表示されます。
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()endendタイマーが切れる前に再度startTimer()が実行されないように、ブール値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ブリッジをリセットするときの最後の1つのことは、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ループを使用してタイミングブリッジを作成します。カウントダウン中、プレイヤーには早く渡るための制限時間が与えられます。