เวลาและเหตุการณ์

*เนื้อหานี้แปลโดยใช้ AI (เวอร์ชัน Beta) และอาจมีข้อผิดพลาด หากต้องการดูหน้านี้เป็นภาษาอังกฤษ ให้คลิกที่นี่

ในระหว่างการเรียนรู้ของรอบต่างๆ สคริปต์จะต้องติดตามเวลาและส่งสัญญาณระหว่างสคริปต์ที่แตกต่างกัน เวลาจะจัดการโดยการใช้สคริปต์เวลาโดยใช้สคริปต์เวลาใน Roblox โดยใช้แนวคิดในการจัดการอีเม

การส่งสัญญาณด้วยเหตุการณ์

ตอนนี้ผู้เล่นอยู่ในสนามประลองแล้ว ตรงกันต่อมา การใช้เหตุการณ์เพื่อสัญญาณสิ้นสุดของการจับคู่แล

เหตุการณ์เหล่านี้ไม่ได้ก่อสร้างไว้ล่วงหน้าดังนั้นจึงจำเป็นต้องสร้างวัตถุเหตุการณ์ที่เรียกว่า เหตุการณ์ผูก เพื่อให้สามารถใช้งานได้ เหตุการณ์ผูกมักใช้สำหร

สคริปต์หลายตัวสามารถฟังสิ่งที่เหมือนกันได้สำหรับเหตุการณ์ที่ผูกได้เดียวกัน นี่จะทำให้โค้ดของคุณเป็นระเบียบและทำให้มันเป็นเรื่องง่ายในการเพิ่มรหัสเพิ่มเติมสำหรับการเริ่มต้นหรือสิ้นสุดของการแข่งขั

การสร้างเหตุการณ์ที่ผูกได้

ตรงกันเนื่องจากวัตถุเหตุการณ์ที่ผูกได้ไม่ได้ใช้งานกับคลายเคลมได้จึงสามารถเก็บได้ในที่เก็บข้อมูลของเซิร์ฟเวอร์

  1. ใน ServerStorage สร้างไดเรกทอรีใหม่ที่มีชื่อว่า Events ในไดเรกทอรีนั้นสร้างสอง BindableEvents ที่มีชื่อว่า MatchStart และ MatchEnd

ใช้เหตุการณ์

ตอนนี้เมื่อผู้เล่นเข้าสู่เวที, ช่วงพักจะดำเนินการติดต่อกันอีกครั้งแทนที่จะเริ่มต้นไทม์นับ หลักเกมต้องการจะบอกให้หยุดและรอจนกว่าเหตุการณ์ MatchEnd จะเริ่มขึ้นอีกครั้งก่อนที่จะย้ายไปยังส่วนต

มีสองหน้าที่ในตัว: Connect() และ Wait() แทนที่จะใช้ Connect() เช่นเดียวกับการใช้ 1> Connect()1> ในอดีต โปรดเรียก 4> Wait()4> ใน MatchEnd เพื่อห

  1. ใน 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. ให้สคริปต์รอให้เหตุการณ์สิ้นสุดของการแข่งขันเพื่อยิงก่อนที่จะไปต่อ ใน ลูป ที่ สิ้นสุด พิมพ์: 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 เพื่อยิง

เคล็ดลับการแก้ปัญหา

ในขณะนี้โค้ดไม่ทำงานตามที่คาดไว้ลองใช้หนึ่งในต่อไปนี้

  • ตรวจสอบการใช้งานของดอทหรือตัวอักษรอื่นใน matchEnd.Event:Wait()
  • ให้แน่ใจว่า MatchEnd เป็น BindableEvent พิมพ์เช่น RemoteEvent

โดยใช้ Timer

หนึ่งในเงื่อนไขที่จะทำให้เกมจบลงคือตัวนับเวลาที่จะจัดการผ่านสคริป

การตั้งค่าเวลา

เพื่อเพิ่มตัวจับเวลาในเกมให้ใช้สคริปต์โมดูลสร้างไว้ในขั้นตอนด้านล่าง มันรวมถึงการเริ่มและสิ้นสุดตัวจับเวลา นอกจากนี้ยังรวมถึงการนับเวลาที่เหลืออยู่

  1. ใน 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. ใน 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"))
  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. ใน MatchManager สร้างฟังก์ชันใหม่ที่มีชื่อว่า timeUp() เพื่อทำงานเมื่อเวลาจะหมด รวมถึงข้อความพิมพ์ทดสอบ


    local myTimer = timer.new()
    -- หน้าต่างท้องถิ่น
    local function timeUp()
    print("Time is up!")
    end
    -- หน้าโมดูล
    function MatchManager.prepareGame()
    playerManager.sendPlayersToMatch()
    end
    return MatchManager
  2. ด้านล่าง timeUp() ให้เพิ่มฟังก์ชันที่มีชื่อว่า startTimer() ด้วยคำอธิบายปริ้น คุณจะแสดงตัวนับเวลาในเกมในภายหลัง


    -- หน้าต่างท้องถิ่น
    local function timeUp()
    print("Time is up!")
    end
    local function startTimer()
    print("Timer started")
    end
  3. เพื่อเริ่มและหยุดนับเวลา ใน startTimer() :

    • โทร 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 ใต้ตัวแปรโมดูลสร้างตัวแปรเพื่อเก็บไอเท็มในโฟลเดอร์ การแข่งขันเริ่ม และการแข่งขันจบ (ซึ่งใช้ในบทเรียนในอนาคต)


    -- สคริปโมดูล
    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