Quản lý Người chơi

*Nội dung này được dịch bằng AI (Beta) và có thể có lỗi. Để xem trang này bằng tiếng Anh, hãy nhấp vào đây.

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.

  1. 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ăng
    return PlayerManager
  2. Thê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 map
    local lobbySpawn = workspace.Lobby.StartSpawn
    local arenaMap = workspace.Arena
    local spawnLocations = arenaMap.SpawnLocations
    -- Biến cố người chơi
    local activePlayers = {}
    -- Hàm chức năng địa phương
    -- Hàm chức năng
    return PlayerManager
  3. Tạ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ăng
    function PlayerManager.sendPlayersToMatch()
    print("Sending players to match")
    end
    return 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.

  1. 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ương
    local function onPlayerJoin(player)
    player.RespawnLocation = lobbySpawn
    end
  2. Thê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ăng
    function PlayerManager.sendPlayersToMatch()
    print("Sending players to match")
    end
    -- Sự kiện
    Players.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.

  1. 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ô-đun
    local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
    local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))
    function MatchManager.prepareGame()
    playerManager.sendPlayersToMatch()
    end
    return MatchManager
  2. Sử 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.
  3. 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() .

  1. 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ương
    local function onPlayerJoin(player)
    player.RespawnLocation = lobbySpawn
    end
    local function preparePlayer(player, whichSpawn)
    end
    -- Hàm chức năng
    function PlayerManager.sendPlayersToMatch()
    print("Sending players to match")
    end
  2. Đặt vị trí phát triển của người chơi để whichSpawn .


    local function preparePlayer(player, whichSpawn)
    player.RespawnLocation = whichSpawn
    end
  3. Bắ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 = whichSpawn
    player: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á

  1. 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ăng
    function PlayerManager.sendPlayersToMatch()
    local arenaSpawns = spawnLocations:GetChildren()
    end
  2. Thê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() do
    end
    end

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ụ

  1. 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() do
    table.insert(activePlayers, whichPlayer)
    end
    end
  2. Để 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() do
    table.insert(activePlayers, whichPlayer)
    local spawnLocation = arenaSpawns[1]
    end
  3. Gọi preparePlayer() và truyền whichPlayerspawnLocation . 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() do
    table.insert(activePlayers, whichPlayer)
    local spawnLocation = table.remove(arenaSpawns, 1)
    preparePlayer(whichPlayer, spawnLocation)
    end
  4. Thử 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.

  1. Nhập vũ khí từ Toolbox, hoặc tạo ra của riêng bạn (xem Tools).

  2. Đặ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ụ đó.

  1. Trong PlayerManager, thêm biến tùy chỉnh có tên là playerWeapon cho Weapon trong 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
  2. Trong 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 = whichSpawn
    player:LoadCharacter()
    local character = player.Character or player.CharacterAdded:Wait()
    end
  3. Tạ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 = whichSpawn
    player:LoadCharacter()
    local character = player.Character or player.CharacterAdded:Wait()
    local sword = playerWeapon:Clone()
    sword.Parent = character
    end
  4. Thử 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ô-đun
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

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