タイマーとイベント

*このコンテンツは、ベータ版のAI(人工知能)を使用して翻訳されており、エラーが含まれている可能性があります。このページを英語で表示するには、 こちら をクリックしてください。

ラウンド中、スクリプトは時間を追跡し、異なるスクリプト間で時信を送信する必要があります。時間は時間スクリプトを使用して管理され、イベント、Roblox コーディングのコンセプト、はマッチの終了などの一致更を信号化します。

イベントで信号を送信する

プレイヤーがアリーナにいるため、イベントを使用してマッチの開始を信号として、コードを開始できます。その後、イベントを使用して、マッ一致の終了を信号として、プレイヤーをロビーに移行する時間を開始できます。

これらのイベントはプリビルドされていないので、「バインド可能なイベント」という名前のカスタムイベントオブジェクトを作成する必要があります。バインド可能なイベントは通常、プレイヤーが発動するアクションのようなものであり、「Touched」や「Touched」などのイベントと似ています。

複数のスクリプトは同じバインド可能なイベントを聞くことができます。これにより、コードが整理され、スクリプトを追加で必要に応じて、後半または開始のマッチに追加できます。

バインド可能なイベントを作成する

マッ一致の開始と終了にバインド可能なイベントオブジェクトを作成します。バインド可能なイベントは、クライアントにインタラクトしないため、サーバーストレージに保存できます。

  1. In ServerStorage で、イベント という名前の新しいフォルダを作成します。そのフォルダ内で、バインド可能なイベント として、マッチ開始 と 1>マッチ終了1> の 2つの 4>イベント4> を作成します。

イベントを使用する

現在、プレイヤーがアリーナに入ると、インターミッションが再起動し、タイマーを開始するのではなく、開始します。メインゲームループは、マッチエンドイベントが発動する前に移動する必要があります。

イベントには 2つの内蔵関数があります: Connect()Wait() 。代わりに、Connect() を使用する代わりに、マッチ終了まで 2>Wait2> を呼び出します。この場合、5>Wait5> 機能は、マッチ終了が発生するまでゲームマネージャー

  1. In GameManager で、Events フォルダとMatchEndイベントの変数を作成します。


    -- モジュールスクリプト
    local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
    local matchManager = require(moduleScripts:WaitForChild("MatchManager"))
    local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
    -- イベント
    local events = ServerStorage:WaitForChild("Events")
    local matchEnd = events:WaitForChild("MatchEnd")
  2. スクリプトが移動する前に、マッチ終了イベントを待つようにスクリプトを待ちます。在 ループ 、in 終了 、タイプ: matchEnd.Event:Wait()


    while true do
    repeat
    task.wait(gameSettings.intermissionDuration)
    print("Restarting intermission")
    until #Players:GetPlayers() >= gameSettings.minimumPlayers
    print("Intermission over")
    task.wait(gameSettings.transitionTime)
    matchManager.prepareGame()
    -- ゲームの長さを待ちます。
    matchEnd.Event:Wait()
    end
  3. ゲームをテスト します。プレイヤーがアリーナに入ったことを確認してください。インターミッションループは 続きません 。スクリプトは matchEnd 信号を待っています。

トラブルシューティングのヒント

この時点で、コードは期待通りに機能しません。以下の 1つを試してください。

  • Double check the usage of the dot or colon operators in matchEnd.Event:Wait() .
  • MatchEnd がリモートイベントではなく、バインド可能なイベントであることを確認してください。

タイマーを使用する

試合の終了を引き起こすコンディションの 1 つは、スクリプトで処理されるタイマーの切れです。

タイマーのセットアップ

ゲームにタイマーを追加するには、以下のステップでプリメイドモジュールスクリプトを使用します。タイマーを開始および終了する機能、および残り時間を返す機能が含まれています。

  1. In ServerStorage > ModuleScripts で、新しいモジュールスクリプトを Timer という名前で作成します。

    コードを以下のコードと交換します。


    local Timer = {}
    Timer.__index = Timer
    function Timer.new()
    local self = setmetatable({}, Timer)
    self._finishedEvent = Instance.new("BindableEvent")
    self.finished = self._finishedEvent.Event
    self._running = false
    self._startTime = nil
    self._duration = nil
    return self
    end
    function Timer:start(duration)
    if not self._running then
    task.spawn(function()
    self._running = true
    self._duration = duration
    self._startTime = tick()
    while self._running and tick() - self._startTime < duration do
    task.wait()
    end
    local completed = self._running
    self._running = false
    self._startTime = nil
    self._duration = nil
    self._finishedEvent:Fire(completed)
    end)
    else
    warn("Warning: timer could not start again as it is already running.")
    end
    end
    function Timer:getTimeLeft()
    if self._running then
    local now = tick()
    local timeLeft = self._startTime + self._duration - now
    if timeLeft < 0 then
    timeLeft = 0
    end
    return timeLeft
    else
    warn("Warning: could not get remaining time, timer is not running.")
    end
    end
    function Timer:isRunning()
    return self._running
    end
    function Timer:stop()
    self._running = false
    end
    return Timer
  2. マッチマネージャーでゲーム設定とタイマーモジュールを必要とします。


    local MatchManager = {}
    -- サービス
    local ServerStorage = game:GetService("ServerStorage")
    -- モジュールスクリプト
    local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
    local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))
    local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
    local timer = require(moduleScripts:WaitForChild("Timer"))
  3. 変数の下に、「myTimer」という名前の変数を設定して、「timer.new()」と同じようにタイマーを開始および停止する関数を呼び出します。このオブジェクトは、タイマーを開始および停止する関数を呼び出すために使用されます。


    local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
    local timer = require(moduleScripts:WaitForChild("Timer"))
    -- マッチ時間を追跡するために使用する新しいタイマーオブジェクトを作成します。
    local myTimer = timer.new()

