ในระหว่างการเรียนรู้ของรอบต่างๆ สคริปต์จะต้องติดตามเวลาและส่งสัญญาณระหว่างสคริปต์ที่แตกต่างกัน เวลาจะจัดการโดยการใช้สคริปต์เวลาโดยใช้สคริปต์เวลาใน Roblox โดยใช้แนวคิดในการจัดการอีเม
การส่งสัญญาณด้วยเหตุการณ์
ตอนนี้ผู้เล่นอยู่ในสนามประลองแล้ว ตรงกันต่อมา การใช้เหตุการณ์เพื่อสัญญาณสิ้นสุดของการจับคู่แล
เหตุการณ์เหล่านี้ไม่ได้ก่อสร้างไว้ล่วงหน้าดังนั้นจึงจำเป็นต้องสร้างวัตถุเหตุการณ์ที่เรียกว่า เหตุการณ์ผูก เพื่อให้สามารถใช้งานได้ เหตุการณ์ผูกมักใช้สำหร
สคริปต์หลายตัวสามารถฟังสิ่งที่เหมือนกันได้สำหรับเหตุการณ์ที่ผูกได้เดียวกัน นี่จะทำให้โค้ดของคุณเป็นระเบียบและทำให้มันเป็นเรื่องง่ายในการเพิ่มรหัสเพิ่มเติมสำหรับการเริ่มต้นหรือสิ้นสุดของการแข่งขั
การสร้างเหตุการณ์ที่ผูกได้
ตรงกันเนื่องจากวัตถุเหตุการณ์ที่ผูกได้ไม่ได้ใช้งานกับคลายเคลมได้จึงสามารถเก็บได้ในที่เก็บข้อมูลของเซิร์ฟเวอร์
ใน ServerStorage สร้างไดเรกทอรีใหม่ที่มีชื่อว่า Events ในไดเรกทอรีนั้นสร้างสอง BindableEvents ที่มีชื่อว่า MatchStart และ MatchEnd
ใช้เหตุการณ์
ตอนนี้เมื่อผู้เล่นเข้าสู่เวที, ช่วงพักจะดำเนินการติดต่อกันอีกครั้งแทนที่จะเริ่มต้นไทม์นับ หลักเกมต้องการจะบอกให้หยุดและรอจนกว่าเหตุการณ์ MatchEnd จะเริ่มขึ้นอีกครั้งก่อนที่จะย้ายไปยังส่วนต
มีสองหน้าที่ในตัว: Connect() และ Wait() แทนที่จะใช้ Connect() เช่นเดียวกับการใช้ 1> Connect()1> ในอดีต โปรดเรียก 4> Wait()4> ใน MatchEnd เพื่อห
ใน 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")ให้สคริปต์รอให้เหตุการณ์สิ้นสุดของการแข่งขันเพื่อยิงก่อนที่จะไปต่อ ใน ลูป ที่ สิ้นสุด พิมพ์: 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 เพื่อยิง
เคล็ดลับการแก้ปัญหา
ในขณะนี้โค้ดไม่ทำงานตามที่คาดไว้ลองใช้หนึ่งในต่อไปนี้
- ตรวจสอบการใช้งานของดอทหรือตัวอักษรอื่นใน matchEnd.Event:Wait()
- ให้แน่ใจว่า MatchEnd เป็น BindableEvent พิมพ์เช่น RemoteEvent
โดยใช้ Timer
หนึ่งในเงื่อนไขที่จะทำให้เกมจบลงคือตัวนับเวลาที่จะจัดการผ่านสคริป
การตั้งค่าเวลา
เพื่อเพิ่มตัวจับเวลาในเกมให้ใช้สคริปต์โมดูลสร้างไว้ในขั้นตอนด้านล่าง มันรวมถึงการเริ่มและสิ้นสุดตัวจับเวลา นอกจากนี้ยังรวมถึงการนับเวลาที่เหลืออยู่
ใน 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ใน MatchManager ต้องการโมดูล GameSettings และ 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) - เมื่อเวลาจะหมด, รุ่นฟังก์ชันที่ผ่านเป็นตัวอ้าง
ใน MatchManager สร้างฟังก์ชันใหม่ที่มีชื่อว่า timeUp() เพื่อทำงานเมื่อเวลาจะหมด รวมถึงข้อความพิมพ์ทดสอบ
local myTimer = timer.new()-- หน้าต่างท้องถิ่นlocal function timeUp()print("Time is up!")end-- หน้าโมดูลfunction MatchManager.prepareGame()playerManager.sendPlayersToMatch()endreturn MatchManagerด้านล่าง timeUp() ให้เพิ่มฟังก์ชันที่มีชื่อว่า startTimer() ด้วยคำอธิบายปริ้น คุณจะแสดงตัวนับเวลาในเกมในภายหลัง
-- หน้าต่างท้องถิ่นlocal function timeUp()print("Time is up!")endlocal function startTimer()print("Timer started")endเพื่อเริ่มและหยุดนับเวลา ใน startTimer() :
- โทร myTimer.start() . ผ่านใน gameSettings.matchDuration .
- โทร myTimer.finished:Connect() . ผ่านใน timeUp() .
-- หน้าต่างท้องถิ่นlocal function startTimer()print("Timer started")myTimer:start(gameSettings.matchDuration)myTimer.finished:Connect(timeUp)end
เริ่มตัวนับเวลา
เทมเพลตสามารถเริ่มต้นได้ในตอนเริ่มของการแข่งขันโดยใช้เหตุการณ์เริ่มต้น
ใน MatchManager ใต้ตัวแปรโมดูลสร้างตัวแปรเพื่อเก็บไอเท็มในโฟลเดอร์ การแข่งขันเริ่ม และการแข่งขันจบ (ซึ่งใช้ในบทเรียนในอนาคต)
-- สคริปโมดูล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