맵이 생성된 후, 스크립트 작성을 시작할 시간입니다. 이 코스의 나머지는 모두 게임 루프의 다양한 요소에 대한 스크립트 작성에 집중합니다.
스크립트 설정
배틀 로얄은 모듈 스크립트와 일반 스크립트의 조합을 사용합니다. 아래는 스크립트와 그 기능입니다.
게임 관리자 | 스크립트. 게임 설정에서 변수를 사용하여 매치 관리자에서 함수를 실행합니다. |
MatchManager | 모듈 스크립트. 플레이어를 아레나로 보내거나 매치에서 시간을 추적하는 등의 기능을 수행합니다. |
게임 설정 | 모듈 스크립트. 다른 스크립트에서 사용하는 일반적으로 사용되는 변수를 저장합니다. |
GameSettings 스크립트
매치 및 휴식 시간과 같은 다른 스크립트에서 사용하는 변수를 저장하기 위해 GameSettings라는 모듈 스크립트를 생성합니다. 이 변수는 나중에 GameManager 스크립트에서 사용됩니다.
In ServerStorage 에서, 모듈 스크립트라는 이름의 폴더를 만듭니다. 그 폴더에서, 게임 설정 이라는 이름의 새로운 모듈 스크립트를 만듭니다.
Open GameSettings를 열고 모듈 테이블을 스크립트 이름과 일치하도록 이름을 변경합니다.
local GameSettings = {}return GameSettings모듈 테이블에서 다음의 용도에 대한 변수를 추가하십시오. 각 값에 대해 가장 좋은 추측을 사용하십시오, 테스트 시 항상 변경할 수 있습니다.
- 중간 휴식 시간 - 플레이어는 일치시작 전에 몇 초 동안 기다립니다.
- 매치 지속 시간 - 매치 지속 시간(초).
- 최소 플레이어 - 시작할 때 필요한 가장 작은 플레이어 수.
- 전환 시간 - 게임 루프의 부품 간의 전환이 갑자기 되지 않습니다. 게임 루프의 부품 간의 전환 시간을 만들려면 이 전환 시간을 전환 시간으로 설정합니다.
local GameSettings = {}-- 게임 변수GameSettings.intermissionDuration = 5GameSettings.matchDuration = 10GameSettings.minimumPlayers = 2GameSettings.transitionTime = 5return GameSettings
MatchManager 스크립트
GameManager에 연결된 두 번째 스크립트는 MatchManager입니다. 이 스크립트는 플레이어가 매치를 시작하거나 매치가 끝나면 플레이어를 관리하는 작업을 처리합니다.
MatchManager 내에 있는 prepareGame() 함수는 일치매치로 전환하여 게임을 시작합니다.
In ServerStorage > ModuleScripts > MatchManager라는 이름의 모듈 스크립트를 추가합니다. 모듈 테이블을 이름 변경합니다.
local MatchManager = {}return MatchManagerMatchManager라는 이름의 새로운 모듈 함수를 추가합니다.prepareGame()
local MatchManager = {}function MatchManager.prepareGame()print("Game starting!")endreturn MatchManager
게임 루프 코딩
주요 게임 루프는 GameManager 스크립트에 변수를 사용하여 작성됩니다. 기억하십시오, 게임 루프에는 3가지 단계가 있습니다: 휴식, 경쟁 및 청소 및 재설정.
GameManager 스크립트
이 스크립트는 일반 서버 스크립트이므로 ServerScriptService에 넣고 모듈 스크립트 폴더에는 없습니다. 실제 게임 루프는 일반적으로 true do 루프입니다.
In ServerScriptService, 게임 관리자라는 이름의 새 스크립트를 생성합니다.
서버 스토리지, 모듈 스크립트가 있는 곳에 대한 변수를 추가하십시오. 그런 다음 플레이어 카운트를 확인하기 위해 플레이어 서비스에 "Players"를 추가하십시오.
-- 서비스local ServerStorage = game:GetService("ServerStorage")local Players = game:GetService("Players")앞에서 만든 모듈을 사용하려면:
- moduleScripts라는 이름의 변수를 moduleScripts 폴더의 위치로 설정합니다.
- 변수 이름 matchManager 및 gameSettings 을 추가합니다. 각 변수에 해당하는 스크립트를 요구합니다.
-- 서비스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"))변수 다음에 while true do 루프를 추가합니다. 게임 루프의 모든 단계가 무한대로 반복됩니다.
-- 모듈 스크립트local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local matchManager = require(moduleScripts:WaitForChild("MatchManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))-- 메인 게임 루프while true doend
휴식 시간 코딩
게임 루프가 무한히 실행되는 동안 중간 휴식은 루프를 일시 중지하고 매치에 충분한 플레이어가 있을 때만 계속해야 합니다. 이 중간 휴식을 코드하려면 잠긴 반복 루프를 위한 중간 휴식을 포함하십시오. 그 중간 휴식을 하나만 더 포함하면 주 루프
반복 루프로 코드가 루프되면 루프가 적어도 한 번 실행됩니다. 일반 루프와는 달리 조건이 끝날 때까지 확인하지 않습니다. 이렇게 하면 플레이어가 매치 시작 전에 항상 로비로 이동합니다.
In the while true do loop, type repeat and press Enter to autocomplete with the keyword 1>til1>.
while true dorepeatuntilend현재 플레이어 수가 게임 설정 모듈에서 만든 <a href="https://players.googleapis.com/players/get/getPlayers">플레이어 수</a>보다 큰지 여부를 확인하십시오.
while true dorepeatuntil #Players:GetPlayers() >= gameSettings.minimumPlayersend반복 루프에서 휴식 시작을 나타내는 프린트 문을 추가합니다. task.wait()를 사용하여 게임 설정에서 intermissionDuration 를 사용하여 휴식을 중지합니다.
while true dorepeatprint("Starting intermission")task.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayersend인쇄 문을 플레이테스트하고 적어도 두 번 표시되는지 확인하십시오. 메시지를 두 번 볼 때 메시지가 반복되지 않았음을 알 수 있습니다. 두 번째 시간에 메시지를 다시 표시하기 전에 대기 시간을 기다려야 합니다.
문제 해결 팁
이 시점에서 의도한 대로 생성하지 못하는 경우 다음 중 하나를 시도해 보세요.
- task.wait() 은 반복 루프 내에 있어야 합니다. 대기 없이 스크립트는 두 번 실행되어 Roblox Studio를 오버로드하고 오류를 발생시킵니다.
- 게임 설정 모듈에서 변수 intermissionDuration 는 1보다 작으면 안 됩니다. 만약 더 작다면, 스크립트가 너무 자주 반복되어 속도 저하 문제가 발생할 수 있습니다.
휴식 시간 종료
플레이어가 충분히 있으면, 짧은 전환 시간을 기다리게 하십시오. 그런 다음 MatchManager에서 prepareGame() 함수를 호출하여 매치에 참여하게 합니다. 기억하십시오, 이 함수는 라인을 인쇄하지만 나중에 더 많은 코드를 추가할 수 있습니다.
반복 루프 끝에 코드를 테스트하기 위해 중지 문을 더하십시오. 다음은 게임 설정의 task.wait() 변수를 사용하여 게임을 시작하는 데 필요한 시간을 테스트하는 프린트 문을 추가합니다.
while true dorepeatprint("Starting intermission")task.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayersprint("Intermission over")task.wait(gameSettings.transitionTime)end대기 후, 매치 관리자 모듈에서 prepareGame()를 호출합니다. 코드가 실행되면 출력 창에 텍스트를 표시합니다. 이 코드를 테스트하려면 다음 섹션을 기다리십시오.
while true dorepeatprint("Starting intermission")task.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayersprint("Intermission over")task.wait(gameSettings.transitionTime)matchManager.prepareGame()end
멀티플레이어 게임 테스트
현재, 코드를 실행하려면 prepareGame() 을 종료해야 합니다. 하지만, 이를 하려면 플레이어가 하나 이상 더 필요하게 됩니다. 이는 플레이테스트 버튼을 사용하는 경우에만 해당됩니다(최소 플레이어가 하나인 경우). 이를 테스트하려면 멀티플레이어
로컬 서버 시작
플레이어가 하나 이상인 코드를 테스트하려면 로컬 서버를 생성하십시오. 게시된 게임은 일반적으로 Roblox 서버에 있지만, 로컬 서버 는 시뮬레이션 플레이어가 컴퓨터에서 멀티플레이어 게임을 시뮬레이션하는 것을 시뮬레이션합니다.
로컬 서버를 시작하려면 테스트 탭 > 클라이언트 및 서버 섹션 > 플레이어 드롭다운을 GameSettings의 최소 플레이어 수로 설정하십시오. 이 레슨은 2명의 플레이어를 사용합니다.
시작을 클릭하여 서버를 시작합니다.
서버가 설정되도록 몇 초 기다리십시오. 원래 Studio 창에 추가로 여러 개의 창이 열립니다. 방화벽이나 다른 온라인 보안 소프트웨어에서 Roblox Studio에 액세스를 허용해야 할 수 있습니다.
문제 해결 팁
이 시점에서는 테스트 서버를 볼 수 없습니다. 다음 중 하나를 시도해 보세요.
- 서버 시작에 문제가 있으면 문서 Firewall and Router Issues를 두 번 확인하십시오.
- 2 또는 3과 같은 작은 수의 플레이어를 설정합니다.
- 문제가 해결되지 않으면 Studio를 다시 시작하거나 컴퓨터를 다시 시작하십시오.
로컬 서버에서 테스트
서버가 시작되면 여러 개의 창이 나타납니다. 각 창은 서버/클라이언트 관계의 다른 부분을 나타냅니다.
- 서버 (초록색 범위)가 게임을 실행합니다.
- 클라이언트 (블루 바운더)는 플레이어의 경험을 시뮬레이션합니다.
서버가 실행되면 코드가 작동하는지 확인할 수 있습니다.
녹색 경계가 있는 서버 창을 찾습니다. MatchManager 스크립트에서 호출된 인쇄 문을 확인하십시오. 반복 문이 있기 때문에 동일한 인쇄 문이 다시 표시됩니다.
테스트가 완료되면 모든 창에서 서버를 닫으려면 클리어 버튼을 클릭하십시오. 이렇게 하면 모든 서버 및 클라이언트 창을 닫고 일반적인 Studio 창으로 돌아갑니다.
문제 해결 팁
이 시점에서 의도한 인쇄 문이 표시되지 않으면 다음 중 하나를 시도하십시오.
- 함수가 prepareGame()와 같은 범위 내에 있는지 확인하십시오.
- MatchManager에서 프린트가 작동하지 않으면 모듈 스크립트의 일반적인 문제 해결 방법을 확인하십시오, 예를 들어 MatchManager 스크립트가 GameManager에 필요한지 확인하거나 해당 모듈의 테이블에 prepareGame()가 추가되었는지 확인하십시오.
완료된 스크립트
아래에는 작업을 확인하기 위해 완료된 스크립트가 있습니다.
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"))-- 메인 게임 루프while true dorepeatprint("Starting intermission")task.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayersprint("Intermission over")task.wait(gameSettings.transitionTime)matchManager.prepareGame()end
MatchManager 스크립트
local MatchManager = {}
function MatchManager.prepareGame()
print("Game starting!")
end
return MatchManager
GameSettings 스크립트
local GameSettings = {}-- 게임 변수GameSettings.intermissionDuration = 5GameSettings.roundDuration = 10GameSettings.minimumPlayers = 2GameSettings.transitionTime = 5return GameSettings