Với vòng lặp trò chơi được mã hóa, đã đến lúc bắt đầu thêm các tính năng vào nó.Trong một tương thích, người chơi có thể đến và đi.Vì lý do này, mã là cần thiết cho các nhiệm vụ như gửi người chơi vào một trận và theo dõi các người chơi hoạt động.Để quản lý các nhiệm vụ này, tạo một kịch bản mô-đun có tên PlayerManager .
Tập lệnh này sẽ khởi động một chức năng để gửi người chơi vào sân vận động với một vũ khí và sẽ được mở rộng sau đó trong loạt.
Thiết lập kịch bản
Bởi vì quản lý người chơi bao gồm các chức năng được sử dụng bởi các kịch bản khác, nó sẽ là một kịch bản mô-đun.
Trong ServerStorage > ModuleScripts, thêm một kịch bản mới có tên PlayerManager.Sau đó, thay đổi tên bảng mô-đun để phù hợp với tên kịch bản và thêm bình luận cho chức năng địa phương và mô-đun.
local PlayerManager = {}-- Chức năng địa phương-- Chức năng mô-đunreturn PlayerManagerThêm biến địa phương cho các thứ theo dõi:
Dịch vụ:
- Người chơi - Biết những người chơi đã tham gia hoặc rời khỏi trò chơi.
- ServerStorage - Kho chứa vũ khí cho người chơi.
Biến bản đồ và người chơi:
- Lobby Spawn, Thư mục Arena, và Thư mục Spawn Arena - Được sử dụng để dịch chuyển người chơi đến các khu vực khác nhau.
- Một danh sách các người chơi hoạt động - Theo dõi các người chơi hiện đang trong một trò chơi.
local PlayerManager = {}-- Dịch vụlocal Players = game:GetService("Players")local ServerStorage = game:GetService("ServerStorage")-- Biến bản đồlocal lobbySpawn = workspace.Lobby.StartSpawnlocal arenaMap = workspace.Arenalocal spawnLocations = arenaMap.SpawnLocations-- Biến người chơilocal activePlayers = {}-- Chức năng địa phương-- Chức năng mô-đunreturn PlayerManagerTạo một chức năng module có tên là sendPlayersToMatch() với một lần in thử bên trong.
-- Chức năng địa phương-- Chức năng mô-đunfunction PlayerManager.sendPlayersToMatch()print("Sending players to match")endreturn PlayerManager
Tạo người chơi trong sảnh
Hiện tại, có nhiều vị trí sinh sản, có nghĩa là người chơi sinh ra ở một vị trí ngẫu nhiên khi tham gia trò chơi.Để đảm bảo người chơi xuất hiện trong sảnh, thay đổi thuộc tính RespawnLocation của người chơi.
Tạo một chức năng địa phương mới có tên là onPlayerJoin() với một tham số của player .Trong chức năng đó, đặt vị trí hồi sinh của người chơi vào biến hồi sinh của sảnh được tạo trước đó.
-- Chức năng địa phươnglocal function onPlayerJoin(player)player.RespawnLocation = lobbySpawnendThêm một phần sự kiện bên dưới chức năng module của bạn. Sau đó, kết nối onPlayerJoin() với sự kiện PlayerAdded của Dịch vụ Người chơi.
-- Chức năng mô-đunfunction PlayerManager.sendPlayersToMatch()print("Sending players to match")end-- Sự kiệnPlayers.PlayerAdded:Connect(onPlayerJoin)
Kết nối và kiểm tra
Bây giờ các mô-đun có thể được kết nối và kiểm tra.Với PlayerManager được tạo, yêu cầu nó để mã trong kịch bản module đó có thể chạy và gửi người chơi vào sảnh.
Quay lại MatchManager và tạo biến cho các thứ theo dõi:
- Dịch vụ Lưu trữ máy chủ .
- Thư mục ModuleScripts , con của ServerStorage.
- Tập lệnh quản lý người chơi mô-đun, con của moduleScripts.
local MatchManager = {}-- Dịch vụlocal ServerStorage = game:GetService("ServerStorage")-- Tập lệnh mô-đunlocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))function MatchManager.prepareGame()playerManager.sendPlayersToMatch()endreturn MatchManagerSử dụng một máy chủ địa phương với ít nhất những người chơi tối thiểu để kiểm tra. Xác nhận rằng bạn có thể nhìn thấy những điều theo dõi:
- Tất cả người chơi xuất hiện trong Sảnh.
- Tuyên bố in từ PlayerManager xuất hiện trong cửa sổ Thành phẩm.
Khi hoàn thành, nhấp vào Làm sạch để tắt máy chủ.
Mẹo khắc phục sự cố
Tại thời điểm này, một phần của kịch bản không hoạt động như dự định, hãy thử một trong những điều sau.
- Kiểm tra tên của các bộ phận như Sân Thượng, hoặc vị trí của Sảnh đợi > Bắt đầuSpawn, đặc biệt nếu bạn đặt tên khác với những gì được hướng dẫn trong bài học.
- Hãy chắc chắn rằng các mô-đun là bắt buộc trong mỗi kịch bản sử dụng chức năng require() và được viết chính xác.
Gửi người chơi đến sân đấu
Bây giờ khi người chơi xuất hiện trong sảnh, dịch chuyển họ vào một trận khi kỳ nghỉ kết thúc.Thay đổi RespawnLocation của người chơi thành một vị trí sinh sản trong đấu trường bằng cách sử dụng chức năng trong đối tượng Người chơi được gọi là ReloadCharacter() .
Đi đến kịch bản Quản lý người chơi , bên dưới onPlayerJoin(), thêm một chức năng địa phương mới có tên là preparePlayer().Bao gồm hai tham số: player và whichSpawn, vị trí spawn để gửi chúng.
local activePlayers = {}-- Chức năng địa phươnglocal function onPlayerJoin(player)player.RespawnLocation = lobbySpawnendlocal function preparePlayer(player, whichSpawn)end-- Chức năng mô-đunfunction PlayerManager.sendPlayersToMatch()print("Sending players to match")endĐặt vị trí hồi sinh của người chơi thành whichSpawn .
local function preparePlayer(player, whichSpawn)player.RespawnLocation = whichSpawnendBắt buộc nhân vật phải tải lại, sử dụng LoadCharacter() , và người chơi sẽ hồi sinh bằng vị trí mới được gán cho họ.
local function preparePlayer(player, whichSpawn)player.RespawnLocation = whichSpawnplayer:LoadCharacter()end
Gửi người chơi đến spawn
Hãy chắc chắn rằng mỗi người chơi được dịch chuyển đến một vị trí sinh sản khác trong đấu trường bằng cách sử dụng một vòng lặp for để lặp qua danh sách người chơi hoạt động.Sử dụng một vòng lặp for cho phép bạn đi qua mọi giá trị trong mảng người chơi, cho phép kịch bản thích ứng với nhiều số người chơi khác nhau.
Trong chức năng sendPlayersToMatch(), sử dụng một biến để tạo một mảng tất cả các vị trí đẻ sân bóng bằng cách lấy con cái của thư mục Arena > SpawnLocations.
--Chức năng mô-đunfunction PlayerManager.sendPlayersToMatch()local arenaSpawns = spawnLocations:GetChildren()endThêm vòng lặp for bên dưới để có được một mảng của tất cả các người chơi và sau đó lặp qua từng người chơi. Để có được người chơi, hãy đánh máy: Players:GetPlayers() .
function PlayerManager.sendPlayersToMatch()local arenaSpawns = spawnLocations:GetChildren()for playerKey, whichPlayer in Players:GetPlayers() doendend
Theo dõi và tạo
Khi trò chơi chạy, nó cần xác định những người dùng đang chơi để có thể được tạo ra trong đấu trường.Tại mở đầu của một vòng, mỗi người chơi sẽ được theo dõi trong một mảng các người chơi hoạt động.Các array đó sẽ được sử dụng cho các chức năng khác nhau, chẳng hạn như dịch chuyển hoặc gán vũ khí, đảm bảo rằng người chơi vẫn ở trong sảnh trong suốt một vòng không bị ảnh hưởng.
Trong vòng lặp for, sử dụng table.insert() , sử dụng hai tham số cho mảng activePlayers và người chơi để thêm.
function PlayerManager.sendPlayersToMatch()local arenaSpawns = spawnLocations:GetChildren()for playerKey, whichPlayer in Players:GetPlayers() dotable.insert(activePlayers, whichPlayer)endendĐể có được vị trí spawn từ sân, tạo một biến có tên và đặt nó vào chỉ mục đầu tiên trong bảng .
for playerKey, whichPlayer in Players:GetPlayers() dotable.insert(activePlayers, whichPlayer)local spawnLocation = arenaSpawns[1]endGọi preparePlayer() và truyền whichPlayer và spawnLocation .Sau đó, vì vị trí spawn đó đã được sử dụng, xóa nó khỏi bảng để người chơi tiếp theo có được một spawn khác.
for playerKey, whichPlayer in Players:GetPlayers() dotable.insert(activePlayers, whichPlayer)local spawnLocation = table.remove(arenaSpawns, 1)preparePlayer(whichPlayer, spawnLocation)endThử nghiệm trên một máy chủ địa phương mà người chơi được gửi đến sân đấu.Các người chơi sẽ tiếp tục hồi sinh tại cùng một vị trí bởi vì mã để gửi họ trở lại sảnh chờ chưa được thiết địa điểm.
Mẹo khắc phục sự cố
Tại thời điểm này, bạn không thấy kết quả mong muốn, hãy thử một trong những điều sau.
- Trong GetPlayers(), hãy chắc chắn rằng có hai dấu ngoặc kép đóng, như Class.Players.GetPlayers(|Players:GetPlayers()) trong tuyên bố.
- Kiểm tra loạt cuộc gọi chức năng trong các kịch bản module. Ví dụ, matchManager.prepareGame() nên gọi playerManager.sendPlayersToMatch().
Tặng vũ khí cho người chơi
Khi một vòng bắt đầu, mỗi người chơi trong đấu trường sẽ được cung cấp vũ khí để sử dụng.
Thêm một công cụ
Vũ khí của người chơi sẽ là một công cụ. Trong khi bất kỳ công cụ nào trong Roblox đều có thể được sử dụng, chúng tôi đã cung cấp một thanh kiếm mẫu để bắt đầu.
Nhập vũ khí từ Hộp công cụ, hoặc tạo riêng của bạn (xem Tools ).
Đặt vũ khí vào ServerStorage. Nếu bạn đang tạo công cụ của riêng mình, hãy chắc chắn rằng công cụ được gọi là Vũ khí, vì nó sẽ được sử dụng trong các kịch bản sau này.
Cung cấp công cụ cho người chơi
Bây giờ khi công cụ đã ở trong kho lưu trữ, hãy làm việc trên một kịch bản để đi qua mảng người chơi hoạt động và cung cấp công cụ cho mỗi người dùng.
Trong PlayerManager, thêm một biến có tên playerWeapon cho Vũ khí trong ServerStorage.
-- Biến bản đồlocal lobbySpawn = workspace.Lobby.StartSpawnlocal arenaMap = workspace.Arenalocal spawnLocations = arenaMap.SpawnLocations-- Biến người chơilocal activePlayers = {}local playerWeapon = ServerStorage.WeaponTrong preparePlayer(), sao chép mã sau đây để lấy nhân vật của người chơi.
local function preparePlayer(player, whichSpawn)player.RespawnLocation = whichSpawnplayer:LoadCharacter()local character = player.Character or player.CharacterAdded:Wait()endTạo một biến mới có tên là sword và sử dụng chức năng Clone() để tạo bản sao của vũ khí trong ServerStorage.Sau đó, cha mẹ thanh kiếm cho nhân vật của người chơi.
local function preparePlayer(player, whichSpawn)player.RespawnLocation = whichSpawnplayer:LoadCharacter()local character = player.Character or player.CharacterAdded:Wait()local sword = playerWeapon:Clone()sword.Parent = characterendThử nghiệm trên một máy chủ địa phương để xác nhận rằng mọi người chơi đều nhận được công cụ khi gửi đến sân đấu.Hãy nhớ rằng, nếu bạn tiếp tục kiểm tra, khoảng dừng sẽ tiếp tục khởi động lại và do đó người chơi sẽ hồi sinh mỗi vài giây.Điều này sẽ được giải quyết trong bài học tiếp theo.
Hoàn thành các kịch bản
Dưới đây là các kịch bản hoàn thành để kiểm tra lại công việc của bạn.
Tập lệnh GameManager
-- Dịch vụlocal ServerStorage = game:GetService("ServerStorage")local Players = game:GetService("Players")-- Tập lệnh mô-đunlocal 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
Tập lệnh MatchManager
local MatchManager = {}
-- Dịch vụ
local ServerStorage = game:GetService("ServerStorage")
-- Tập lệnh mô-đun
local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))
function MatchManager.prepareGame()
playerManager.sendPlayersToMatch()
end
return MatchManager
Tập lệnh của module PlayerManager
local PlayerManager = {}
-- Dịch vụ
local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
-- Biến bản đồ
local lobbySpawn = workspace.Lobby.StartSpawn
local arenaMap = workspace.Arena
local spawnLocations = arenaMap.SpawnLocations
-- Biến người chơi
local activePlayers = {}
local playerWeapon = ServerStorage.Weapon
-- Chức năng địa phương
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
-- Chức năng mô-đun
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
--sự kiện
Players.PlayerAdded:Connect(onPlayerJoin)
return PlayerManager