타이머 및 이벤트

*이 콘텐츠는 AI(베타)를 사용해 번역되었으며, 오류가 있을 수 있습니다. 이 페이지를 영어로 보려면 여기를 클릭하세요.

라운드 동안 스크립트는 시간을 추적하고 서로 다른 스크립트 사이에서 신호를 보내야 합니다. 시간은 타임 스크립트를 사용하여 관리되며, 이벤트는 Roblox 코딩의 개념인 신호를 나타냅니다. 예를 들어, 일치종료와 같은 변경 사항을 신호하는 경우입니다.

이벤트 기반 신호 전송

이제 아레나에 플레이어가 있으므로 이벤트를 사용하여 매치 시작을 신호하고 타이머 코드를 시작할 수 있습니다. 나중에 이벤트를 사용하여 일치종료를 신호하고 플레이어를 로비로 전환할 시간이 됩니다.

이 이벤트는 미리 구성되지 않으므로 사용자 정의 이벤트 개체를 만들어야 합니다. 이벤트 개체는 플레이어가 발생한 이벤트를 위한 것이 일반적이며 바인딩 가능한 이벤트와 같은 이벤트입니다.

여러 개의 스크립트가 동일한 바인딩된 이벤트를 수신할 수 있습니다. 이렇게 하면 코드를 구성하고 나중에 필요할 때 시작 또는 종료에 대한 추가 코드를 쉽게 추가할 수 있습니다.

바인딩 가능한 이벤트 생성

일치시작과 끝을 위해 바인딩할 이벤트 개체를 생성하십시오. 이벤트가 클라이언트와 상호 작용하지 않기 때문에 서버 스토리지에 저장할 수 있습니다.

  1. In ServerStorage, create a new folder named Events. 그 폴더에서 두 개의 BindableEvents named MatchStart 및 MatchEnd를 만듭니다.

이벤트 사용

현재, 플레이어가 아레나에 들어갈 때, 중간 휴식이 시작되는 대신 타이머를 시작하지 않고 다시 시작됩니다. 주요 게임 루프는 중지하고 매치가 끝나기 전에 이동하기 위해 대기해야 합니다.

이벤트에는 두 가지 내장 기능이 있습니다. Connect()Wait() . 대신 이전처럼 Connect() 를 사용하지 마십시오. 대신 경기 관리자 스크립트를 일시 중지하려면 MatchEnd에서 1> Wait()1> 를 호출합니다. 이 경우

  1. In GameManager , 폴더 및 Events 이벤트에 대한 변수를 생성합니다.


    -- 모듈 스크립트
    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가 바인딩 이벤트가 아닌 다른 이벤트, 예를 들어 원격 이벤트인지 확인하십시오.

타이머 사용

매치가 끝나는 조건 중 하나는 타이머가 종료되는 것입니다, 스크립트를 통해 처리됩니다.

타이머 설정

게임에 타이머를 추가하려면 아래 단계의 미리 만들기 모듈 스크립트를 사용하십시오. 타이머를 시작하고 종료하는 기능을 포함하여 시간을 반환합니다.

  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. In 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. 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() , 프린트 문을 사용하여 이름이 startTimer() 인 함수를 추가합니다. 나중에 게임에서 타이머를 표시합니다.


    -- 로컬 함수
    local function timeUp()
    print("Time is up!")
    end
    local function startTimer()
    print("Timer started")
    end
  3. 시작 및 종료 타이머를 시작하려면, startTimer() :

    • Call myTimer.start() . Pass in gameSettings.matchDuration .
    • Call myTimer.finished:Connect() . Pass in timeUp() .

    -- 로컬 함수
    local function startTimer()
    print("Timer started")
    myTimer:start(gameSettings.matchDuration)
    myTimer.finished:Connect(timeUp)
    end

타이머 시작

매치 시작 이벤트를 사용하여 타이머를 시작할 수 있습니다.

  1. In MatchManager, under the module variables, create variables to store the Events folder, MatchStart, and MatchEnd (which is used in a future lesson).


    -- 모듈 스크립트
    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