정리 및 재설정

*이 콘텐츠는 AI(베타)를 사용해 번역되었으며, 오류가 있을 수 있습니다. 이 페이지를 영어로 보려면 여기를 클릭하세요.

게임의 마지막 단계를 코딩할 시간: 정리 및 재설정.이 단계의 코드는 게임 루프가 중단되고 미래의 경기가 각 플레이어에게 동일하게 시작되도록 합니다.

GUI 업데이트

정리 및 재설정을 수행하기 전에 DisplayManager를 사용하여 적절한 상태를 표시하여 플레이어에게 게임이 종료된 방법을 알립니다.

승자의 이름 가져오기

승리한 플레이어의 이름을 가져와 시작하세요, 만약 하나라도 있다면.이전에는 코드가 활성 플레이어 테이블의 크기가 1로 줄어들었는지 확인했습니다.나머지 플레이어의 이름을 가져오려면 해당 테이블의 첫 번째 인덱스에서 이름을 반환합니다.

  1. 플레이어 관리자에서 getWinnerName()라는 새로운 모듈 기능을 시작합니다.


    function PlayerManager.getWinnerName()
    end
    -- 이벤트
    Players.PlayerAdded:Connect(onPlayerJoin)
  2. if 문을 추가하여 어떤 것이 있는지 확인하면 activePlayers[1]에서 실행합니다.테이블 수가 이전에 확인되었지만, 플레이어가 연결을 끊거나 게임을 떠났을 수도 있습니다.


    function PlayerManager.getWinnerName()
    local winningPlayer = activePlayers[1]
    if winningPlayer then
    end
    end
  3. if 문에서:

    • 플레이어의 이름을 반환합니다.
    • 나머지는 오류 문자열을 반환합니다.

    function PlayerManager.getWinnerName()
    local winningPlayer = activePlayers[1]
    if winningPlayer then
    return winningPlayer.Name
    else
    return "Error: No winning player found"
    end
    end

최종 상태 가져오기

모듈 함수를 사용하여 타이머가 종료되거나 한 플레이어가 남은 경우 올바른 최종 상태에서 정보를 가져옵니다.그런 다음 해당 상태 변수를 DisplayManager에 보내서 적절한 메시지로 상태 GUI를 업데이트합니다.

  1. In 매치 관리자 , 매개 변수로 명명된 새 모듈 기능 getEndStatus() 을 코딩하여 매개 변수 이름이 endState 인 새 모듈을 생성합니다.전송할 메시지를 저장하려면 statusToReturn이라는 빈 변수를 추가하십시오.


    function MatchManager.prepareGame()
    playerManager.sendPlayersToMatch()
    matchStart:Fire()
    end
    function MatchManager.getEndStatus(endState)
    local statusToReturn
    end
    matchStart.Event:Connect(startTimer)
    matchEnd.Event:Connect(stopTimer)
    return MatchManager
  2. if와 elseif 문을 사용하여 statusToReturn의 값을 설정합니다.최종 상태 변수: FoundWinnerTimerUp을 확인합니다.오류 검사를 위해 끝에 다른 것을 포함하십시오.


    function MatchManager.getEndStatus(endState)
    local statusToReturn
    if endState == gameSettings.endStates.FoundWinner then
    elseif endState == gameSettings.endStates.TimerUp then
    else
    end
    end
  3. 각 조건에 다음 추가:

    FoundWinner

    • 승자를 사용하는 변수 playerManager.getWinnerName().
    • 업데이트 statusToReturn 승자를 알리는 문자열로 업데이트합니다.

    TimerUp

    • 업데이트 statusToReturn 시간이 끝났음을 알리는 문자열로 업데이트합니다.

    Else

    • 최종 게임 메시지를 가져오는 데 문제가 있는 경우 오류 메시지로 statusToReturn를 수행합니다.

    function MatchManager.getEndStatus(endState)
    local statusToReturn
    if endState == gameSettings.endStates.FoundWinner then
    local winnerName = playerManager.getWinnerName()
    statusToReturn = "Winner is : " .. winnerName
    elseif endState == gameSettings.endStates.TimerUp then
    statusToReturn = "Time ran out!"
    else
    statusToReturn = "Error found"
    end
    end
  4. return statusToReturn를 입력하여 메시지를 다시 보내십시오.


    function MatchManager.getEndStatus(endState)
    local statusToReturn
    if endState == gameSettings.endStates.FoundWinner then
    local winnerName = playerManager.getWinnerName()
    statusToReturn = "Winner is : " .. winnerName
    elseif endState == gameSettings.endStates.TimerUp then
    statusToReturn = "Time ran out!"
    else
    statusToReturn = "Error found"
    end
    return statusToReturn
    end

