この橋は、ボタンを押すと出現します。一定の時間が経過すると橋は消滅します。残り時間を知らせるタイマーを作成するためにforループを使用します。
橋とタイマーを作成する
橋パーツを作成する
- 川や大きな谷など、橋をかける場所があるテンプレートを見つけます。Village というテンプレートがお勧めですが、ご自分で作成しても構いません。
- 以下のようなパーツを3つ作成し、それぞれ、TimerDisplay、Bridge、ButtonBridge という名前にしてください。
- Bridge を選択し、下記のプロパティを変更します。
- Transparency(透過度)を 0.8 にする
- CanCollide を OFF にする (通り抜ける)
- 3つのパーツをすべて Anchor(固定) にします。固定されていないと、橋は正常に機能しません。
Surface GUIを作成する
プレイヤーが橋を渡るとき、あと何秒で橋が消えるか分かるような表示を作る必要があります。画像やテキストを表示する方法のひとつとして、パーツに Surface GUI というオブジェクトを追加する方法があります。Surface GUIでは、ゲーム内の標識、カスタムHPバー、インベントリシステムなどを作ることもできます。
- TimerDisplay を選択し、Surface GUIを追加します。
- 追加した SurfaceGui に TextLabel を追加します。
現時点では TextLabel を見ることができないかもしれません。これは、文字が非常に小さかったり、タイマーディスプレイの反対側に位置していたりするためです。プレイヤーがタイマーを見やすいように、Surface GUIが表示される面を変更したり、Surface GUIをもっと大きくする必要があります。
Surface GUIを修正する
- SurfaceGUI を選択します。プロパティーで Face を探し、ドロップダウンメニューから、SurfaceGUI が表示される面(Labelという文字が見えるところ)に変更します。橋を渡るプレイヤーが見える面に表示されていれば完了です。
- Sizing の SizingMode を FixedSize に設定すると、CanvasSize という項目が表示されます。
- CanvasSize の X と Y を 100 に変更してください。
Text Labelの大きさを変える
文字の大きさを調整します。
- TextLabel を選択します。
- Sizeプロパティーを下記のように展開します。さらに X と Y を展開します。
- X と Y の両方で、Scaleを1に、Offset を0に変更します。これにより、TextLabelはパーツの面と同じ大きさになります。
- 下にスクロールし、TextScaled にチェックを入れます。これにより、テキストは自動的にSurface GUIに合わせられます。
- Text プロパティの「Label」という文字を削除し空白します。これにより何も表示されなくなります。スクリプトを使用して、ここにタイマーを表示させます。
スクリプトをセットアップする
タイマーの準備が出来たところで、次にスクリプトを使って TimerDisplay を制御し、カウントダウンを表示するプログラムを作成します。
Timer Scriptを作成する
- Bridge に TimedBridge という名前のスクリプトを作成します。
- TimedBridge で2つの変数を作成し、橋とボタンのオブジェクトを格納します。
local bridge = script.Parent
local button = game.Workspace.ButtonBridge
- TimerDisplay とタイマーの数字を表示する timerText の2つの変数を作成します。
-- 表示用のパーツ
local timerPart = game.Workspace.TimerDisplay
-- タイマーを表示するTextLabel
local timerText = timerPart.SurfaceGui.TextLabel
- タイマーを表す数字の変数を作成し、残り時間を秒単位で表します。このスクリプトでは5を使用していますが、プレイヤーが橋を渡りきるのに十分な時間となるように調整してください。
local bridge = script.Parent
local button = game.Workspace.ButtonBridge
local timerPart = game.Workspace.TimerDisplay
local timerText = timerPart.SurfaceGui.TextLabel
local timerDuration = 5
関数とイベントの設定
橋を使用するために2つの関数を作成する必要があります。1つは橋を渡れるようにしタイマーを表示するもので、もう1つは、プレイヤーが橋を渡れるようにするボタンを押したことを感知するものです。
- startTimer() という名前のprint文を含む関数を作成します。print文はコードのテストに使用します。
local timerDuration = 5
local function startTimer()
print("Countdown started")
end
- buttonPressed() という名前の関数を作成し、Humanoid がボタンにタッチしたかを確認します。
local bridge = script.Parent
local button = game.Workspace.ButtonBridge
local timerPart = game.Workspace.TimerDisplay
local timerText = timerPart.SurfaceGui.TextLabel
local timerDuration = 5
local function startTimer()
print("Countdown started")
end
local function buttonPressed(partTouched)
local character = partTouched.Parent
local humanoid = character:FindFirstChildWhichIsA("Humanoid")
if humanoid then
end
end
- タイマーをスタートさせるには、if humanoid 文で startTimer() 関数を呼び出します。
local function buttonPressed(otherPart)
local character = otherPart.Parent
local humanoid = character:FindFirstChildWhichIsA("Humanoid")
if humanoid then
startTimer()
end
end
buttonPressed()
のendの下で、buttonPressed()
関数をボタンのTouchedイベントに紐づけます。
local function buttonPressed(otherPart)
local character = otherPart.Parent
local humanoid = character:FindFirstChildWhichIsA("Humanoid")
if humanoid then
startTimer()
end
end
button.Touched:Connect(buttonPressed)
- ゲームを実行します。ButtonBridge に触れるとOutputウィンドウに「Countdown started」というメッセージが表示されるはずです。
問題解決のヒント
・”… is not a valid member of workspace” というエラーメッセージが表示された場合、TimedBridge スクリプトで、すべてのパーツがExplorerの表示と同じスペルになっていることを確認します。
・パーツが表示されない場合は、3つのパーツすべてがAnker固定されていることを確認します。
タイマーを作成する
プレイヤーが橋に入ると、startTimer() が橋を渡れるようにし、タイマーを開始します。タイマーが0になると、橋は渡れなくなります。それまでに橋を渡りきれなかったプレイヤーは落下します。
橋を渡れるようにする
- 橋を渡れるようにするには、startTimer() で橋の Transparency(透過度)を0(不透明)にし、CanCollide を true (通り抜け不可)に変更します。
local function startTimer()
-- 橋を可視化し歩けるようにする
bridge.Transparency = 0
bridge.CanCollide = true
end
- カウントダウンするタイマーを作成するには、次の値のforループを作成します。
- 制御変数:名前は count とし、timerDuration にセットします。
- 終了値:0
- 増加値:-1
local function startTimer()
-- 橋を可視化し歩けるようにする
bridge.Transparency = 0
bridge.CanCollide = true
for count = timerDuration, 0, -1 do
end
end
- TimerDisplay にカウントダウンの数字を表示するためには、timerText の Text を変更します。timerText.Text = count と入力することで、count が表示されます。ループが繰り返されるたびに、タイマーの次の数字が TimerDisplay に表示されます。
local function startTimer()
-- 橋を可視化し歩けるようにする
bridge.Transparency = 0
bridge.CanCollide = true
for count = timerDuration, 0, -1 do
timerText.Text = count
end
end
- wait関数を使用して、ループが1秒に1回実行されるようにします。
local function startTimer()
-- 橋を可視化し歩けるようにする
bridge.Transparency = 0
bridge.CanCollide = true
for count = timerDuration, 0, -1 do
timerText.Text = count
wait(1)
end
end
- ゲームを実行します。ボタンに触ると橋が現れタイマーがスタートします。ボタンの上を歩くとまたタイマーが再スタートされます。これは、ボタンに触れるたびにforループが呼び出され、ループが最初から開始されるためです。次のセクションでは、この問題を修正します。
橋が再スタートしないようにする
タイマーが何度も再スタートするのは困るので、startTimer() が再度呼び出されないように工夫する必要があります。startTimer() が実行中だった場合は、呼び出さなければ良いわけです。それを実現するには、ブーリアン型の変数を1つ追加して、その値によって実行するかどうかを判断します。ブーリアン型の変数は、数字や文字列は使用されません。代わりに true または false のみが設定できます。
ここでは、タイマーを開始させる前にすでに動いているかを確認するために、スクリプトでブーリアンを使用します。
- スクリプト上部の変数の下に、timerActive という名前の変数を作成します。まだボタンは押されていないので、false に設定します。
local timerDuration = 5
local timerActive = false
local function startTimer()
- startTimer() は timerActive が false の場合のみ開始するようにするために、buttonPressed() の if文に第2の条件を追加します。
local function buttonPressed(otherPart)
local character = otherPart.Parent
local humanoid = character:FindFirstChildWhichIsA("Humanoid")
if humanoid and timerActive == false then
startTimer()
end
end
- タイマーが終了する前に startTimer() が再スタートするのを防ぐため、timerActive 変数 を true に設定します。
local function startTimer()
timerActive = true
bridge.Transparency = 0
bridge.CanCollide = true
- テストプレイを行い、タイマーが再スタートしないことを確認します。タイマーは再スタートしなくなりましたが、一度しか使用できなくなってしまいました。繰り返し使用できるようにするために、次のセクションではブーリアンのリセットを行います。
問題解決のヒント
タイマーの数字がカウントダウンされずに変化する場合:
・buttonPressed の if文に2つ目の条件が追加されていることを確認します。
・startTimer() の最初で、timerActive が true に設定されていることを確認します。
タイマーをリセットする
スクリプトを完成させるには、ブーリアンおよび橋のプロパティをゲームスタート時の状態に戻し、繰り返し使用できるようする必要があります。
- startTimer() 関数で、Forループの後、Transparency(透過度)を 0.8 に、CanCollide を false に変更し、橋のプロパティ設定を元に戻します。
local function startTimer()
print("Countdown started")
timerActive = true
bridge.Transparency = 0
bridge.CanCollide = true
-- timerDurationを開始値としカウントダウン
for count = timerDuration, 0, -1 do
timerText.Text = count
wait(1)
end
-- 橋の上を歩けないようにする
bridge.Transparency = 0.8
bridge.CanCollide = false
end
- 現在、timerText は 0 のままです。空白に戻すには timerText に空の文字列に入れる必要があります。
bridge.Transparency = 0.8
bridge.CanCollide = false
timerText.Text = ""
- タイマーは完成しているので、timerActive 変数を false に設定します。これにより、次にボタンに触るとタイマーが再スタートできるようになります。
bridge.Transparency = 0.8
bridge.CanCollide = false
timerText.Text = ""
timerActive = false
- テストプレイし、橋が繰り返し渡れることを確認します。
完成したスクリプト
local bridge = script.Parent
-- ボタン
local button = game.Workspace.ButtonBridge
-- 表示用のパーツ
local timerPart = game.Workspace.TimerDisplay
-- Gets the Text that will display the timer
local timerText = timerPart.SurfaceGui.TextLabel
-- 橋の上を歩ける時間
local timerDuration = 5
local timerActive = false
local function startTimer()
print("Countdown started")
timerActive = true
bridge.Transparency = 0
bridge.CanCollide = true
-- timerDurationを開始値としカウントダウン
for count = timerDuration, 0, -1 do
timerText.Text = count
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("part touched")
if humanoid and timerActive == false then
print("starting timer")
startTimer()
end
end
button.Touched:Connect(buttonPressed)