開始と停止

タイマーが作成されたので、マッチ中に含まれる関数 start()stop() を使用します。以下は、各関数の説明とパラメーターを受け入れるパラメーターです。

  • start(time) - ターゲットの時間を秒単位で開始します。
  • finished:Connect(functionName) - タイマーが終了すると、パラメーターとして渡された関数を実行します。
  1. In MatchManager で、タイマーが終了したときに実行する新しい関数を timeUp() を作成します。テスト打印文を含みます。


    local myTimer = timer.new()
    -- ローカル関数
    local function timeUp()
    print("Time is up!")
    end
    -- モジュール機能
    function MatchManager.prepareGame()
    playerManager.sendPlayersToMatch()
    end
    return MatchManager
  2. 以下の timeUp() 以下に、print 文を含む関数を追加します。後でゲーム内のタイマーを表示します。


    -- ローカル関数
    local function timeUp()
    print("Time is up!")
    end
    local function startTimer()
    print("Timer started")
    end
  3. タイマーを開始および停止するには、startTimer() で:

    • Call myTimer.start() 。パスイン gameSettings.matchDuration
    • コール myTimer.finished:Connect() . パスイン timeUp()

    -- ローカル関数
    local function startTimer()
    print("Timer started")
    myTimer:start(gameSettings.matchDuration)
    myTimer.finished:Connect(timeUp)
    end

タイマーの開始

タイマーは、マッチ開始イベントを使用して、マッチ開始時にトリガーできます。

  1. MatchManager のモジュール変数の下で、イベントフォルダ、MatchStart 、MatchEnd を保存する変数を作成します (これは将来のレッスンで使用されます)。


    -- モジュールスクリプト
    local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
    local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))
    local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
    local timer = require(moduleScripts:WaitForChild("Timer"))
    -- イベント
    local events = ServerStorage:WaitForChild("Events")
    local matchStart = events:WaitForChild("MatchStart")
    local matchEnd = events:WaitForChild("MatchEnd")
    --タイマーを作成
    local myTimer = timer.new()
  2. 上の return MatchManager 以上で、マッチ開始イベントを startTimer() に接続します。


    -- モジュール機能
    function MatchManager.prepareGame()
    playerManager.sendPlayersToMatch()
    end
    matchStart.Event:Connect(startTimer)
    return MatchManager
  3. マッチ開始イベントを発動するには、prepareGame() の中で、matchStart:Fire() をタイプします。


    -- モジュール機能
    function MatchManager.prepareGame()
    playerManager.sendPlayersToMatch()
    matchStart:Fire()
    end
  4. ゲームをテストします。 出力ウィンドウで、タイマーの開始と停止機能のプリントステートを確認できることを確認してください。

完了したスクリプト

以下は、作業を確認するために完了したスクリプトです。

MatchManager スクリプト


local MatchManager = {}
-- サービス
local ServerStorage = game:GetService("ServerStorage")
-- モジュールスクリプト
local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))
local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
local timer = require(moduleScripts:WaitForChild("Timer"))
-- イベント
local events = ServerStorage:WaitForChild("Events")
local matchStart = events:WaitForChild("MatchStart")
local matchEnd = events:WaitForChild("MatchEnd")
-- マッチ時間を追跡するために使用する新しいタイマーオブジェクトを作成します。
local myTimer = timer.new()
-- ローカル関数
local function timeUp()
print("Time is up!")
end
local function startTimer()
print("Timer started")
myTimer:start(gameSettings.matchDuration)
myTimer.finished:Connect(timeUp)
end
-- モジュール機能
function MatchManager.prepareGame()
playerManager.sendPlayersToMatch()
matchStart:Fire()
end
matchStart.Event:Connect(startTimer)
return MatchManager

GameManager スクリプト


-- サービス
local ServerStorage = game:GetService("ServerStorage")
local Players = game:GetService("Players")
-- モジュールスクリプト
local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
local matchManager = require(moduleScripts:WaitForChild("MatchManager"))
local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
-- イベント
local events = ServerStorage:WaitForChild("Events")
local matchEnd = events:WaitForChild("MatchEnd")
while true do
repeat
task.wait(gameSettings.intermissionDuration)
print("Restarting intermission")
until #Players:GetPlayers() >= gameSettings.minimumPlayers
print("Intermission over")
task.wait(gameSettings.transitionTime)
matchManager.prepareGame()
-- ゲームの長さを待ちます。
matchEnd.Event:Wait()
end