표시 및 테스트

게임 관리자에서 업데이트된 공지를 가져와 디스플레이 매니저를 사용하여 플레이어에게 표시합니다.

  1. Open 게임 관리자 .while true do 루프에서, 삭제 마지막 인쇄 문을 삭제합니다.그런 다음 endStatus라는 변수를 만듭니다.그것을 matchManager.getEndStatus(endState)과 동일하게 설정합니다.


    while true do
    displayManager.updateStatus("Waiting for Players")
    repeat
    task.wait(gameSettings.intermissionDuration)
    until #Players:GetPlayers() >= gameSettings.minimumPlayers
    displayManager.updateStatus("Get ready!")
    task.wait(gameSettings.transitionTime)
    matchManager.prepareGame()
    local endState = matchEnd.Event:Wait()
    local endStatus = matchManager.getEndStatus(endState)
    end
  2. GUI 레이블에 반환된 메시지를 표시하려면 displayManager.updateStatus()를 호출하고 endStatus를 전달하십시오.


    local endStatus = matchManager.getEndStatus(endState)
    displayManager.updateStatus(endStatus)
  3. 따라서 게임이 일시 중지되어 플레이어가 메시지를 볼 수 있고, transitionTime를 사용하여 대기 시간을 추가합니다.


    local endStatus = matchManager.getEndStatus(endState)
    displayManager.updateStatus(endStatus)
    task.wait(gameSettings.transitionTime)
  4. 테스트 서버를 시작 하고 플레이어가 시간이 끝나고 승리하는 플레이어 조건에 대해 다음 메시지를 보는지 확인하십시오.

    시간이 끝났는 조건

    승리하는 플레이어 조건

문제 해결 팁

이 시점에서 메시지를 볼 수 없으면 다음 중 하나를 시도하십시오.

  • 최종 상태 메시지가 "오류 발견"인 경우 조건 중 하나도 성공하지 않았습니다. 코드를 MatchManager.getEndStatus() 코드 샘플과 비교하십시오.
  • 끝 상태가 표시되지 않으면 메시지를 displayManager에 보낸 후 task.wait(gameSettings.transitionTime) 가 표시되는지 확인하십시오.

새로운 매치 시작

새로운 매치를 시작하기 전에 짧은 전환이 있을 것입니다.이렇게 하면 플레이어가 최종 상태를 확인할 시간이 생기고 로비로 순간이동하는 것이 덜 갑작스럽게 느껴집니다.

전환의 끝에서 남은 플레이어는 아레나에서 제거되고 모든 코드가 재설정됩니다.이렇게 하면 플레이어가 게임의 클린 버전으로 다음 경기를 시작하게 됩니다.

전환 처리

