라운드 동안 스크립트는 시간을 추적하고 서로 다른 스크립트 사이에서 신호를 보내야 합니다. 시간은 타임 스크립트를 사용하여 관리되며, 이벤트는 Roblox 코딩의 개념인 신호를 나타냅니다. 예를 들어, 일치종료와 같은 변경 사항을 신호하는 경우입니다.
이벤트 기반 신호 전송
이제 아레나에 플레이어가 있으므로 이벤트를 사용하여 매치 시작을 신호하고 타이머 코드를 시작할 수 있습니다. 나중에 이벤트를 사용하여 일치종료를 신호하고 플레이어를 로비로 전환할 시간이 됩니다.
이 이벤트는 미리 구성되지 않으므로 사용자 정의 이벤트 개체를 만들어야 합니다. 이벤트 개체는 플레이어가 발생한 이벤트를 위한 것이 일반적이며 바인딩 가능한 이벤트와 같은 이벤트입니다.
여러 개의 스크립트가 동일한 바인딩된 이벤트를 수신할 수 있습니다. 이렇게 하면 코드를 구성하고 나중에 필요할 때 시작 또는 종료에 대한 추가 코드를 쉽게 추가할 수 있습니다.
바인딩 가능한 이벤트 생성
일치시작과 끝을 위해 바인딩할 이벤트 개체를 생성하십시오. 이벤트가 클라이언트와 상호 작용하지 않기 때문에 서버 스토리지에 저장할 수 있습니다.
In ServerStorage, create a new folder named Events. 그 폴더에서 두 개의 BindableEvents named MatchStart 및 MatchEnd를 만듭니다.
이벤트 사용
현재, 플레이어가 아레나에 들어갈 때, 중간 휴식이 시작되는 대신 타이머를 시작하지 않고 다시 시작됩니다. 주요 게임 루프는 중지하고 매치가 끝나기 전에 이동하기 위해 대기해야 합니다.
이벤트에는 두 가지 내장 기능이 있습니다. Connect() 및 Wait() . 대신 이전처럼 Connect() 를 사용하지 마십시오. 대신 경기 관리자 스크립트를 일시 중지하려면 MatchEnd에서 1> Wait()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")스크립트가 진행 중인 매치 종료 이벤트를 기다리고 진행하기 전에 이동합니다. 인 루프 의 끝에, 입력: 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가 바인딩 이벤트가 아닌 다른 이벤트, 예를 들어 원격 이벤트인지 확인하십시오.
타이머 사용
매치가 끝나는 조건 중 하나는 타이머가 종료되는 것입니다, 스크립트를 통해 처리됩니다.
타이머 설정
게임에 타이머를 추가하려면 아래 단계의 미리 만들기 모듈 스크립트를 사용하십시오. 타이머를 시작하고 종료하는 기능을 포함하여 시간을 반환합니다.
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 TimerIn 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) - 타이머가 끝나면 지정된 함수를 매개 변수로 실행합니다.
In 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() :
- 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
타이머 시작
매치 시작 이벤트를 사용하여 타이머를 시작할 수 있습니다.
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()위에 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