플레이어 관리

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

게임 루프가 코딩되었으므로 이제 특징을 추가하기 시작할 시간입니다.일치중에 플레이어가 이동갈 수 있습니다.이로 인해 플레이어를 매치에 보내거나 활성 플레이어를 추적하는 작업과 같은 코드가 필요합니다.이러한 작업을 관리하려면 PlayerManager 라는 모듈 스크립트를 만듭니다.

이 스크립트는 무기로 플레이어를 아레나에 보내는 함수를 시작하고 나중에 시리즈에서 확장됩니다.

스크립트 설정

플레이어 관리자에는 다른 스크립트에서 사용하는 함수가 포함되어 있으므로 모듈 스크립트가 될 것입니다.

  1. 서버 저장소 > 모듈 스크립트에서 PlayerManager라는 새 모듈 스크립트를 추가합니다.그런 다음 스크립트 이름에 맞게 모듈 테이블의 이름을 변경하고 로컬 및 모듈 함수에 대한 주석을 추가합니다.


    local PlayerManager = {}
    -- 로컬 함수
    -- 모듈 기능
    return PlayerManager
  2. 팔로잉대한 로컬 변수 추가:

    서비스:

    • 플레이어 - 플레이어가 게임에 참여하거나 떠났는지 알아보세요.
    • 서버스토리지 - 플레이어 무기의 저장소.

    맵 및 플레이어 변수:

    • 로비 스폰, 아레나 폴더, 아레나 스폰 폴더 - 플레이어를 다른 지역으로 순간이동하는 데 사용됩니다.
    • 활성 플레이어 배열 - 현재 게임에 있는 플레이어를 추적합니다.

    local PlayerManager = {}
    -- 서비스
    local Players = game:GetService("Players")
    local ServerStorage = game:GetService("ServerStorage")
    -- 맵 변수
    local lobbySpawn = workspace.Lobby.StartSpawn
    local arenaMap = workspace.Arena
    local spawnLocations = arenaMap.SpawnLocations
    -- 플레이어 변수
    local activePlayers = {}
    -- 로컬 함수
    -- 모듈 기능
    return PlayerManager
  3. 내부에 테스트 인쇄가 있는 모듈 함수 sendPlayersToMatch() 를 만들어 이름을 지정합니다.Create a module function named with a test print inside.


    -- 로컬 함수
    -- 모듈 기능
    function PlayerManager.sendPlayersToMatch()
    print("Sending players to match")
    end
    return PlayerManager

로비에서 플레이어 생성

현재 여러 스폰 위치가 있으므로 플레이어가 게임에 참여할 때 랜덤 위치에서 스폰합니다.플레이어가 로비에서 생성되도록 하려면 플레이어의 RespawnLocation 속성을 변경하십시오.

  1. 매개 변수 onPlayerJoin() 로 이름이 player 인 새로운 로컬 함수를 생성합니다.Create a new local function named with a parameter of .그 함수에서 플레이어의 재생 위치를 이전에 만든 로비 생성 변수로 설정합니다.


    -- 로컬 함수
    local function onPlayerJoin(player)
    player.RespawnLocation = lobbySpawn
    end
  2. 모듈 기능 아래에 이벤트 섹션을 추가하고, onPlayerJoin() 를 플레이어 서비스의 PlayerAdded 이벤트에 연결합니다.


    -- 모듈 기능
    function PlayerManager.sendPlayersToMatch()
    print("Sending players to match")
    end
    -- 이벤트
    Players.PlayerAdded:Connect(onPlayerJoin)

연결 및 테스트

이제 모듈을 연결하고 테스트할 수 있습니다.PlayerManager가 생성되면 해당 모듈 스크립트의 코드가 실행되고 로비로 플레이어를 보낼 수 있도록 요구합니다.

  1. MatchManager 로 돌아가서 팔로잉위한 변수를 생성합니다:

    • ServerStorage 서비스.
    • ModuleScripts 폴더, ServerStorage의 자식.
    • PlayerManager 모듈 스크립트, 모듈 스크립트의 자식.

    local MatchManager = {}
    -- 서비스
    local ServerStorage = game:GetService("ServerStorage")
    -- 모듈 스크립트
    local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
    local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))
    function MatchManager.prepareGame()
    playerManager.sendPlayersToMatch()
    end
    return MatchManager
  2. 최소 플레이어만 테스트하기 위해 로컬 서버 를 사용하십시오 . 팔로잉확인하십시오:

    • 모든 플레이어가 로비에서 생성됩니다.
    • 플레이어 관리자의 인쇄 문이 출력 창에 나타납니다.
  3. 완료되면 정리를 클릭하여 서버를 종료합니다.