플레이어가 전환 상태로 이동하면 무기를 제거합니다.

  1. 플레이어 관리자에서 로컬 함수를 찾습니다.아래에 강조 표시된 코드를 복사하고 붙여넣으십시오 removePlayerWeapon() .코드는 활성으로 장착되었거나 플레이어의 배낭에 있는 개별 플레이어의 무기를 제거합니다.


    local function removePlayerWeapon(whichPlayer)
    -- 연결이 끊어지거나 떠났을 경우 플레이어가 존재하는지 확인합니다.
    if whichPlayer then
    local character = whichPlayer.Character
    -- 플레이어가 현재 캐릭터에 가지고 있는 경우
    local weapon = character:FindFirstChild("Weapon")
    if weapon then
    weapon:Destroy()
    end
    -- 플레이어가 백팩에 무기를 가지고 있는 경우
    local backpackWeapon = whichPlayer.Backpack:FindFirstChild("Weapon")
    if backpackWeapon then
    backpackWeapon:Destroy()
    end
    else
    print("No player to remove weapon")
    end
    end
  2. 새로운 모듈 기능 removeAllWeapons() 이름으로 시작하십시오.


    function PlayerManager.removeAllWeapons()
    end
    -- 이벤트
    Players.PlayerAdded:Connect(onPlayerJoin)
    return PlayerManager
  3. 해당 함수에서는 for 루프를 사용하여 활성 플레이어 테이블을 통과합니다. 루프에서 removePlayerWeapon()를 호출하고 찾은 플레이어를 전달합니다.


    function PlayerManager.removeAllWeapons()
    for playerKey, whichPlayer in activePlayers do
    removePlayerWeapon(whichPlayer)
    end
    end

매치 사이에 클린하게

정리는 MatchManager의 자체 기능이 됩니다.지금은 정리가 이전에 만든 함수를 사용하여 플레이어 무기를 제거할 것입니다.게임을 확장함에 따라 매치 중에 변경된 맵을 재설정하는 함수와 같은 더 많은 것들이 추가될 수 있습니다.

  1. MatchManager를 엽니다. 새로운 모듈 기능인 cleanupMatch() 을 추가합니다. 그 함수에서 playerManager.removeAllWeapons() 를 호출합니다.


    function MatchManager.cleanupMatch()
    playerManager.removeAllWeapons()
    end
    matchStart.Event:Connect(startTimer)
    matchEnd.Event:Connect(stopTimer)
    return MatchManager
  2. 다음으로 정리 함수를 호출합니다.Open 게임 관리자 를 열고 while true do 루프를 찾습니다.따라서 플레이어는 종료 휴식 중에 무기가 제거되고, 마지막 matchManager.cleanupMatch() 전에 task.wait() 호출합니다.


    while true do
    displayManager.updateStatus("Waiting for Players")
    repeat
    task.wait(gameSettings.intermissionDuration)
    until #Players:GetPlayers() >= gameSettings.minimumPlayers
    displayManager.updateStatus("Get ready!")
    task.wait(gameSettings.transitionTime)
    matchManager.prepareGame()
    local endState = matchEnd.Event:Wait()
    local endStatus = matchManager.getEndStatus(endState)
    displayManager.updateStatus(endStatus)
    matchManager.cleanupMatch()
    task.wait(gameSettings.transitionTime)
    end
  3. 테스트 서버를 시작하고 매치를 실행합니다. 타이머가 소진되면 플레이어의 무기가 종료 게임 휴식 중에 제거되는지 확인하십시오.

    경기 중에
    경기 후

일치 항목 재설정

게임에서 플레이어가 경기가 끝난 후에도 아직 경기장에 있는 것과 같은 몇 가지 다른 점을 알아챘을 수도 있습니다.일치가 지워지면 다음으로 게임을 재설정합니다.여기에는 아레나에 있는 플레이어를 로비로 다시 보내고 활성 플레이어 테이블을 지우는 것이 포함됩니다.재설정이 있으면 게임 루프가 무한히 실행될 수 있습니다.

