การจัดการผู้เล่น

*เนื้อหานี้แปลโดยใช้ AI (เวอร์ชัน Beta) และอาจมีข้อผิดพลาด หากต้องการดูหน้านี้เป็นภาษาอังกฤษ ให้คลิกที่นี่

ด้วยเกมที่เขียนโปรแกรมแล้ว ได้เวลาเริ่มเพิ่มคุณสมบัติให้กับมัน ตรงกันเนื่องจากเหตุนี้จึงต้องมีการเขียนโค้ดเพื่อทำงานเช่นส่งผ

สคริปต์นี้จะเริ่มฟังก์ชันเพื่อส่งผู้เล่นเข้าสู่อารีน่าด้วยอาวุธและขยายตัวในภายหลังในซีรี่

การติดตั้งสคริปต์

เนื่องจากผู้จัดการผู้เล่นรวมถึงฟังก์ชันที่ใช้โดยสคริปต์อื่น ๆ จะเป็นสคริปต์โมดูล

  1. ใน ServerStorage > ModuleScripts เพิ่มโมดูลสคริปต์ใหม่ที่มีชื่อว่า PlayerManager แล้วเปลี่ยนชื่อโมดูลให้ตรงกับชื่อสคริปต์และเพิ่มความคิดเห็นสำหรับการใช้งานในตำแหน่งโมดูลและการใช้งานในตำแหน่งโมดูล


    local PlayerManager = {}
    -- หน้าต่างท้องถิ่น
    -- หน้าโมดูล
    return PlayerManager
  2. กำลังติดตาม:

    บริการ:

    • ผู้เล่น - รู้ว่าผู้เล่นได้เข้าร่วมหรือออกจากเกม
    • ServerStorage - ที่เก็บของสําหรับอาวุธผู้เล่น

    แผนที่และตัวแปรผู้เล่น:

    • Lobby Spawn, Arena Folder และ Arena Spawn Folder - ใช้เพื่อเทเลพอร์ตผู้เล่นไปยังพื้นที่ต่างๆ
    • รายการผู้เล่นที่เปิดใช้งาน - เก็บบันทึกผู้เล่นที่อยู่ในเกมในขณะนี้

    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() ด้วยการพิมพ์ทดสอบภายใน


    -- หน้าต่างท้องถิ่น
    -- หน้าโมดูล
    function PlayerManager.sendPlayersToMatch()
    print("Sending players to match")
    end
    return PlayerManager

กำลังเรียกผู้เล่นในล็อบบี้

ตอนนี้มีสถานที่เกิดต่างๆ หมายถึงผู้เล่นจะเกิดที่สถานที่ใดก็ได้เมื่อเข้าร่วมเกม เพื่อให้ผู้เล่นเกิดในล็อบบี้ เปลี่ยนค่าสถานที่เกิดของผู้เล่น RespawnLocation

  1. สร้างคุณสมบัติใหม่ที่มีชื่อว่า onPlayerJoin() ด้วยตัวอ้างสิทธิ์ของ player ในคุณสมบัตินั้น ในคุณสมบัตินั้นตั้งค่าตำแหน่งการเกิดของผู้เล่นไว้ที่ค่าตัว player เดิม


    -- หน้าต่างท้องถิ่น
    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 สคริปต์โมดูล, ลูกของ moduleScripts

    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. ใช้เซิร์ฟเวอร์ ท้องถิ่น ที่มีผู้เล่นอย่างน้อย เพื่อทดสอบ กำลังติดตาม:

    • ผู้เล่นทั้งหมดจะเกิดในล็อบบี้
    • คำปริ้นจาก PlayerManager ปรากฏในหน้าต่างการออก力
  3. เมื่อเสร็จสิ้นให้คลิกที่ Cleanup เพื่อปิดเซิร์ฟเวอร์

เคล็ดลับการแก้ปัญหา

ในขณะนี้ส่วนหนึ่งของสคริปต์ไม่ทำงานตามที่ตั้งใจไว้ ลองใช้หนึ่งในตัวเลือกต่อไปนี้

  • ตรวจสอบชื่อของชิ้นส่วนเช่นสนามประลองหรือตำแหน่งของ Lobby > StartSpawn โดยเฉพาะอย่างยิ่งหากคุณเรียกชื่อพวกเขาต่างจากที่กล่าวไว้ในบทเรียน
  • ให้แน่ใจว่ามีโมดูลที่ต้องการในแต่ละสคริปต์โดยใช้หน้าฟังก์ชัน require() และเขียนอย่างถูกต้อง