문제 해결 팁

이 시점에서 스크립트의 일부가 의도한 대로 작동하지 않습니다. 다음 중 하나를 시도하십시오.

  • 아레나 또는 로비 > 스타트스폰의 위치와 같은 부품의 이름을 확인하십시오, 특히 교육에서 지시한 것과 다르게 이름을 지정한 경우.
  • 모듈이 require() 함수를 사용하여 각 스크립트에 필요하고 올바르게 철자되었는지 확인하십시오.

플레이어를 아레나에 보내기

이제 플레이어가 로비에 생성되었으므로 휴식이 끝나면 매치로 순간이동합니다.플레이어의 RespawnLocation 를 플레이어 개체에 있는 함수를 사용하여 아레나의 스폰 위치로 변경하여 ReloadCharacter() 합니다.

  1. 아래의 PlayerManager 스크립트로 이동하여 onPlayerJoin() , 새로운 로컬 함수 이름인 preparePlayer() 을 추가합니다.두 매개변수를 포함하십시오: playerwhichSpawn, 전송할 스폰 위치입니다.


    local activePlayers = {}
    -- 로컬 함수
    local function onPlayerJoin(player)
    player.RespawnLocation = lobbySpawn
    end
    local function preparePlayer(player, whichSpawn)
    end
    -- 모듈 기능
    function PlayerManager.sendPlayersToMatch()
    print("Sending players to match")
    end
  2. 플레이어의 재생 위치를 whichSpawn로 설정합니다.


    local function preparePlayer(player, whichSpawn)
    player.RespawnLocation = whichSpawn
    end
  3. LoadCharacter()를 사용하여 캐릭터를 재로드하게 하고, 플레이어는 새로 할당된 위치에서 재생성됩니다.


    local function preparePlayer(player, whichSpawn)
    player.RespawnLocation = whichSpawn
    player:LoadCharacter()
    end

플레이어를 스폰에 보내기

활성 플레이어 배열을 반복하기 위해 for 루프를 사용하여 각 플레이어가 아레나에서 다른 스폰 위치로 순간이동되도록 하여 각 플레이어가 순환되는지 확인하십시오.for 루프를 사용하면 플레이어 배열의 모든 값을 통과할 수 있으므로 스크립트가 다양한 플레이어 수에 적응할 수 있습니다.

  1. sendPlayersToMatch() 함수에서 변수를 사용하여 아레나 > SpawnLocations 폴더의 자식을 가져와 모든 아레나 스폰 위치의 배열을 만듭니다.


    --모듈 기능
    function PlayerManager.sendPlayersToMatch()
    local arenaSpawns = spawnLocations:GetChildren()
    end
  2. 아래의 for 루프를 추가하여 모든 플레이어의 배열을 가져와 그 중 하나씩 반복하세요. 플레이어를 가져오려면 다음을 입력하세요: Players:GetPlayers() .


    function PlayerManager.sendPlayersToMatch()
    local arenaSpawns = spawnLocations:GetChildren()
    for playerKey, whichPlayer in Players:GetPlayers() do
    end
    end

추적 및 생성

게임이 실행될 때, 어떤 사용자가 플레이하고 있는지 식별하여 아레나에서 생성될 수 있어야 합니다.라운드가 시작되면 모든 플레이어가 활성 플레이어 배열에서 추적됩니다.그 배열은 순간이동이나 무기 할당과 같은 다양한 기능에 사용되며, 라운드 중에 로비에 남아있는 플레이어가 영향을 받지 않도록 합니다.

  1. for 루프에서는 table.insert() 를 사용하여 두 매개 변수를 사용하여 activePlayers 배열과 플레이어를 추가합니다.


    function PlayerManager.sendPlayersToMatch()
    local arenaSpawns = spawnLocations:GetChildren()
    for playerKey, whichPlayer in Players:GetPlayers() do
    table.insert(activePlayers, whichPlayer)
    end
    end
  2. 아레나에서 스폰 위치를 가져오려면 spawnLocation 첫 번째 인덱스로 설정하고 arenaSpawns 스폰 위치를 가져옵니다.


    for playerKey, whichPlayer in Players:GetPlayers() do
    table.insert(activePlayers, whichPlayer)
    local spawnLocation = arenaSpawns[1]
    end
  3. 호출 preparePlayer()whichPlayerspawnLocation 를 전달합니다.그런 다음, 생성 위치가 사용되었으므로 제거 다음 플레이어가 다른 스폰을 얻도록 테이블에서 제거합니다.


    for playerKey, whichPlayer in Players:GetPlayers() do
    table.insert(activePlayers, whichPlayer)
    local spawnLocation = table.remove(arenaSpawns, 1)
    preparePlayer(whichPlayer, spawnLocation)
    end
  4. 플레이어가 아레나로 보내지는 로컬 서버에서 테스트.플레이어는 로비로 돌려보내는 코드가 아직 플레이스않았기 때문에 같은 위치에서 계속 재생성됩니다.

