맵이 생성되면 스크립트 작성을 시작할 시간입니다.이 코스의 나머지 부분은 게임 루프의 모든 요소를 스크립팅하는 데 중점을 두게 됩니다.
스크립트 설정
전투 로얄은 모듈 스크립트와 일반 스크립트의 조합을 사용합니다. 아래는 스크립트와 기능입니다.
게임 관리자 | 스크립트. 게임 설정의 변수를 사용하여 매치 관리자에서 함수를 실행합니다 |
매치매니저 | 모듈 스크립트. 플레이어를 아레나에 보내거나 일치시간을 추적하는 등의 기능을 실행합니다. |
게임 설정 | 모듈 스크립트. 다른 스크립트에서 일반적으로 사용되는 변수를 저장합니다. |
게임설정 스크립트
게임 설정이라는 모듈 스크립트를 만들어 다른 스크립트에서 사용하는 변수, 예를 들어 매치 및 중단 시간을 저장합니다.이 변수는 나중에 GameManager 스크립트에서 사용됩니다.
In ServerStorage 에서 모듈 스크립트라는 폴더를 만들고, 해당 폴더에서 게임 설정이라는 새로운 모듈 스크립트를 만듭니다.
게임 설정을 열고 모듈 테이블의 이름을 스크립트의 이름과 일치시킵니다.
local GameSettings = {}return GameSettings모듈 테이블에서 다음 용도에 대한 변수를 추가합니다. 각 값에 대해 최선의 추측을 하고, 테스트할 때 나중에 언제든지 변경할 수 있습니다.
- 휴식 시간 길이 - 플레이어가 일치전에 대기하는 시간(초).
- 매치 기간 - 초 단위의 매치 길이.
- 최소 플레이어 - 시작하기 위해 필요한 최소 플레이어 수.
- 전환 시간 - 초 단위의 매치 전과 후 시간. 게임 루프의 부분 간 전환을 덜 갑작스럽게 만듭니다.
local GameSettings = {}-- 게임 변수GameSettings.intermissionDuration = 5GameSettings.matchDuration = 10GameSettings.minimumPlayers = 2GameSettings.transitionTime = 5return GameSettings
MatchManager 스크립트
게임 관리자에 연결된 두 번째 스크립트는 매치 관리자입니다.이 스크립트는 타이머 시작이나 플레이어 재설정과 같은 작업을 관리합니다.
MatchManager 내에는 prepareGame()라는 함수가 있으며, 플레이어를 일치전환하여 게임을 시작합니다.
서버 저장소 > 모듈 스크립트 > MatchManager라는 모듈 스크립트를 추가합니다. 모듈 테이블 이름을 변경합니다.
local MatchManager = {}return MatchManager새로운 모듈 기능을 MatchManager에 추가하여 이름을 prepareGame()로 지정합니다. 나중에 스크립트를 테스트하기 위한 인쇄 문을 포함합니다.
local MatchManager = {}function MatchManager.prepareGame()print("Game starting!")endreturn MatchManager
게임 루프 코딩
주 게임 루프는 방금 만든 변수를 사용하여 GameManager 스크립트에 코딩됩니다.게임 루프에는 중단, 경쟁, 그리고 정리 및 재설정의 세 가지 단계가 있음을 기억하십시오.
게임 관리자 스크립트
이 스크립트는 일반 서버 스크립트이므로 모듈 스크립트 폴더 대신 ServerScriptService에 넣으십시오.실제 게임 루프는 while true do 루프에 있을 것입니다.
ServerScriptService에서 GameManager라는 새 스크립트를 만듭니다.
모듈 스크립트가 있는 서비스 "ServerStorage"에 대한 변수를 추가합니다.그런 다음 휴식 중에 플레이어 수를 확인하는 데 필요한 변수를 서비스 "플레이어"에 추가합니다.
-- 서비스local ServerStorage = game:GetService("ServerStorage")local Players = game:GetService("Players")이전에 만든 모듈을 사용하려면:
- Set a variable named 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
휴식 코드 작성
게임 루프가 무한히 실행되는 동안 휴식은 루프를 일시 중지하고 매치에 충분한 플레이어가 있을 때만 계속해야 합니다.이 일시 중지를 코드하려면 while 루프에 중단을 위한 중첩 반복 루프를 포함하십시오.그 중첩 루프는 플레이어가 충분할 때까지 반복하여 주요 루프를 일시 중지합니다.플레이어가 충분하면 종료되어 플레이어를 일치전환합니다.
반복 루프 를 사용하여 루프의 코드가 최소 한 번 실행됩니다. while 루프와 달리 루프가 끝날 때까지 조건을 확인하지 않습니다.이렇게 하면 플레이어가 항상 매치 전에 로비로 이동하게 됩니다.
while true do 루프에서 키워드 repeat 를 입력하고 키워드 Enter 로 자동 완성하려면 until 을 누르십시오.
while true dorepeatuntilend현재 플레이어 수가 (#Players:GetPlayers()) 게임설정 모듈에서 이전에 생성된 minimumPlayers 변수와 더 크거나 같은지 확인하십시오.
while true dorepeatuntil #Players:GetPlayers() >= gameSettings.minimumPlayersend반복 루프에서 중단이 시작된다는 인쇄 문을 추가하십시오.게임 설정에서 를 사용하여 중단을 일시 중지하세요.
while true dorepeatprint("Starting intermission")task.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayersend플레이테스트를 수행하고 출력 문 "Starting intermission"가 적어도 두 번 표시되는지 확인합니다.메시지를 두 번 보면 반복 루프가 충분한 플레이어를 찾지 못하고 다시 실행되지 않았음을 알 수 있습니다.메시지를 두 번째로 보려면 중단 시간을 기다려야 합니다.
문제 해결 팁
이 시점에서 의도한 대로 스폰하지 않는 경우 다음 중 하나를 시도하십시오.
- task.wait() 반복 루프 내에 있어야 합니다.대기 없이 스크립트는 1초 내에 너무 많이 실행되어 Roblox Studio를 과부하시키고 오류를 발생시킵니다.
- 게임 설정 모듈에서 변수 intermissionDuration 는 1보다 커야 합니다. 낮으면 스크립트가 너무 자주 반복되어 지연 문제가 발생할 수 있습니다.
휴식 종료
플레이어가 충분히 있으면 짧은 전환 시간을 기다리게 합니다.그런 다음 MatchManager의 prepareGame() 함수를 호출하여 매치에 보내십시오.기억하십시오, 그 함수는 단지 한 줄을 출력하지만 나중에 더 많은 코드를 추가할 것입니다.
반복 루프가 끝나면 중단이 끝났다고 말하는 인쇄 문을 추가하여 코드를 테스트합니다.그런 다음 GameSetting의 transitionTime``Library.task.wait()
while true dorepeatprint("Starting intermission")task.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayersprint("Intermission over")task.wait(gameSettings.transitionTime)end대기 후, MatchManager 모듈에서 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 서버에 있지만, 로컬 서버 는 시뮬레이션된 플레이어로 컴퓨터에서 멀티플레이어 게임을 시뮬레이션합니다.
로컬 서버를 시작하려면, 테스트 탭 > 클라이언트 및 서버 섹션에서 GameSetting의 minimumPlayers변수에 플레이어 드롭다운을 플레이어 수로 설정합니다.이 레슨은 2명의 플레이어를 사용합니다.
서버를 시작하려면 시작을 클릭하십시오.
서버가 설정될 때까지 몇 초 기다리십시오.원래 Studio 창 외에 여러 창이 열립니다.방화벽이나 다른 온라인 보안 소프트웨어에서 Roblox Studio에 액세스할 수 있도록 허용해야 할 수 있습니다.
문제 해결 팁
이 시점에서 테스트 서버를 볼 수 없으면 다음 중 하나를 시도하십시오.
- 서버 시작과 관련된 문제가 있는 경우 기사 방화벽 및 라우터 문제를 다시 확인하십시오.
- 플레이어 수를 2~3처럼 작은 수로 설정합니다.
- 문제가 해결되지 않으면 Studio를 다시 시작하거나 컴퓨터를 다시 시작하십시오.
로컬 서버에서 테스트
서버가 시작되면 여러 창이 나타납니다. 각각은 서버/클라이언트 관계의 다른 부분을 나타냅니다.
- 서버 (녹색 경계)가 게임을 실행합니다.
- 클라이언트 (파란색 테두리)는 플레이어의 경험을 시뮬레이션합니다.


서버가 실행되면 코드가 작동하는지 확인할 수 있습니다.
녹색 경계가 있는 서버 창을 찾으십시오.MatchManager 스크립트에서 호출된 인쇄 문을 확인합니다.반복 루프가 있기 때문에 동일한 인쇄 문이 반복되는 것을 볼 수 있습니다.
테스트가 완료되면, 모든 창에서 정리 버튼으로 서버를 닫습니다.이렇게 하면 모든 서버 및 클라이언트 창이 닫히고 일반 스튜디오 창으로 돌아갑니다.
문제 해결 팁
이 시점에서 의도한 인쇄 문이 나타나지 않으면 다음 중 하나를 시도하십시오.
- prepareGame()와 같은 함수가 while 진실 루프의 범위에 있는지 확인하십시오.
- MatchManager에서 인쇄가 작동하지 않으면 MatchManager 스크립트가 GameManager에 필요하거나 해당 모듈의 테이블에 prepareGame()가 추가되었는지 확인하는 일반적인 문제 해결 방법을 확인하십시오.
완료된 스크립트
아래는 작업을 확인하기 위한 완료된 스크립트입니다.
게임 관리자 스크립트
-- 서비스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
게임설정 스크립트
local GameSettings = {}-- 게임 변수GameSettings.intermissionDuration = 5GameSettings.roundDuration = 10GameSettings.minimumPlayers = 2GameSettings.transitionTime = 5return GameSettings