การส่งผู้เล่นไปยังสนามประลอง

ตอนนี้ผู้เล่นปรากฏในล็อบบี้, เรือผู้เล่นไปยังสถานที่แข่งขันเมื่อสิ้นสุดช่วงพัก เปลี่ยน RespawnLocation ของผู้เล่นให้เป็นสถานที่แข่งขันในอารีนาโดยใช้ฟังก์ชั่นใน Player เรียก

  1. ไปที่สคริปต์ PlayerManager ด้านล่าง onPlayerJoin() เพิ่มคุณสมบัติท้องถิ่นใหม่ที่มีชื่อว่า preparePlayer() ในสองปารามิเตอร์: 1> ผู้เล่น1> และ 4> whichSpawn4> สถานที


    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() ใช้ตัวแปรเพื่อสร้างรายการทุกสถานที่เกิดของอารีนาโดยการรวบรวมลูกของอารีนา > สร้างสถานที่เกิด


    --หน้าโมดูล
    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() และส่งใน whichPlayer และ spawnLocation แล้ว จากนั้น, เนื่องจากสถานที่เรียก 1>เจาะ1> จากโต๊ะดังนั้นผู้เล่นต่อไปจะได้รับสถานที่เรียกที่แตกต่าง


    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() ในสตริงของคำถูกกรอก
  • ตรวจสอบตัวอักษรสัญลักษณ์ในสคริปต์โมดูล เช่น matchManager.prepareGame() ควรจะเรียก playerManager.sendPlayersToMatch()

ให้ความพึงพอใจกับผู้เล่น

เมื่อเริ่มต้นรอบใด ๆ ผู้เล่นในสนามรบจะได้รับอาวุธที่จะใช้

เพิ่มเครื่องมือ

อาวุธผู้เล่นจะเป็นเครื่องมือ ในขณะที่เครื่องมือใด ๆ ใน Roblox สามารถใช้ได้ เราได้ให้ตัวอย่างดาบเพื่อเริ่ม

  1. นำอาวุธจากกล่องเครื่องมือ หรือสร้างของคุณเอง (ดู Tools )

  2. วางอาวุธลงใน ServerStorage หากคุณกำลังสร้างเครื่องมือของคุณเองให้แน่ใจว่าเครื่องมือนี้ชื่อว่า Weapon เนื่องจากจะใช้ในสคริปต์ในภายหลัง

ให้เครื่องมือให้กับผู้เล่น

ตอนนี้เครื่องมืออยู่ในคลังข้อมูลแล้วให้ทำสคริปเพื่อผ่านรายการผู้ใช้ที่ใช้งานอยู่และให้ผู้ใช้แต่ละรายการ

  1. ใน PlayerManager เพิ่มแปรที่มีชื่อว่า playerWeapon สำหรับอาวุธใน ServerStorage


    -- แปรแผงแผนที่
    local lobbySpawn = workspace.Lobby.StartSpawn
    local arenaMap = workspace.Arena
    local spawnLocations = arenaMap.SpawnLocations
    -- แปรผู้เล่น
    local activePlayers = {}
    local playerWeapon = ServerStorage.Weapon
  2. ใน preparePlayer() ให้วางรหัสต่อไปนี้เพื่อรับตัวละครของผู้เล่น


    local function preparePlayer(player, whichSpawn)
    player.RespawnLocation = whichSpawn
    player:LoadCharacter()
    local character = player.Character or player.CharacterAdded:Wait()
    end
  3. สร้างแป้นใหม่ที่มีชื่อว่าดาบและใช้คุณสมบัติ 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. ทดสอบในเซิร์ฟเวอร์ ท้องถิ่น เพื่อยืนยันว่าผู้เล่นทุกคนจะได้รับเครื่องมือเมื่อส่งไปยังสนามประลอง จำไว้ว่าหากคุณดำเนินการทดสอบต่อไปคุณจะเริ่มต้นใหม่และผู้เล่นจะเกิดให

สคริปที่สำเร็จ

ด้านล่างเป็นสคริปต์ที่สำเร็จแล้วเพื่อตรวจสอบงานของคุณ

สคริปต์ 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 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

สคริปต์โมดูล 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