게임 루프가 코딩된 상태에서 기능을 추가하기 시작합니다. 매치 중에 일치오고 이동것이 매우 흔합니다. 따라서 플레이어를 보내기 위한 태스크나 플레이어를 유지하기 위한 태스크를 수행하는 데 코드가 필요합니다. 이러한 태스크를 관리하려면 PlayerManager 라는 모듈 스크립트를 생
이 스크립트는 플레이어를 무기로 아레나로 보내고 나중에 시리즈에 확장될 것입니다.
스크립트 설정
플레이어 관리자는 다른 스크립트에서 사용하는 함수를 포함하므로 모듈 스크립트가 됩니다.
In ServerStorage > ModuleScripts에서 PlayerManager라는 이름의 새로운 모듈 스크립트를 추가합니다. 그런 다음 모듈 테이블을 스크립트 이름과 일치하도록 이름 변경하고 로컬 및 모듈 함수에 대한 코멘트를 추가합니다.
local PlayerManager = {}-- 로컬 함수-- 모듈 함수return PlayerManager팔로잉위한 로컬 변수 추가:
서비스:
- 플레이어 - 플레이어가 게임에 참여했거나 떠난 플레이어를 알아보십시오.
- ServerStorage - 플레이어 무기에 대한 저장소.
맵 및 플레이어 변수:
- 로비 생성, 아레나 폴더 및 아레나 생성 폴더 - 플레이어를 다른 지역으로 순간이동합니다.
- 활성 플레이어 배열 - 플레이어가 현재 게임에 있는지 추적합니다.
local PlayerManager = {}-- 서비스local Players = game:GetService("Players")local ServerStorage = game:GetService("ServerStorage")-- 맵 변수local lobbySpawn = workspace.Lobby.StartSpawnlocal arenaMap = workspace.Arenalocal spawnLocations = arenaMap.SpawnLocations-- 플레이어 변수local activePlayers = {}-- 로컬 함수-- 모듈 함수return PlayerManager모듈 함수 이름 sendPlayersToMatch() 내에 테스트 프린트가 있습니다.
-- 로컬 함수-- 모듈 함수function PlayerManager.sendPlayersToMatch()print("Sending players to match")endreturn PlayerManager
로비에서 플레이어 생성
현재, 게임에 참여하는 플레이어가 랜덤하게 생성되는 여러 위치가 있습니다. 플레이어가 로비에 생성되도록 하려면 플레이어의 RespawnLocation 속성을 변경하십시오.
onPlayerJoin()이라는 이름의 새로운 로컬 함수를 생성하고 매개 변수 player 로 플레이어의 리스폰 위치를 설정합니다. 그 함수에서 플레이어의 리스폰 위치를 이전에 만든 player에 설정합니다.
-- 로컬 함수local function onPlayerJoin(player)player.RespawnLocation = lobbySpawnend모듈 함수 아래에 onPlayerJoin(). 그런 다음 플레이어 서비스의 PlayerAdded 이벤트에 onPlayerJoin()를 연결하십시오.
-- 모듈 함수function PlayerManager.sendPlayersToMatch()print("Sending players to match")end-- 이벤트Players.PlayerAdded:Connect(onPlayerJoin)
연결 및 테스트
이제 모듈을 연결하고 테스트할 수 있습니다. 플레이어 관리자를 만든 후 이 모듈 스크립트의 코드를 검사하고 플레이어를 로비로 보내도록 하세요.
MatchManager로 돌아가 팔로잉위한 변수를 생성하고,
- ServerStorage 서비스.
- ModuleScripts 폴더, ServerStorage의 자식.
- PlayerManager 모듈 스크립트, moduleScripts의 자식.
local MatchManager = {}-- 서비스local ServerStorage = game:GetService("ServerStorage")-- 모듈 스크립트local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))function MatchManager.prepareGame()playerManager.sendPlayersToMatch()endreturn MatchManager최소 플레이어 수만큼 테스트할 로컬 서버를 사용하십시오. 팔로잉확인하세요.
- 모든 플레이어는 로비에서 생성됩니다.
- PlayerManager에서 출력하는 문은 출력 창에 나타납니다.
완료되면 서버를 종료하려면 클리어를 클릭하십시오.
문제 해결 팁
이 시점에서 스크립트의 일부가 작동하지 않습니다. 다음 중 하나를 시도해 보세요.
- 아레나, 로비 시작 스폰 등의 부품 이름을 확인하거나 수업에서 설명한 대로 로비 위치를 확인하십시오.
- 모듈이 require() 함수를 사용하여 각 스크립트에 필요하고 올바르게 스펠링된지 확인하십시오.
플레이어를 아레나로 보내기
이제 플레이어가 로비에 생성되면 휴식 시간이 끝난 후 매치에 참여하도록 전송합니다. 플레이어의 RespawnLocation 를 아레나에서 생성 위치로 변경하려면 Player 개체의 함수 ReloadCharacter() 를 사용하십시오.
onPlayerJoin() 스크립트 아래에 있는 onPlayerJoin() 스크립트로 이동하고, 새로운 로컬 함수 preparePlayer() 를 추가합니다. 두 매개 변수를 포함하세요: 1> 플레이어1> 및 4> whichSpawn4>, 생성 위치를 보내려면.
local activePlayers = {}-- 로컬 함수local function onPlayerJoin(player)player.RespawnLocation = lobbySpawnendlocal function preparePlayer(player, whichSpawn)end-- 모듈 함수function PlayerManager.sendPlayersToMatch()print("Sending players to match")end플레이어의 리스폰 위치를 whichSpawn 로 설정합니다.
local function preparePlayer(player, whichSpawn)player.RespawnLocation = whichSpawnendLoadCharacter() 을 사용하여 캐릭터를 다시로드하고, 플레이어는 할당된 새 위치를 사용하여 재생됩니다.
local function preparePlayer(player, whichSpawn)player.RespawnLocation = whichSpawnplayer:LoadCharacter()end
플레이어 이동 생성
활성 플레이어 배열을 반복하여 다른 생성 위치로 각 플레이어를 텔레포트하도록 하세요. for 루프를 사용하여 플레이어 배열을 반복하면 스크립트가 다양한 플레이어 수에 적응할 수 있습니다.
In the sendPlayersToMatch() 함수에서 변수를 사용하여 아레나 > 생성 위치의 모든 아레나 생성 위치 배열을 생성합니다.
--모듈 함수function PlayerManager.sendPlayersToMatch()local arenaSpawns = spawnLocations:GetChildren()end아래에 for 루프를 추가하여 모든 플레이어의 배열을 얻고 각 플레이어를 반복합니다. 플레이어를 가져오려면 다음을 입력하십시오. Players:GetPlayers() .
function PlayerManager.sendPlayersToMatch()local arenaSpawns = spawnLocations:GetChildren()for playerKey, whichPlayer in Players:GetPlayers() doendend
추적 및 생성
게임이 실행되면 아레나에 생성할 사용자를 식별해야 합니다. 라운드 시작 시 모든 플레이어는 활성 플레이어 배열에 추적됩니다. 그 배열은 다양한 기능, 예를 들어 순간이동 또는 무기 할당, 플레이어가 로비에 있는지 여부를 보장하는 데 사용됩니다.
In the for loop, use table.insert() , using the two parameters for the activePlayers array and the player to 추가.
function PlayerManager.sendPlayersToMatch()local arenaSpawns = spawnLocations:GetChildren()for playerKey, whichPlayer in Players:GetPlayers() dotable.insert(activePlayers, whichPlayer)endend아레나에서 생성 위치를 가져오려면 변수 이름 spawnLocation 을 만들고 아레나 스폰 테이블의 첫 번째 인덱스에 설정하십시오.
for playerKey, whichPlayer in Players:GetPlayers() dotable.insert(activePlayers, whichPlayer)local spawnLocation = arenaSpawns[1]endCall preparePlayer() 및 whichPlayer 및 spawnLocation 을 입력한 다음 1> 생성 위치를 사용하지 않도록 테이블에서 이를 제거하므로 다음 플레이어가 다른 생성 위치를 가질 수 있습니다.
for playerKey, whichPlayer in Players:GetPlayers() dotable.insert(activePlayers, whichPlayer)local spawnLocation = table.remove(arenaSpawns, 1)preparePlayer(whichPlayer, spawnLocation)end플레이어가 아레나로 보내지는 로컬 서버에서 테스트하십시오. 플레이어는 로비로 다시 보내기 코드가 아직 플레이스않기 때문에 동일한 위치에서 계속 부활합니다.
문제 해결 팁
이제 원하는 결과를 보지 못했습니다. 다음 중 하나를 시도해 보세요.
- In GetPlayers() , make sure there are two 닫는 부모 따옴표, such as Class.Players.GetPlayers(|Players:GetPlayers()) in the statement.
- 모듈 스크립트의 함수 호출 시퀀스를 확인하십시오. 예를 들어, matchManager.prepareGame() 는 playerManager.sendPlayersToMatch() 를 호출해야 합니다.
플레이어에게 무기 제공
라운드가 시작되면 아레나의 각 플레이어에게 사용할 무기가 제공됩니다.
도구 추가
플레이어 무기는 도구가 될 것입니다. 로블록스의 모든 도구를 사용할 수는 있지만, 시작하기 위해 샘플 검을 제공했습니다.
도구 상자에서 무기를 가져오거나 자신을 만드십시오 (see Tools).
무기를 ServerStorage에 배치하십시오. 자신의 도구를 만드는 경우 도구 이름이 무기가 되도록 하십시오. 나중에 스크립트에서 사용할 무기가 될 수 있기 때문입니다.
플레이어에게 도구 제공
이제 도구가 저장되었으므로 활성 플레이어 배열을 통과하여 각 사용자에게 도구를 제공하는 스크립트를 작성하십시오.
PlayerManager에서 서버 스토리지의 무기에 대해 playerWeapon이라는 변수를 추가합니다.
-- 맵 변수local lobbySpawn = workspace.Lobby.StartSpawnlocal arenaMap = workspace.Arenalocal spawnLocations = arenaMap.SpawnLocations-- 플레이어 변수local activePlayers = {}local playerWeapon = ServerStorage.WeaponIn preparePlayer() , 다음 코드를 붙여 플레이어의 캐릭터를 가져옵니다.
local function preparePlayer(player, whichSpawn)player.RespawnLocation = whichSpawnplayer:LoadCharacter()local character = player.Character or player.CharacterAdded:Wait()end검이라는 이름의 새 변수를 생성하고 Clone() 함수를 사용하여 서버 플레이어무기 복사본을 생성합니다. 그런 다음 서버 스토리지의 무기에 부모를 지정합니다.
local function preparePlayer(player, whichSpawn)player.RespawnLocation = whichSpawnplayer:LoadCharacter()local character = player.Character or player.CharacterAdded:Wait()local sword = playerWeapon:Clone()sword.Parent = characterend테스트 서버에서 로컬 서버 에서 테스트하여 모든 플레이어가 아레나에 도착할 때 도구를 받습니다. 주의, 테스트를 계속하면 중간 휴식이 계속 시작되고 플레이어는 몇 초마다 다시 생성됩니다. 이 내용은 다음 수업에서 해결됩니다.
완료된 스크립트
아래에는 작업을 확인하기 위해 완료된 스크립트가 있습니다.
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 dorepeattask.wait(gameSettings.intermissionDuration)print("Restarting intermission")until #Players:GetPlayers() >= gameSettings.minimumPlayersprint("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
PlayerManager 모듈 스크립트
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