【11】時間制限付きの橋を作成する

この橋は、ボタンを押すと出現します。一定の時間が経過すると橋は消滅します。残り時間を知らせるタイマーを作成するためにforループを使用します。

橋とタイマーを作成する

橋パーツを作成する

  1. 川や大きな谷など、橋をかける場所があるテンプレートを見つけます。Village というテンプレートがお勧めですが、ご自分で作成しても構いません。
  2. 以下のようなパーツを3つ作成し、それぞれ、TimerDisplayBridgeButtonBridge という名前にしてください。
  1. Bridge を選択し、下記のプロパティを変更します。
  • Transparency(透過度)を 0.8 にする
  • CanCollideOFF にする (通り抜ける)
  1. 3つのパーツをすべて Anchor(固定) にします。固定されていないと、橋は正常に機能しません。

Surface GUIを作成する

プレイヤーが橋を渡るとき、あと何秒で橋が消えるか分かるような表示を作る必要があります。画像やテキストを表示する方法のひとつとして、パーツに Surface GUI というオブジェクトを追加する方法があります。Surface GUIでは、ゲーム内の標識、カスタムHPバー、インベントリシステムなどを作ることもできます。

  1. TimerDisplay を選択し、Surface GUIを追加します。
  1. 追加した SurfaceGuiTextLabel を追加します。

現時点では TextLabel を見ることができないかもしれません。これは、文字が非常に小さかったり、タイマーディスプレイの反対側に位置していたりするためです。プレイヤーがタイマーを見やすいように、Surface GUIが表示される面を変更したり、Surface GUIをもっと大きくする必要があります。

Surface GUIを修正する

  1. SurfaceGUI を選択します。プロパティーで Face を探し、ドロップダウンメニューから、SurfaceGUI が表示される面(Labelという文字が見えるところ)に変更します。橋を渡るプレイヤーが見える面に表示されていれば完了です。
  1. SizingSizingModeFixedSize に設定すると、CanvasSize という項目が表示されます。
  2. CanvasSizeXY100 に変更してください。

Text Labelの大きさを変える

文字の大きさを調整します。

  1. TextLabel を選択します。
  2. Sizeプロパティーを下記のように展開します。さらに XY を展開します。
  1. XY の両方で、Scaleに、Offsetに変更します。これにより、TextLabelはパーツの面と同じ大きさになります。
  1. 下にスクロールし、TextScaled にチェックを入れます。これにより、テキストは自動的にSurface GUIに合わせられます。
  1. Text プロパティの「Label」という文字を削除し空白します。これにより何も表示されなくなります。スクリプトを使用して、ここにタイマーを表示させます。

スクリプトをセットアップする

タイマーの準備が出来たところで、次にスクリプトを使って TimerDisplay を制御し、カウントダウンを表示するプログラムを作成します。

Timer Scriptを作成する

  1. BridgeTimedBridge という名前のスクリプトを作成します。
  2. TimedBridge で2つの変数を作成し、橋とボタンのオブジェクトを格納します。
local bridge = script.Parent
local button = game.Workspace.ButtonBridge
  1. TimerDisplay とタイマーの数字を表示する timerText の2つの変数を作成します。
-- 表示用のパーツ
local timerPart = game.Workspace.TimerDisplay
-- タイマーを表示するTextLabel
local timerText = timerPart.SurfaceGui.TextLabel
  1. タイマーを表す数字の変数を作成し、残り時間を秒単位で表します。このスクリプトでは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つは、プレイヤーが橋を渡れるようにするボタンを押したことを感知するものです。

  1. startTimer() という名前のprint文を含む関数を作成します。print文はコードのテストに使用します。
local timerDuration = 5
 
local function startTimer()
    print("Countdown started")
end
  1. 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
  1. タイマーをスタートさせるには、if humanoid 文で startTimer() 関数を呼び出します。
local function buttonPressed(otherPart)
	local character = otherPart.Parent
	local humanoid = character:FindFirstChildWhichIsA("Humanoid")
	if humanoid then
            startTimer()
	end
