ラウンド中、スクリプトは時間を追跡し、異なるスクリプト間で時信を送信する必要があります。時間は時間スクリプトを使用して管理され、イベント、Roblox コーディングのコンセプト、はマッチの終了などの一致更を信号化します。
イベントで信号を送信する
プレイヤーがアリーナにいるため、イベントを使用してマッチの開始を信号として、コードを開始できます。その後、イベントを使用して、マッ一致の終了を信号として、プレイヤーをロビーに移行する時間を開始できます。
これらのイベントはプリビルドされていないので、「バインド可能なイベント」という名前のカスタムイベントオブジェクトを作成する必要があります。バインド可能なイベントは通常、プレイヤーが発動するアクションのようなものであり、「Touched」や「Touched」などのイベントと似ています。
複数のスクリプトは同じバインド可能なイベントを聞くことができます。これにより、コードが整理され、スクリプトを追加で必要に応じて、後半または開始のマッチに追加できます。
バインド可能なイベントを作成する
マッ一致の開始と終了にバインド可能なイベントオブジェクトを作成します。バインド可能なイベントは、クライアントにインタラクトしないため、サーバーストレージに保存できます。
In ServerStorage で、イベント という名前の新しいフォルダを作成します。そのフォルダ内で、バインド可能なイベント として、マッチ開始 と 1>マッチ終了1> の 2つの 4>イベント4> を作成します。
イベントを使用する
現在、プレイヤーがアリーナに入ると、インターミッションが再起動し、タイマーを開始するのではなく、開始します。メインゲームループは、マッチエンドイベントが発動する前に移動する必要があります。
イベントには 2つの内蔵関数があります: Connect() と Wait() 。代わりに、Connect() を使用する代わりに、マッチ終了まで 2>Wait2> を呼び出します。この場合、5>Wait5> 機能は、マッチ終了が発生するまでゲームマネージャー
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")スクリプトが移動する前に、マッチ終了イベントを待つようにスクリプトを待ちます。在 ループ 、in 終了 、タイプ: matchEnd.Event:Wait()
while true dorepeattask.wait(gameSettings.intermissionDuration)print("Restarting intermission")until #Players:GetPlayers() >= gameSettings.minimumPlayersprint("Intermission over")task.wait(gameSettings.transitionTime)matchManager.prepareGame()-- ゲームの長さを待ちます。matchEnd.Event:Wait()endゲームをテスト します。プレイヤーがアリーナに入ったことを確認してください。インターミッションループは 続きません 。スクリプトは matchEnd 信号を待っています。
トラブルシューティングのヒント
この時点で、コードは期待通りに機能しません。以下の 1つを試してください。
- Double check the usage of the dot or colon operators in matchEnd.Event:Wait() .
- MatchEnd がリモートイベントではなく、バインド可能なイベントであることを確認してください。
タイマーを使用する
試合の終了を引き起こすコンディションの 1 つは、スクリプトで処理されるタイマーの切れです。
タイマーのセットアップ
ゲームにタイマーを追加するには、以下のステップでプリメイドモジュールスクリプトを使用します。タイマーを開始および終了する機能、および残り時間を返す機能が含まれています。
In ServerStorage > ModuleScripts で、新しいモジュールスクリプトを Timer という名前で作成します。
コードを以下のコードと交換します。
local Timer = {}Timer.__index = Timerfunction Timer.new()local self = setmetatable({}, Timer)self._finishedEvent = Instance.new("BindableEvent")self.finished = self._finishedEvent.Eventself._running = falseself._startTime = nilself._duration = nilreturn selfendfunction Timer:start(duration)if not self._running thentask.spawn(function()self._running = trueself._duration = durationself._startTime = tick()while self._running and tick() - self._startTime < duration dotask.wait()endlocal completed = self._runningself._running = falseself._startTime = nilself._duration = nilself._finishedEvent:Fire(completed)end)elsewarn("Warning: timer could not start again as it is already running.")endendfunction Timer:getTimeLeft()if self._running thenlocal now = tick()local timeLeft = self._startTime + self._duration - nowif timeLeft < 0 thentimeLeft = 0endreturn timeLeftelsewarn("Warning: could not get remaining time, timer is not running.")endendfunction Timer:isRunning()return self._runningendfunction Timer:stop()self._running = falseendreturn Timerマッチマネージャーでゲーム設定とタイマーモジュールを必要とします。
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"))変数の下に、「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) - タイマーが終了すると、パラメーターとして渡された関数を実行します。
In MatchManager で、タイマーが終了したときに実行する新しい関数を timeUp() を作成します。テスト打印文を含みます。
local myTimer = timer.new()-- ローカル関数local function timeUp()print("Time is up!")end-- モジュール機能function MatchManager.prepareGame()playerManager.sendPlayersToMatch()endreturn MatchManager以下の timeUp() 以下に、print 文を含む関数を追加します。後でゲーム内のタイマーを表示します。
-- ローカル関数local function timeUp()print("Time is up!")endlocal function startTimer()print("Timer started")endタイマーを開始および停止するには、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
タイマーの開始
タイマーは、マッチ開始イベントを使用して、マッチ開始時にトリガーできます。
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()上の return MatchManager 以上で、マッチ開始イベントを startTimer() に接続します。
-- モジュール機能function MatchManager.prepareGame()playerManager.sendPlayersToMatch()endmatchStart.Event:Connect(startTimer)return MatchManagerマッチ開始イベントを発動するには、prepareGame() の中で、matchStart:Fire() をタイプします。
-- モジュール機能function MatchManager.prepareGame()playerManager.sendPlayersToMatch()matchStart:Fire()endゲームをテストします。 出力ウィンドウで、タイマーの開始と停止機能のプリントステートを確認できることを確認してください。
完了したスクリプト
以下は、作業を確認するために完了したスクリプトです。
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 dorepeattask.wait(gameSettings.intermissionDuration)print("Restarting intermission")until #Players:GetPlayers() >= gameSettings.minimumPlayersprint("Intermission over")task.wait(gameSettings.transitionTime)matchManager.prepareGame()-- ゲームの長さを待ちます。matchEnd.Event:Wait()end