먼저, 플레이어를 로비로 돌려보내는 함수를 시작하십시오.

  1. 플레이어 관리자에서:

    • 모듈 기능 resetPlayers()라는 이름의 함수를 만듭니다.
    • 활성 플레이어를 반복하기 위해 for 루프를 추가합니다.
    • 루프에서 respawnPlayerInLobby()를 호출하고 플레이어를 매개 변수로 전달합니다.

    function PlayerManager.resetPlayers()
    for playerKey, whichPlayer in activePlayers do
    respawnPlayerInLobby(whichPlayer)
    end
    end
    -- 이벤트
    Players.PlayerAdded:Connect(onPlayerJoin)
    return PlayerManager
  2. 다음 일치에 대해 activePlayers 테이블이 비어 있도록 설정하여 빈 테이블로 재설정하는 빠른 방법인 {} 와 동일하게 설정하여 다음 일치에 대해 테이블이 비어 있는지 확인하십시오.


    function PlayerManager.resetPlayers()
    for playerKey, whichPlayer in activePlayers do
    respawnPlayerInLobby(whichPlayer)
    end
    activePlayers = {}
    end
  3. Open MatchManager. 코드 새로운 모듈 기능인 resetMatch() 을 작성하고 playerManager.resetPlayers() 를 호출합니다.


    function MatchManager.resetMatch()
    playerManager.resetPlayers()
    end
    matchStart.Event:Connect(startTimer)
    matchEnd.Event:Connect(stopTimer)
    return MatchManager
  4. 다시 게임 관리자 로 돌아갑니다. while true do 루프의 끝에서 matchManager.resetMatch()합니다.


    while true do
    displayManager.updateStatus("Waiting for Players")
    repeat
    task.wait(gameSettings.intermissionDuration)
    until #Players:GetPlayers() >= gameSettings.minimumPlayers
    displayManager.updateStatus("Get ready!")
    task.wait(gameSettings.transitionTime)
    matchManager.prepareGame()
    local endState = matchEnd.Event:Wait()
    local endStatus = matchManager.getEndStatus(endState)
    displayManager.updateStatus(endStatus)
    matchManager.cleanupMatch()
    task.wait(gameSettings.transitionTime)
    matchManager.resetMatch()
    end
  5. 테스트 서버를 시작하고 매치를 실행합니다. 오류 없이 최소 2개의 게임 루프를 통과할 수 있는지 확인하십시오.

완료된 스크립트

아래는 작업을 확인하기 위한 완료된 스크립트입니다.

게임 관리자 스크립트


-- 서비스
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 displayManager = require(moduleScripts:WaitForChild("DisplayManager"))
-- 이벤트
local events = ServerStorage:WaitForChild("Events")
local matchEnd = events:WaitForChild("MatchEnd")
while true do
displayManager.updateStatus("Waiting for Players")
repeat
task.wait(gameSettings.intermissionDuration)
until #Players:GetPlayers() >= gameSettings.minimumPlayers
displayManager.updateStatus("Get ready!")
task.wait(gameSettings.transitionTime)
matchManager.prepareGame()
local endState = matchEnd.Event:Wait()
local endStatus = matchManager.getEndStatus(endState)
displayManager.updateStatus(endStatus)
matchManager.cleanupMatch()
task.wait(gameSettings.transitionTime)
matchManager.resetMatch()
end

MatchManager 스크립트


local MatchManager = {}
-- 서비스
local ServerStorage = game:GetService("ServerStorage")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- 모듈 스크립트
local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))
local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
local displayManager = require(moduleScripts:WaitForChild("DisplayManager"))
local timer = require(moduleScripts:WaitForChild("Timer"))
-- 이벤트
local events = ServerStorage:WaitForChild("Events")
local matchStart = events:WaitForChild("MatchStart")
local matchEnd = events:WaitForChild("MatchEnd")
-- 값
local displayValues = ReplicatedStorage:WaitForChild("DisplayValues")
local timeLeft = displayValues:WaitForChild("TimeLeft")
-- 매치 시간을 추적하기 위해 사용할 새로운 타이머 개체를 생성합니다.
local myTimer = timer.new()
-- 로컬 함수
local function stopTimer()
myTimer:stop()
end
local function timeUp()
matchEnd:Fire(gameSettings.endStates.TimerUp)
end
local function startTimer()
myTimer:start(gameSettings.matchDuration)
myTimer.finished:Connect(timeUp)
while myTimer:isRunning() do
-- +1을 추가하면 타이머 표시가 0이 아닌 1로 끝나도록 보장합니다.
timeLeft.Value = (myTimer:getTimeLeft() + 1) // 1
-- 대기 시간을 설정하지 않으면 더 정확한 루프가 제공됩니다
task.wait()
end
end
-- 모듈 기능
function MatchManager.prepareGame()
playerManager.sendPlayersToMatch()
matchStart:Fire()
end
function MatchManager.getEndStatus(endState)
local messageToReturn
if endState == gameSettings.endStates.FoundWinner then
local winnerName = playerManager.getWinnerName()
messageToReturn = "Winner is : " .. winnerName
elseif endState == gameSettings.endStates.TimerUp then
messageToReturn = "Time ran out!"
else
messageToReturn = "Error found"
end
return messageToReturn
end
function MatchManager.cleanupMatch()
playerManager.removeAllWeapons()
end
function MatchManager.resetMatch()
playerManager.resetPlayers()
end
matchStart.Event:Connect(startTimer)
matchEnd.Event:Connect(stopTimer)
return MatchManager

