ด้วยเกมที่เขียนโปรแกรมแล้ว ได้เวลาเริ่มเพิ่มคุณสมบัติให้กับมัน ตรงกันเนื่องจากเหตุนี้จึงต้องมีการเขียนโค้ดเพื่อทำงานเช่นส่งผ
สคริปต์นี้จะเริ่มฟังก์ชันเพื่อส่งผู้เล่นเข้าสู่อารีน่าด้วยอาวุธและขยายตัวในภายหลังในซีรี่
การติดตั้งสคริปต์
เนื่องจากผู้จัดการผู้เล่นรวมถึงฟังก์ชันที่ใช้โดยสคริปต์อื่น ๆ จะเป็นสคริปต์โมดูล
ใน ServerStorage > ModuleScripts เพิ่มโมดูลสคริปต์ใหม่ที่มีชื่อว่า PlayerManager แล้วเปลี่ยนชื่อโมดูลให้ตรงกับชื่อสคริปต์และเพิ่มความคิดเห็นสำหรับการใช้งานในตำแหน่งโมดูลและการใช้งานในตำแหน่งโมดูล
local PlayerManager = {}-- หน้าต่างท้องถิ่น-- หน้าโมดูลreturn PlayerManagerกำลังติดตาม:
บริการ:
- ผู้เล่น - รู้ว่าผู้เล่นได้เข้าร่วมหรือออกจากเกม
- ServerStorage - ที่เก็บของสําหรับอาวุธผู้เล่น
แผนที่และตัวแปรผู้เล่น:
- Lobby Spawn, Arena Folder และ Arena Spawn Folder - ใช้เพื่อเทเลพอร์ตผู้เล่นไปยังพื้นที่ต่างๆ
- รายการผู้เล่นที่เปิดใช้งาน - เก็บบันทึกผู้เล่นที่อยู่ในเกมในขณะนี้
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 ของบริการผู้เล่น
-- หน้าโมดูลfunction PlayerManager.sendPlayersToMatch()print("Sending players to match")end-- เหตุการณ์Players.PlayerAdded:Connect(onPlayerJoin)
การเชื่อมต่อและทดสอบ
ตอนนี้โมดูลสามารถเชื่อมต่อและทดสอบได้ ด้วยการสร้าง PlayerManager ขึ้นมาแล้วต้องการให้มันเพื่อให้โค้ดในโมดูลนั้นสามารถดำเนินการและส่งผู้เล่นไปยังล็อบบี้ได้
กลับไปที่ 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 ปรากฏในหน้าต่างการออก力
เมื่อเสร็จสิ้นให้คลิกที่ Cleanup เพื่อปิดเซิร์ฟเวอร์
เคล็ดลับการแก้ปัญหา
ในขณะนี้ส่วนหนึ่งของสคริปต์ไม่ทำงานตามที่ตั้งใจไว้ ลองใช้หนึ่งในตัวเลือกต่อไปนี้
- ตรวจสอบชื่อของชิ้นส่วนเช่นสนามประลองหรือตำแหน่งของ Lobby > StartSpawn โดยเฉพาะอย่างยิ่งหากคุณเรียกชื่อพวกเขาต่างจากที่กล่าวไว้ในบทเรียน
- ให้แน่ใจว่ามีโมดูลที่ต้องการในแต่ละสคริปต์โดยใช้หน้าฟังก์ชัน require() และเขียนอย่างถูกต้อง
การส่งผู้เล่นไปยังสนามประลอง
ตอนนี้ผู้เล่นปรากฏในล็อบบี้, เรือผู้เล่นไปยังสถานที่แข่งขันเมื่อสิ้นสุดช่วงพัก เปลี่ยน RespawnLocation ของผู้เล่นให้เป็นสถานที่แข่งขันในอารีนาโดยใช้ฟังก์ชั่นใน Player เรียก
ไปที่สคริปต์ PlayerManager ด้านล่าง 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 = whichSpawnendบังคับให้ตัวละครนี้โหลดใหม่โดยใช้ LoadCharacter() และผู้เล่นจะเรียกใหม่โดยสถานที่ที่ได้รับการจัดสรรใหม่ของพวกเขา
local function preparePlayer(player, whichSpawn)player.RespawnLocation = whichSpawnplayer:LoadCharacter()end
การส่งผู้เล่นไปยังจุดเกิด
ให้แน่ใจว่าผู้เล่นแต่ละคนได้รับการเรียกตัวไปยังสถานที่เกิดที่แตกต่างกันในอารีนาโดยใช้วงแหวน for เพื่อทําซ้ําผ่านรายการผู้เล่น การใช้วงแหวน for
ในฟังก์ชัน 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
การติดตามและการเกิด
เมื่อเกมวิ่ง, มันจำเป็นต้องระบุว่าผู้ใช้ใดกำลังเล่นเพื่อให้พวกเขาสามารถเรียกในสนามประลองได้ เมื่อเริ่มต้นรอบ, ผู้เล่นทุกคนจะถูกติดตามในแผงของผู้เล่นที่ใช้
ใน for ห้องนิรภัย, ใช้ table.insert() โดยใช้สองตัวอักษรสำหรับค่า activePlayers และผู้เล่นเพื่อเพิ่ม
function PlayerManager.sendPlayersToMatch()local arenaSpawns = spawnLocations:GetChildren()for playerKey, whichPlayer in Players:GetPlayers() dotable.insert(activePlayers, whichPlayer)endendเพื่อรับสถานที่เกิดจากอารีน่าให้สร้างแปรที่มีชื่อว่า spawnLocation และตั้งค่าให้เป็นอันดับแรกใน arenaSpawns ตาราง
for playerKey, whichPlayer in Players:GetPlayers() dotable.insert(activePlayers, whichPlayer)local spawnLocation = arenaSpawns[1]endเรียก preparePlayer() และส่งใน whichPlayer และ spawnLocation แล้ว จากนั้น, เนื่องจากสถานที่เรียก 1>เจาะ1> จากโต๊ะดังนั้นผู้เล่นต่อไปจะได้รับสถานที่เรียกที่แตกต่าง
for playerKey, whichPlayer in Players:GetPlayers() dotable.insert(activePlayers, whichPlayer)local spawnLocation = table.remove(arenaSpawns, 1)preparePlayer(whichPlayer, spawnLocation)endทดสอบในเซิร์ฟเวอร์ ท้องถิ่น ที่ผู้เล่นถูกส่งไปที่อารีน่า ผู้เล่นจะยังคงเกิดใหม่ในสถานที่เดียวกันเพราะโค้ดที่จะส่งพวกเขากลับไปที่ล็อบบี้ยังไม่พร้อม
เคล็ดลับการแก้ปัญหา
ในขณะนี้คุณยังไม่เห็นผลลัพธ์ที่ต้องการ ลองใช้หนึ่งในตัวเลือกด้านล่าง
- ใน GetPlayers() ตรวจสอบว่ามี สอง ปิดการประกาศของพ่อ, เช่น Class.Players.GetPlayers() ในสตริงของคำถูกกรอก
- ตรวจสอบตัวอักษรสัญลักษณ์ในสคริปต์โมดูล เช่น matchManager.prepareGame() ควรจะเรียก playerManager.sendPlayersToMatch()
ให้ความพึงพอใจกับผู้เล่น
เมื่อเริ่มต้นรอบใด ๆ ผู้เล่นในสนามรบจะได้รับอาวุธที่จะใช้
เพิ่มเครื่องมือ
อาวุธผู้เล่นจะเป็นเครื่องมือ ในขณะที่เครื่องมือใด ๆ ใน Roblox สามารถใช้ได้ เราได้ให้ตัวอย่างดาบเพื่อเริ่ม
นำอาวุธจากกล่องเครื่องมือ หรือสร้างของคุณเอง (ดู Tools )
วางอาวุธลงใน ServerStorage หากคุณกำลังสร้างเครื่องมือของคุณเองให้แน่ใจว่าเครื่องมือนี้ชื่อว่า Weapon เนื่องจากจะใช้ในสคริปต์ในภายหลัง
ให้เครื่องมือให้กับผู้เล่น
ตอนนี้เครื่องมืออยู่ในคลังข้อมูลแล้วให้ทำสคริปเพื่อผ่านรายการผู้ใช้ที่ใช้งานอยู่และให้ผู้ใช้แต่ละรายการ
ใน PlayerManager เพิ่มแปรที่มีชื่อว่า playerWeapon สำหรับอาวุธใน ServerStorage
-- แปรแผงแผนที่local lobbySpawn = workspace.Lobby.StartSpawnlocal arenaMap = workspace.Arenalocal spawnLocations = arenaMap.SpawnLocations-- แปรผู้เล่นlocal activePlayers = {}local playerWeapon = ServerStorage.Weaponใน preparePlayer() ให้วางรหัสต่อไปนี้เพื่อรับตัวละครของผู้เล่น
local function preparePlayer(player, whichSpawn)player.RespawnLocation = whichSpawnplayer:LoadCharacter()local character = player.Character or player.CharacterAdded:Wait()endสร้างแป้นใหม่ที่มีชื่อว่าดาบและใช้คุณสมบัติ Clone() เพื่อสร้างคัดเลี้ยงอาวุธใน ServerStorage จากนั้นประกอบดาบให้กับตัวละครของผู้เล่น
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