문제 해결 팁

이 시점에서 의도한 결과를 보지 못했으면 다음 중 하나를 시도하십시오.

  • 에서 GetPlayers() , 문에서 두 개의 닫는 괄호가 있는지 확인하십시오, 예를 들어 Class.Players.GetPlayers(|Players:GetPlayers()) 문에서.
  • 모듈 스크립트의 함수 호출 시리즈를 확인하십시오. 예를 들어, matchManager.prepareGame()playerManager.sendPlayersToMatch() 를 호출해야 합니다.

플레이어에게 무기 주기

라운드가 시작되면 아레나의 각 플레이어에게 사용할 무기가 제공됩니다.

도구 추가

플레이어 무기는 도구가 됩니다. Roblox의 모든 도구를 사용할 수는 있지만, 시작하기 위해 샘플 검을 제공했습니다.

  1. 도구 상자에서 무기를 가져오거나 자체 생성(참조 Tools )하십시오.

  2. 무기를 ServerStorage에 배치하십시오. 자체 도구를 생성하는 경우 도구의 이름이 무기라는 점을 확인하십시오, 이는 나중에 스크립트에서 사용될 것입니다.

플레이어에게 도구 제공

이제 도구가 저장소에 있으므로 활성 플레이어 배열을 통과하고 각 사용자에게 도구를 제공하는 스크립트를 작업하십시오.

  1. PlayerManager에서 ServerStorage의 무기에 대한 변수 playerWeapon를 추가합니다.


    -- 맵 변수
    local lobbySpawn = workspace.Lobby.StartSpawn
    local arenaMap = workspace.Arena
    local spawnLocations = arenaMap.SpawnLocations
    -- 플레이어 변수
    local activePlayers = {}
    local playerWeapon = ServerStorage.Weapon
  2. In preparePlayer() , 플레이어의 캐릭터를 가져오기 위해 다음 코드를 붙여넣으세요.


    local function preparePlayer(player, whichSpawn)
    player.RespawnLocation = whichSpawn
    player:LoadCharacter()
    local character = player.Character or player.CharacterAdded:Wait()
    end
  3. 새로운 변수 sword를 만들고 Clone() 함수를 사용하여 ServerStorage에 무기의 복사본을 생성합니다.그런 다음 플레이어의 캐릭터에 검을 부모로 지정합니다.


    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
    end
  4. 모든 플레이어가 아레나에 전송될 때 도구를 받는지 확인하기 위해 로컬 서버 에서 테스트합니다.테스트를 계속하면 중단이 계속 재시작되므로 플레이어가 몇 초마다 재생성됩니다.다음 단원에서 해결됩니다.

완료된 스크립트

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

게임 관리자 스크립트


-- 서비스
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
repeat
task.wait(gameSettings.intermissionDuration)
print("Restarting intermission")
until #Players:GetPlayers() >= gameSettings.minimumPlayers
print("Intermission over")
task.wait(gameSettings.transitionTime)
matchManager.prepareGame()
end

MatchManager 스크립트


local MatchManager = {}
-- 서비스
local ServerStorage = game:GetService("ServerStorage")
-- 모듈 스크립트
local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))
function MatchManager.prepareGame()
playerManager.sendPlayersToMatch()
end
return MatchManager

플레이어 관리자 모듈 스크립트


local PlayerManager = {}
-- 서비스
local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
-- 맵 변수
local lobbySpawn = workspace.Lobby.StartSpawn
local arenaMap = workspace.Arena
local spawnLocations = arenaMap.SpawnLocations
-- 플레이어 변수
local activePlayers = {}
local playerWeapon = ServerStorage.Weapon
-- 로컬 함수
local function onPlayerJoin(player)
player.RespawnLocation = lobbySpawn
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
end
-- 모듈 기능
function PlayerManager.sendPlayersToMatch()
print("Sending players to match")
local arenaSpawns = spawnLocations:GetChildren()
for playerKey, whichPlayer in Players:GetPlayers() do
table.insert(activePlayers, whichPlayer)
local spawnLocation = table.remove(arenaSpawns, 1)
preparePlayer(whichPlayer, spawnLocation)
end
end
--이벤트
Players.PlayerAdded:Connect(onPlayerJoin)
return PlayerManager