참고링크
education.roblox.com/en-us/resources/battle-royale/coding-the-game-loop
게임 루프 코딩
이 플랫폼은 사용자 경험을 개선하고, 콘텐츠를 맞춤 설정하고, 소셜 미디어 기능을 제공하고, 트래픽을 분석하기 위해 쿠키를 사용합니다. 이 플랫폼의 쿠키 사용을 중지 또는 관리하는 방법
education.roblox.com
배틀로얄 게임 제작시 사용되는 스크립트에 대한 개요를 설명한다.
배틀로양 게임을 만들기 위해선, module scripts와 normal script가 사용된다.
module scripts인 GameSettings과 MatchManager에는 일반적으로 사용되는 변수나 함수를 담고 있다.
normal script인 GameManager는 게임의 메인 루프를 관리한다. 각 스크립트에 대한 구체적인 일은 위의 이미지에서 설명하고 있다.
GameManager, MatchManager, GameSettings 스크립트는 스크립트에 이름을 붙여준 것이지 실제로 저런 스크립트 종류가 존재하는 것은 아니다.
*요약 및 정리
사용되는 Service (ServerScriptService , ServerStorage)
ServerScriptService 란? (1.Creating New Script 부분에 있음)
ServerStorage 란? (나중에 링크 필요)
파일 구조
ServerScriptService - GameManager (MatchMager에 있는 함수사용 , GameSettings에 있는 변수 사용)
ServerStorage - ModuleScripts - GameSettings(게임에 필요한 변수들) , MatchManager (게임에 필요한 함수들)
요약 끝!
--------------------------------------------------------------------------------------------------------------------
GameSettings라는 이름을 가진 module script를 만들고, 그 안에 변수를 저장하는 방법에 대해 설명하고 있다.
사용되는 변수는 다음과 같다.
- Intermission Duration - 최소인원이 모였는지 체크하기 위한 간격(5로 설정하면 5초마다 한번씩 플레이어 수를 체크한다.)
- Match Duration - 매치 시간.
- Minimum Players - 게임을 시작하기 위한 최소 인원.
- Transition Time - 매치 전후의 시간. 루프의 요소 간에 전환을 자연스럽게 한다. (만약 Transition Time이 없다면, Intermission Duration이 끝나고 준비시간 없이 바로 매치가 시작된다.)
MatchManager 스크립트를 만드는 방법에 대해 설명하고 있다. MatchManager 스크립트에서는 타이머를 시작한다던지, 매치가 끝난 후 플레이어를 재설정해주는 일등을 관리한다.
GameSettings 스크립트를 생성 위치와 같은 곳에 MatchManager 스크립트를 생성해준다.
Game Loop 코드를 작성하는 것에 대한 설명을 하고있다. Game Loop는 intermission, competition, and cleanup & reset 세 단계를 거친다. (이전글에서 설명함)
Game Loop 코드를 작성에 대한 전체적인 과정은 우선 ServerScriptService안에 GameManager라는 이름을 가진 스크립트를 생성한다. 그 후 아래의 코드를 넣어준다.
-- Services
-- 모듈들을 불러오기 위한 변수
local ServerStorage = game:GetService("ServerStorage")
-- 플레이어 객체를 불러오기 위한 변수
local Players = game:GetService("Players")
-- Module Scripts
-- ServerStorage안에서 ModuleScripts라는 이름을 가진 객체를 찾는다.
local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
--MatchManager, GameSettings이라는 이름을 가진 모듈 스크립트를 불러온다
local matchManager = require(moduleScripts:WaitForChild("MatchManager"))
local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
-- Main game loop
-- 게임 루프를 위한 while문을 작성한다.
while true do
end
이제 Game Loop 중 Intermission 단계에 대한 코드를 작성해보자.
Intermission 단계에서는 Loop를 정지시키고, 매치를 위한 충분한 플레이어가 있을 경우에만 Loop를 유지시킨다.
-- Main game loop
while true do
repeat
print("Starting intermission")
--인자로 넣어준 수만큼 스레드를 일시정지시키는 함수 ex) wait(5) 5초간 정지
wait(gameSettings.intermissionDuration)
--repeat문에 대한 조건. 조건을 만족하면 repeat문을 끝내고 다음 코드를 실행한다.
until Players.NumPlayers >= gameSettings.minimumPlayers
end
위 코드는 플레이어의 수가 gameSettings에서 설정해놓은 minimumPlayers의 수보다 적을 경우 repeat문 안에 있는 내용이 계속 실행되게 된다. 최소 인원 조건이 만족하면 repeat문을 벗어나게 된다.
최소인원보다 많거나 같은 수의 플레이어가 존재한다면, Intermission 단계는 끝나게 되고 플레이어들은 짧은 transition time을 기다린 후 GameManager 모듈의 preparePlayers() 함수를 실행시킨다. 지금은 preparePlayers() 함수 안에 print함수만 작성되어 있지만, 추후에 필요한대로 커스터마이징 하면 된다.
GameManager Script 전체 코드
-- Services
local ServerStorage = game:GetService("ServerStorage")
local Players = game:GetService("Players")
-- Module Scripts
local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
local matchManager = require(moduleScripts:WaitForChild("MatchManager"))
local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
while true do
repeat
wait(gameSettings.intermissionDuration)
print("Restarting intermission")
until Players.NumPlayers >= gameSettings.minimumPlayers
print("Intermission over")
wait(gameSettings.transitionTime)
matchManager.prepareGame()
end
이제 멀티플레이 게임을 테스트해보자. 우선 멀티플레이 게임을 진행하기 위해선 최소 2명의 인원이 필요하다. 위에서 어떻게 2명 이상의 플레이어로 테스트할 수 있는 방법을 설명해준다.
에러가 날 경우, 위의 내용을 참고해보자.
2명이상의 플레이어로 테스트 하게 되면 여러 윈도우 창이 뜬다. 초록색 테두리는 서버를 나타내고, 파란색 테두리는 클라이언트를 의미한다. Game Loop가 잘 동작하는지 확인하려면 서버 윈도우창의 Output을 확인해보자.
서버 윈도우 창에는 서버 스크립트에 관한 내용이 프린트되고, 클라이언트 윈도우 창에는 로컬 스크립트에 관한 내용이 프린트된다. 더 자세한 정보는 Game Testing 기사를 참고하자.
댓글