플레이어 관리자 스크립트


local PlayerManager = {}
-- 서비스
local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- 모듈
local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
-- 이벤트
local events = ServerStorage:WaitForChild("Events")
local matchEnd = events:WaitForChild("MatchEnd")
-- 맵 변수
local lobbySpawn = workspace.Lobby.StartSpawn
local arenaMap = workspace.Arena
local spawnLocations = arenaMap.SpawnLocations
-- 값
local displayValues = ReplicatedStorage:WaitForChild("DisplayValues")
local playersLeft = displayValues:WaitForChild("PlayersLeft")
-- 플레이어 변수
local activePlayers = {}
local playerWeapon = ServerStorage.Weapon
local function checkPlayerCount()
if #activePlayers == 1 then
matchEnd:Fire(gameSettings.endStates.FoundWinner)
print("Found winner")
end
end
local function removeActivePlayer(player)
print("removing player")
for playerKey, whichPlayer in activePlayers do
if whichPlayer == player then
table.remove(activePlayers, playerKey)
playersLeft.Value = #activePlayers
checkPlayerCount()
end
end
end
local function respawnPlayerInLobby(player)
player.RespawnLocation = lobbySpawn
player:LoadCharacter()
end
local function preparePlayer(player, whichSpawn)
player.RespawnLocation = whichSpawn
player:LoadCharacter()
local character = player.Character or player.CharacterAdded:Wait()
-- 플레이어에게 도구 제공
local sword = playerWeapon:Clone()
sword.Parent = character
local humanoid = character:WaitForChild("Humanoid")
humanoid.Died:Connect(function()
respawnPlayerInLobby(player)
removeActivePlayer(player)
end)
end
local function onPlayerJoin(player)
player.RespawnLocation = lobbySpawn
end
local function removePlayerWeapon(whichPlayer)
-- 연결이 끊어지거나 떠났을 경우 플레이어가 존재하는지 확인합니다.
if whichPlayer then
local character = whichPlayer.Character
-- 플레이어가 현재 캐릭터에 가지고 있는 경우
local weapon = character:FindFirstChild("Weapon")
if weapon then
weapon:Destroy()
end
-- 플레이어가 백팩에 무기를 가지고 있는 경우
local backpackWeapon = whichPlayer.Backpack:FindFirstChild("Weapon")
if backpackWeapon then
backpackWeapon:Destroy()
end
else
print("No player to remove weapon")
end
end
function PlayerManager.sendPlayersToMatch()
local availableSpawnPoints = spawnLocations:GetChildren()
for playerKey, whichPlayer in Players:GetPlayers() do
table.insert(activePlayers,whichPlayer)
-- 생성 위치를 가져와서 테이블에서 제거하여 다음 플레이어가 다음 스폰을 얻도록 합니다
local spawnLocation = table.remove(availableSpawnPoints, 1)
preparePlayer(whichPlayer, spawnLocation)
end
playersLeft.Value = #activePlayers
end
function PlayerManager.getWinnerName()
local winningPlayer = activePlayers[1]
if winningPlayer then
return winningPlayer.Name
else
return "Error: No player found"
end
end
function PlayerManager.removeAllWeapons()
for playerKey, whichPlayer in activePlayers do
removePlayerWeapon(whichPlayer)
end
end
function PlayerManager.resetPlayers()
for playerKey, whichPlayer in activePlayers do
respawnPlayerInLobby(whichPlayer)
end
activePlayers = {}
end
-- 이벤트
Players.PlayerAdded:Connect(onPlayerJoin)
return PlayerManager