Với game loop đã được mã hóa, đã đến lúc bắt đầu thêm các tính năng vào nó. Trong một trận tương thích, người chơi có thể đến và đi. Vì vì thế, mã là cần thiết cho các tác vụ như gửi người chơi vào trận và theo dõi những người chơi đang chủ động
Đây là một chức năng sẽ bắt đầu một chức năng để gửi người chơi vào đấu trường với một vũ khí và được mở rộng sau đó trong loạt bài.
Tùy chỉnh cài đặt
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 script khác, nó sẽ là một script modul.
Trong ServerStorage >ModuleScripts, thêm một mô-đun mới tên là PlayerManager. Sau đó, thay đổi tên bảng mô-đun để phù hợp với tên script và thêm bình luận cho các chức năng của local và module.
local PlayerManager = {}-- Hàm chức năng địa phương-- Hàm chức năngreturn PlayerManagerThêm biến địa phương cho các trường theo dõi:
Dịch Vụ:
- Người chơi - Biết người chơi đã tham gia hay rời khỏi trò chơi.
- ServerStorage - Kho lưu trữ vũ khí cho người chơi.
Biến map và player:
- Lobby Spawn, Arena Folder và Arena Spawn Folder - Được sử dụng để dịch chuyển người chơi đến các khu vực khác nhau.
- Một ma trận người chơi đang chơi - Giữ dữ liệu người chơi hiện tại trong trò chơi.
local PlayerManager = {}-- Dịch Vụlocal Players = game:GetService("Players")local ServerStorage = game:GetService("ServerStorage")-- Biến maplocal lobbySpawn = workspace.Lobby.StartSpawnlocal arenaMap = workspace.Arenalocal spawnLocations = arenaMap.SpawnLocations-- Biến cố người chơilocal activePlayers = {}-- Hàm chức năng địa phương-- Hàm chức năngreturn PlayerManagerTạo một chức năng module có tên là sendPlayersToMatch() với một bản in kiểm tra bên trong.
-- Hàm chức năng địa phương-- Hàm chức năngfunction PlayerManager.sendPlayersToMatch()print("Sending players to match")endreturn PlayerManager
Tạo người chơi trong sảnh đợi
Hiện tại, có nhiều vị trí xuất hiện, có nghĩa là người chơi xuất hiện ở 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 ở sảnh, hãy thay đổi thuộc tính RespawnLocation của người chơi.
Tạo một chức năng mới tên là onPlayerJoin() với một biến thể player . Trong chức năng đó, thiết lập vị trí phát triển của người chơi đến lobby spawn变 đã được thiết lập trước đó.
-- Hàm chức năng địa phươnglocal function onPlayerJoin(player)player.RespawnLocation = lobbySpawnendThêm một mục sự kiện dưới chức năng của 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.
-- Hàm chức năngfunction PlayerManager.sendPlayersToMatch()print("Sending players to match")end-- Sự kiệnPlayers.PlayerAdded:Connect(onPlayerJoin)
Kết Nối và Thử nghiệm
Bây giờ các mô-đun có thể được kết nối và kiểm tra. Khi PlayerManager được tạo, yêu cầu nó để có thể mã trong mô-đun đó có thể chạy và gửi người chơi đến sảnh.
Quay lại đến MatchManager và tạo biến cho các trường sau theo dõi:
- dịch vụ ServerStorage
- ModuleScripts thư mục, con của ServerStorage.
- PlayerManager script cấp module, con của moduleScripts.
local MatchManager = {}-- Dịch Vụlocal ServerStorage = game:GetService("ServerStorage")-- Script 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 một người chơi để thử nghiệm. Xác nhận rằng bạn có thể thấy những gì theo dõi:
- Tất cả người chơi đều xuất hiện trong Phòng Chờ.
- Tuyên bố in từ PlayerManager xuất hiện trong Cửa sổ Ra mắt.
Khi bạn xong, nhấp vào Dọn dẹp để đóng máy chủ.
Mẹo dịch vụ
Tại thời điểm này, một số phần của script không hoạt động như ý muốn, hãy thử một trong những lựa chọn dưới đây.
- Kiểm tra tên các bộ phận như Arena, hoặc vị trí của Lobby > StartSpawn, đặc biệt nếu bạn đã đặt tên chúng khác như hướng dẫn trong bài hướng dẫn.
- Đảm bạo các module được yêu cầu trong mỗi script bằng cách sử dụng hàm require() và viết đúng chính tả.
Gửi Người Chơi đến Đấu Trường
Bây giờ khi người chơi xuất hiện ở sảnh, dịch chuyển họ vào một trận đấu một lần khi hiệp nghỉ kết thúc. Thay đổi RespawnLocation của người chơi thành một địa điểm dịch chuyển trong arena bằng chức năng trong đối tượng Player ReloadCharacter() .
Vào PlayerManager script, onPlayerJoin() , thêm một chức năng mới tên là preparePlayer() . Bao gồm hai biến: 1> người chơi1> và 4> whichSpawn4>, nơi spawn để gửi chúng.
local activePlayers = {}-- Hàm chức năng địa phươnglocal function onPlayerJoin(player)player.RespawnLocation = lobbySpawnendlocal function preparePlayer(player, whichSpawn)end-- Hàm chức năngfunction PlayerManager.sendPlayersToMatch()print("Sending players to match")endĐặt vị trí phát triển của người chơi để whichSpawn .
local function preparePlayer(player, whichSpawn)player.RespawnLocation = whichSpawnendBắt buộc nhân vật phải load lại, bằng cách sử dụng LoadCharacter() , và người chơi sẽ respawn bằng cách sử dụng vị trí mới đã được giao.
local function preparePlayer(player, whichSpawn)player.RespawnLocation = whichSpawnplayer:LoadCharacter()end
Gửi người chơi đến Spawn
Đảm bảo mỗi người chơi được dịch chuyển đến một vị trí khác ở đấ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 đang hoạt động. Sử dụng một vòng lặp for cho phép bạn đi qua mọi giá
Trong hàm sendPlayersToMatch(), hãy sử dụng biến để tạo một loạt các địa điểm phát triển đấu trường bằng cách lấy con cái của thư mục Arena > SpawnLocations.
--Hàm chức năngfunction PlayerManager.sendPlayersToMatch()local arenaSpawns = spawnLocations:GetChildren()endThêm vòng lặp for dưới đây để lấy một dàn bộ định tuyến của tất cả người chơi và sau đó lặp qua mỗi người chơi. Để lấy 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 phải xác định các người chơi đang chơi để có thể được gọi vào đấu trường. Ở đầu của một vòng, mỗi người chơi sẽ được theo dõi trong một mat阵 của các người chơi đang chơi. Mat阵 này sẽ được sử dụ
Trong for loop, use table.insert() , using the two parameters for the activePlayers array and the player to thêm.
function PlayerManager.sendPlayersToMatch()local arenaSpawns = spawnLocations:GetChildren()for playerKey, whichPlayer in Players:GetPlayers() dotable.insert(activePlayers, whichPlayer)endendĐể nhận một vị trí đẻ trứng từ arena, tạo một biến tên là spawnLocation và đặt nó vào thứ nhất trong bảng arenaSpawns .
for playerKey, whichPlayer in Players:GetPlayers() dotable.insert(activePlayers, whichPlayer)local spawnLocation = arenaSpawns[1]endGọi preparePlayer() và truyền whichPlayer và spawnLocation . Sau đó, khi địa điểm đó được sử dụng, 1> xóa1> nó khỏi bảng để người chơi tiếp theo sẽ nhận được một địa điểm 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 thượng. Người chơi sẽ tiếp tục hồi sinh ở cùng một vị trí vì mã để gửi họ trở lại sảnh chờ vẫn chưa được thiết địa điểm.
Mẹo dịch vụ
Tại thời điểm này, bạn không thấy kết quả mà bạn đã định, hãy thử một trong những kết quả dưới đây.
- Trong GetPlayers() , hãy đảm bảo có hai dấu chấm câu, chẳng hạn như Class.Players.GetPlayers(|Players:GetPlayers()) trong câu.
- Kiểm tra loạt các hàm trong các tập tin module. Ví dụ, matchManager.prepareGame() nên gọi playerManager.sendPlayersToMatch() .
Đưa vũ khí cho người chơi
Khi một vòng bắt đầu, mỗi người chơi ở đấu trường sẽ được cung cấp một 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ụ. Mặc dù bất kỳ công cụ nào trong Roblox cũng 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ừ Toolbox, hoặc tạo ra của riêng bạn (xem Tools).
Đặt vũ khí vào ServerStorage. Nếu bạn đang tạo công cụ của riêng bạn, hãy đảm bảo công cụ đó được tên là Weapon, vì nó sẽ được sử dụng trong các tập lệnh sau đó.
Đưa công cụ cho người chơi
Bây giờ công cụ đã ở trong kho, hãy làm việc trên một script để qua các thành phần người chơi đang hoạt động và cung cấp mỗi người dùng công cụ đó.
Trong PlayerManager, thêm biến tùy chỉnh có tên là playerWeapon cho Weapon trong ServerStorage.
-- Biến maplocal lobbySpawn = workspace.Lobby.StartSpawnlocal arenaMap = workspace.Arenalocal spawnLocations = arenaMap.SpawnLocations-- Biến cố người chơilocal activePlayers = {}local playerWeapon = ServerStorage.WeaponTrong preparePlayer(), hãy nhập code sau đây để nhận 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 một bản sao vũ khí trong ServerStorage. Sau đó, gắn sword vào nhân vật 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 một công cụ khi được gửi đến đấu trường. Hãy lưu ý rằng, nếu bạn tiếp tục thử nghiệm, gián đoạn sẽ tiếp tục khởi động và người chơi sẽ respawn mỗi
Các Kịch Bản Đã Hoàn Thành
Dưới đây là các script đã hoàn thành để kiểm tra lại công việc của bạn.
Script GameManager
-- Dịch Vụlocal ServerStorage = game:GetService("ServerStorage")local Players = game:GetService("Players")-- Script 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")
-- Script 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 PlayerManager
local PlayerManager = {}
-- Dịch Vụ
local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
-- Biến map
local lobbySpawn = workspace.Lobby.StartSpawn
local arenaMap = workspace.Arena
local spawnLocations = arenaMap.SpawnLocations
-- Biến cố người chơi
local activePlayers = {}
local playerWeapon = ServerStorage.Weapon
-- Hàm 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
-- Hàm chức năng
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