이번 글은 커스텀 이벤트를 만들고 사용하는 방법에 대해 설명하는 글이다. 또한 코드들을 어떻게 추상화 시키는지에 대한 내용도 함께 배울 수 있다. 이 예제에선 자주 사용되는 타이머 기능을 모듈화 하는 방식을 통해 코드 추상화 방법과 커스텀 이벤트 사용법을 설명하고 있다.
추상화 : 실세계의 복잡한 상황을 간결하고 명확하게 핵심 위주로 단순화시킴. 추상화를 적절히 시키면 코드의 재사용성, 가독성을 높이고, 결국 생산성, 에러의 감소와 같은 요소에 영향을 미치게 된다.
Using Bindable Events (Bindable Event 사용하기)
경기를 시작하고 종료하는 시그널을 보낼때, 이벤트를 사용할 수 있다. 하지만 이러한 이벤트는 내장되어 있는 것이 아니기 때문에 커스텀 이벤트가 필요한데, 이런 커스텀 이벤트를 bindable event 라고 한다.
여러 스크립트에서 같은 bindable event를 수신할 수 있으며, 이런 특징은 코드가 조직화되도록 하고있으며, 이런 특징은 코드가 체계화되도록 하고 필요한 경우있으며, 이런 특징은 코드가 조직화되도록 하고있으며, 이런 특징은 코드가 체계화되도록 하고 필요한 경우 나중에 경기의 시작 또는 끝을 위한 추가 코드를 더 쉽게 추가 할 수 있다. (마지막 줄은 bindable event를 사용하면 코드의 확장성이 좋아진다는 뜻 같음)
Setup Events for Match Start and End (매치 시작과 종료를 위한 이벤트 설정)
bindable event를 생성하는 방법에 대해 설명해주고 있다.
Wait for Match End (매치 종료를 위한 Wait)
현재까지의 코드는 플레이어가 경기장에 입장하면, 경기시작 타이머가 시작되는 것이 아니라 intermission이 계속해서 재시작되게 되어있다. 경기시작 ~ 종료 사이에는 main loop가 일시정지하도록 코드를 바꾸어야 한다.
이벤트에는 Connect()와 Wait() 두 내장함수가 존재한다. 앞의 예제에서는 Connect 대신 Wait함수를 써서 위에서 말한 부분(게임중에는 메인루프 정지)을 구현해보자.
custom event에 Wait함수를 사용하는 것은 event가 보내는 신호를 받을때까지 스크립트를 일시정지 시키는 방법이다. 이 같은 특징은 다양한 방식에 사용될 수 있다 (다양한 방식은 위에서 참고하자)
GameManager 스크립트 안에 해당 변수들을 선언 후 초기화 해준다.
while 문 마지막 줄에 matchEnd.Event:Wait()을 추가함으로써, matchEnd 이벤트가 발생할때까지 스크립트를 일시정지 시켜주도록 한다.
위의 코드를 테스트 해볼 차례다. 플레이어가 경기장 안으로 들어오면 intermission 루프가 유지되는 것이 아니라 matchEnd 이벤트가 발생할 때까지 기다리는지 확인해보자.
에러가 난다면 위의 Troubleshooting TIps를 참고하자.
Using a Timer (타이머 사용하기)
경기 시작 종료를 위해선 타이머가 필요하다. 아래에서 미리 만들어진 모듈스크립트를 사용한다.
Set Up the Timer Module (타이머 모듈 설정하기)
Timer라는 이름을 가진 모듈 스크립트를 생성해주고 아래의 코드블럭에 있는 코드를 넣어준다.
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
local timerThread = coroutine.wrap(function()
self._running = true
self._duration = duration
self._startTime = tick()
while self._running and tick() - self._startTime < duration do
wait()
end
local completed = self._running
self._running = false
self._startTime = nil
self._duration = nil
self._finishedEvent:Fire(completed)
end)
timerThread()
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
MatchManager 스크립트에 위의 코드들을 넣어준다. (아래 코드블럭에 필요한 부분만 따로 빼놨음.)
local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
local timer = require(moduleScripts:WaitForChild("Timer"))
새 timer 객체를 생성한다.
timer 모듈 스크립트는 timer가 필요한 여러 스크립트에서 사용될 수 있다. 예를 들어 특정 시간에 함정이 나타나게 한다던지 등등.
다른 용도로 timer를 사용하기 위해선 새로운 timer 객체를 생성해주어야 한다.
모듈 스크립트를 통해 코드를 추상화 할 수 있다는 것을 설명해준다. 나중에 함정 맵 만들때 타이머 사용하면 될듯(시간 지나면 맵의 일부가 사라지는 맵)
Start and Stop the Timer (타이머 시작과 중지)
timer를 생성했으니, timer를 start(), stop()함수에 포함시켜보자. 각 함수에 대한 설명은 위 이미지를 참고바람
MatchManager 스크립트에 timer가 끝날때 실행되는 timeUp() 함수를 생성한다.
timer를 시작시킬 때 사용할 startTimer() 함수를 추가하자.
timer를 시작, 중지시키기 위해 위의 코드를 startTimer() 함수에 넣어준다.
Start the Timer with an Event (이벤트를 통해 타이머 시작)
MatchStart 이벤트를 사용하여 timer를 시작시키는 방법에 대한 섹션.
이벤트 사용을 위한 변수들을 추가해준다.
MatchStart 이벤트를 시작하기 위해 matchStart:Fire() 를 prepareGame() 함수 안에 넣어준다.
:Fire()은 event를 실행시키는 내장함수다.
테스트해서 위와 같은 Output이 나오는지 확인하자.
에러가 발생하거나 원하는 결과가 안나오면 위 이미지의 Troubleshooting Tips를 체크해보자.
참고 링크
education.roblox.com/en-us/resources/battle-royale/timers-and-custom-events
타이머와 사용자 지정 이벤트
이 플랫폼은 사용자 경험을 개선하고, 콘텐츠를 맞춤 설정하고, 소셜 미디어 기능을 제공하고, 트래픽을 분석하기 위해 쿠키를 사용합니다. 이 플랫폼의 쿠키 사용을 중지 또는 관리하는 방법
education.roblox.com
'Education_Tutorial Series > Coding Project: Battle Royale' 카테고리의 다른 글
Coding Project: Battle Royale - [6] Ending Matches (매치 종료) (0) | 2021.04.19 |
---|---|
Coding Project: Battle Royale - [5] Creating a GUI (GUI 생성하기) (0) | 2021.04.19 |
Coding Project: Battle Royale - [3-3] Managing Players (플레이어 관리) (0) | 2021.04.19 |
Coding Project: Battle Royale - [3-2] Managing Players (플레이어 관리) (0) | 2021.04.19 |
Coding Project: Battle Royale - [3-1] Managing Players (플레이어 관리) (0) | 2021.04.19 |
댓글