end
  1. 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)
  1. ゲームを実行します。ButtonBridge に触れるとOutputウィンドウに「Countdown started」というメッセージが表示されるはずです。

問題解決のヒント
・”… is not a valid member of workspace” というエラーメッセージが表示された場合、TimedBridge スクリプトで、すべてのパーツがExplorerの表示と同じスペルになっていることを確認します。
・パーツが表示されない場合は、3つのパーツすべてがAnker固定されていることを確認します。

タイマーを作成する

プレイヤーが橋に入ると、startTimer() が橋を渡れるようにし、タイマーを開始します。タイマーが0になると、橋は渡れなくなります。それまでに橋を渡りきれなかったプレイヤーは落下します。

橋を渡れるようにする

  1. 橋を渡れるようにするには、startTimer() で橋の Transparency(透過度)を0(不透明)にし、CanCollidetrue (通り抜け不可)に変更します。
local function startTimer()
    -- 橋を可視化し歩けるようにする
    bridge.Transparency = 0
    bridge.CanCollide = true
end
  1. カウントダウンするタイマーを作成するには、次の値のforループを作成します。
  • 制御変数:名前は count とし、timerDuration にセットします。
  • 終了値:0
  • 増加値:-1
local function startTimer()
    -- 橋を可視化し歩けるようにする
    bridge.Transparency = 0
    bridge.CanCollide = true
 
    for count = timerDuration, 0, -1 do

    end
end
  1. 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
  1. 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
  1. ゲームを実行します。ボタンに触ると橋が現れタイマーがスタートします。ボタンの上を歩くとまたタイマーが再スタートされます。これは、ボタンに触れるたびにforループが呼び出され、ループが最初から開始されるためです。次のセクションでは、この問題を修正します。

橋が再スタートしないようにする

タイマーが何度も再スタートするのは困るので、startTimer() が再度呼び出されないように工夫する必要があります。startTimer() が実行中だった場合は、呼び出さなければ良いわけです。それを実現するには、ブーリアン型の変数を1つ追加して、その値によって実行するかどうかを判断します。ブーリアン型の変数は、数字や文字列は使用されません。代わりに true または false のみが設定できます。

ここでは、タイマーを開始させる前にすでに動いているかを確認するために、スクリプトでブーリアンを使用します。

  1. スクリプト上部の変数の下に、timerActive という名前の変数を作成します。まだボタンは押されていないので、false に設定します。
local timerDuration = 5
local timerActive = false
 
local function startTimer()
  1. 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
  1. タイマーが終了する前に startTimer() が再スタートするのを防ぐため、timerActive 変数 を true に設定します。
local function startTimer()
    timerActive = true
    bridge.Transparency = 0
    bridge.CanCollide = true
  1. テストプレイを行い、タイマーが再スタートしないことを確認します。タイマーは再スタートしなくなりましたが、一度しか使用できなくなってしまいました。繰り返し使用できるようにするために、次のセクションではブーリアンのリセットを行います。

問題解決のヒント
タイマーの数字がカウントダウンされずに変化する場合:
buttonPressed の if文に2つ目の条件が追加されていることを確認します。
startTimer() の最初で、timerActivetrue に設定されていることを確認します。

タイマーをリセットする

スクリプトを完成させるには、ブーリアンおよび橋のプロパティをゲームスタート時の状態に戻し、繰り返し使用できるようする必要があります。

  1. startTimer() 関数で、Forループの後、Transparency(透過度)を 0.8 に、CanCollidefalse に変更し、橋のプロパティ設定を元に戻します。
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
  1. 現在、timerText 0 のままです。空白に戻すには timerText に空の文字列に入れる必要があります。
bridge.Transparency = 0.8
bridge.CanCollide = false
timerText.Text = ""
  1. タイマーは完成しているので、timerActive 変数を false に設定します。これにより、次にボタンに触るとタイマーが再スタートできるようになります。
bridge.Transparency = 0.8
bridge.CanCollide = false
timerText.Text = ""
timerActive = false
  1. テストプレイし、橋が繰り返し渡れることを確認します。

完成したスクリプト

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)

コメントを残す