ในบทเรียนก่อนหน้านี้ คุณได้สร้างฟีเจอร์เกมหลากหลายรวมถึง แพลตฟอร์มที่จางหาย และ ลาวาที่อันตราย บทเรียนนี้จะเชื่อมโยงสิ่งเหล่านี้เข้าด้วยกันเป็นเกมที่เล่นได้ซึ่งผู้ใช้จะเห็นว่าใครสามารถอยู่รอดได้นานที่สุด ทุกๆ วินาทีที่พวกเขายังมีชีวิตอยู่ คะแนนจะถูกเพิ่มเข้าไปในคะแนนของพวกเขา
ตั้งค่า
ก่อนอื่น คุณจะต้องตั้งฉากสำหรับเกมของคุณ ทำการคัดลอก แพลตฟอร์มที่จางหาย ที่คุณสร้างในบทเรียนก่อนหน้าและให้ผู้ใช้แข่งขันกันเพื่ออยู่บนแพลตฟอร์มให้นานที่สุดเท่าที่จะทำได้
คุณยังสามารถใช้ ลาวาที่อันตราย เพื่อฆ่าผู้ใช้เมื่อพวกเขาตกจากแพลตฟอร์ม หรือปล่อยให้พวกเขาตกลงไปสู่ความหายนะ ตรวจสอบให้แน่ใจว่าคุณวาง SpawnLocation ไว้ในที่ที่ผู้ใช้สามารถกระโดดขึ้นไปบนแพลตฟอร์มเพื่อเริ่มเล่น

คะแนนผู้เล่น
Roblox มี Leaderboard ที่สร้างขึ้นมาเพื่อแสดงสถิติของผู้ใช้ เมื่อคุณตั้งค่าคะแนนผู้เล่นผ่าน leaderboard คะแนนจะปรากฏที่ด้านขวาของหน้าจอในเกม

คุณจะได้เรียนรู้วิธีการแสดงข้อมูลที่ปรับแต่งได้มากขึ้นในบทเรียนถัดไป แต่ leaderboard เป็นวิธีที่ง่ายที่สุดในการสร้างระบบคะแนนที่มองเห็นได้ใน Roblox
ดีที่สุดคือการวางสคริปต์ที่ตั้งค่ารัฐของเกมไว้ใน ServerScriptService เพราะมันจะทำงานโดยอัตโนมัติเมื่อเกมเริ่ม ใน ServerScriptService ให้สร้างสคริปต์ชื่อ SetupPoints

ฟังผู้เล่น
ใน Roblox service คือวัตถุที่ทำหน้าที่หลากหลายฟังก์ชันที่มีประโยชน์ บริการ Players มีเหตุการณ์ที่เรียกว่า PlayerAdded ที่คุณสามารถใช้เพื่อจัดตั้งคะแนนสำหรับผู้ใช้แต่ละคนที่เข้าร่วมเกม
คุณสามารถเข้าถึงบริการได้ด้วยฟังก์ชัน GetService ในวัตถุ game game เป็นตัวแปรที่เข้าถึงได้จากทุกที่ซึ่งมีทุกอย่างในเกมของคุณ
สร้างตัวแปรสำหรับบริการ Players โดยใช้ game:GetService("Players")
สร้างฟังก์ชันชื่อ onPlayerAdded โดยมีพารามิเตอร์สำหรับผู้เล่นที่เข้ามา
เชื่อมต่อฟังก์ชัน onPlayerAdded กับเหตุการณ์ PlayerAdded
local Players = game:GetService("Players")local function onPlayerAdded(player)endPlayers.PlayerAdded:Connect(onPlayerAdded)
สร้างโฟลเดอร์สถิติ
เพื่อให้คะแนนของผู้ใช้แสดงใน leaderboard สิ่งที่คุณต้องทำคือสร้าง Folder ใหม่ในวัตถุ Player ของพวกเขาชื่อว่า "leaderstats" และใส่คะแนนของพวกเขาไว้ที่นั่น วัตถุใหม่สามารถสร้างจากภายในสคริปต์ผ่านฟังก์ชัน Instance.new()
สร้างวัตถุ Folder ใหม่โดยใช้ Instance.new("Folder") และเก็บผลลัพธ์ในตัวแปรใหม่ชื่อ leaderstats
local function onPlayerAdded(player)local leaderstats = Instance.new("Folder")endตั้งค่า Property ชื่อของ leaderstats เป็น "leaderstats"
ตั้งค่า leaderstats เป็นพ่อแม่ของ player
local Players = game:GetService("Players")local function onPlayerAdded(player)local leaderstats = Instance.new("Folder")leaderstats.Name = "leaderstats"leaderstats.Parent = playerendPlayers.PlayerAdded:Connect(onPlayerAdded)
สร้างคะแนน
ระบบ leaderboard จะอ่านค่าทุกค่าในโฟลเดอร์ leaderstats และแสดงสิ่งที่พบ
เพื่อเพิ่มสถิติที่จะติดตามคะแนนของผู้เล่น วัตถุ IntValue ใหม่สามารถเป็นพ่อแม่ของโฟลเดอร์ leaderstats ชื่อของวัตถุค่าจะถูกแสดงเคียงข้างกับค่าปัจจุบันของมัน
- ตั้งค่า Name เป็น "Points"
- ตั้งค่า Value เป็น 0; นี่คือสิ่งที่ leaderboard จะแสดงในตอนแรกสำหรับผู้เล่น
- ตั้งค่า points เป็นพ่อแม่ของโฟลเดอร์ leaderstats
local Players = game:GetService("Players")
local function onPlayerAdded(player)
local leaderstats = Instance.new("Folder")
leaderstats.Name = "leaderstats"
leaderstats.Parent = player
local points = Instance.new("IntValue")
points.Name = "Points"
points.Value = 0
points.Parent = leaderstats
end
Players.PlayerAdded:Connect(onPlayerAdded)ทดสอบเกมของคุณและคุณควรเห็น leaderboard ปรากฏที่มุมขวาบนพร้อมกับชื่อของผู้ใช้และคะแนนข้างๆ พวกเขา
นับเวลา
ผู้ใช้แต่ละคนควรได้รับคะแนนสำหรับทุกๆ วินาทีที่พวกเขายังมีชีวิตอยู่ สามารถใช้ while loop และฟังก์ชัน task.wait() เพื่ออัปเดตค่าของคะแนนทุกๆ วินาที
- ที่ส่วนท้ายของสคริปต์ สร้าง while loop โดยใช้ true เป็นเงื่อนไข
- ใน loop ให้ task.wait() เป็นเวลา 1 วินาที
Players.PlayerAdded:Connect(onPlayerAdded)
while true do
task.wait(1)
endรายชื่อผู้เล่น
เพื่อรันโค้ดสำหรับผู้ใช้ทุกคนในเกม คุณต้องวนซ้ำผ่าน array ของผู้ใช้ที่ส่งกลับโดยฟังก์ชัน GetPlayers
อาเรย์คือรายการของรายการที่จัดเก็บตามลำดับ แต่ละรายการสามารถเข้าถึงได้โดยตำแหน่ง index โดยเริ่มจาก 1 คุณสามารถรับความยาวของอาเรย์ได้โดยการเติมหน้าด้วย #
- เก็บผลลัพธ์ของ Players:GetPlayers() ในตัวแปร playerList
- สร้าง for loop โดยมีค่าตั้งต้นเป็น 1 และค่าจบเป็น #playerList เพื่อให้คุณได้การวนซ้ำหนึ่งครั้งต่อผู้เล่นแต่ละคน
while true do
task.wait(1)
local playerList = Players:GetPlayers()
for currentPlayer = 1, #playerList do
-- เพิ่มตรรกะของคุณที่นี่สำหรับผู้เล่นแต่ละคนใน playerList
end
endมอบคะแนน
เพื่อมอบคะแนนให้กับผู้ใช้แต่ละคนใน for loop คุณจะต้องดึงผู้ใช้จากอาเรย์และเพิ่ม 1 ให้กับวัตถุ Points ที่เก็บอยู่ในโฟลเดอร์ leaderstats ของพวกเขา
วัตถุที่เก็บอยู่ในอาเรย์จะถูกเข้าถึงโดยใช้ วงเล็บสี่เหลี่ยม - ตัวอย่างเช่น รายการแรกในอาเรย์ playerList สามารถเข้าถึงได้ด้วย playerList[1] หากคุณเขียน playerList[currentPlayer] ใน for loop คุณสามารถเคลื่อนที่ผ่านผู้ใช้แต่ละคนในรายการได้ในทุกการวนซ้ำของ loop
- เก็บผู้ใช้ที่ playerList[currentPlayer] ในตัวแปรชื่อ player
- เก็บวัตถุ Points ของผู้ใช้ในตัวแปรชื่อ points
while true do
task.wait(1)
local playerList = Players:GetPlayers()
for currentPlayer = 1, #playerList do
local player = playerList[currentPlayer]
local points = player.leaderstats.Points
points.Value += 1
end
endทดสอบเกมของคุณและคุณควรพบว่า leaderboard แสดงคะแนนของผู้เล่นของคุณเพิ่มขึ้น 1 ทุกๆ วินาที
ฟังตัวละคร
เป้าหมายของเกมคือการดูว่าใครสามารถอยู่รอดได้นานที่สุด ดังนั้นผู้ใช้ที่ตายจะต้องมีคะแนนของพวกเขากลับไปเป็น 0
คุณจะต้องดึงโมเดล Character สำหรับผู้ใช้เพื่อให้ตรวจจับได้เมื่อพวกเขาตาย โมเดลนี้จะถูกเพิ่มเข้าไปในเกม หลังจาก วัตถุ Player ถูกโหลดและคุณสามารถใช้เหตุการณ์ CharacterAdded เพื่อฟังเมื่อโมเดลตัวละครพร้อมใช้งาน สร้างฟังก์ชันชื่อ onCharacterAdded โดยมีพารามิเตอร์สองตัว: หนึ่งสำหรับตัวละคร หนึ่งสำหรับผู้เล่น
local Players = game:GetService("Players")
local function onCharacterAdded(character, player)
end
local function onPlayerAdded(player)
local leaderstats = Instance.new("Folder")แม้ว่าคุณจะรวมผู้ใช้ในพารามิเตอร์ของฟังก์ชัน onCharacterAdded แต่เหตุการณ์ CharacterAdded จะส่งคืนเฉพาะตัวละครเท่านั้น ไม่ใช่ผู้ใช้ที่เกี่ยวข้อง เพื่อส่งผ่านวัตถุ player ด้วย คุณสามารถใช้ ฟังก์ชันนิรนาม สำหรับการเชื่อมต่อเหตุการณ์
local function onPlayerAdded(player)
local leaderstats = Instance.new("Folder")
leaderstats.Name = "leaderstats"
leaderstats.Parent = player
local points = Instance.new("IntValue")
points.Name = "Points"
points.Value = 0
points.Parent = leaderstats
player.CharacterAdded:Connect(function(character)
onCharacterAdded(character, player)
end)
endรีเซ็ตคะแนน
เมื่อผู้ใช้ตาย Humanoid จะทำการเรียกใช้งาน Died โดยอัตโนมัติ คุณสามารถใช้เหตุการณ์นี้เพื่อตรวจสอบว่าเมื่อใดควรรีเซ็ตคะแนนของพวกเขา
Humanoid จะถูกพบภายในโมเดล Character แต่เนื้อหาของโมเดลนั้นจะถูกประกอบขึ้นเมื่อผู้ใช้เกิดขึ้น เพื่อให้โค้ดของคุณรออย่างปลอดภัยสำหรับวัตถุ Humanoid ให้ใช้ฟังก์ชัน WaitForChild() คุณสามารถเรียกใช้มันบนวัตถุพ่อแม่ใดๆ โดยส่งชื่อสตริงของลูกที่คุณรออยู่ สร้างตัวแปรเพื่อรอ Humanoid โดยใช้ character:WaitForChild("Humanoid")
local Players = game:GetService("Players")
local function onCharacterAdded(character, player)
local humanoid = character:WaitForChild("Humanoid")
endฟังก์ชันที่คุณต้องเชื่อมต่อกับเหตุการณ์ Died นั้นสั้นมากและจะต้องใช้ที่นี่เท่านั้น ดังนั้นคุณสามารถใช้ฟังก์ชันนิรนามอีกครั้ง
- เชื่อมต่อฟังก์ชันนิรนามใหม่กับเหตุการณ์ Died ของ Humanoid
- ในฟังก์ชันนิรนาม สร้างตัวแปรชื่อ points สำหรับวัตถุ Points ของผู้เล่น
local Players = game:GetService("Players")
local function onCharacterAdded(character, player)
local humanoid = character:WaitForChild("Humanoid")
humanoid.Died:Connect(function()
local points = player.leaderstats.Points
points.Value = 0
end)
endทดสอบสิ่งนี้และคุณจะเห็นคะแนนของผู้ใช้รีเซ็ตเมื่อพวกเขาตาย
ตรวจสอบผู้เล่น
หากผู้ใช้ยังคงได้รับคะแนนแม้ในขณะที่ตาย มันก็ไม่อยู่ในจิตวิญญาณของเกม ดังนั้นโค้ดจึงต้องตรวจสอบว่าผู้ใช้ยังมีชีวิตอยู่ก่อนที่จะมอบคะแนน
คุณต้องเริ่มต้นโดยการกำหนด attribute ในฟังก์ชัน onPlayerAdded ซึ่งสามารถใช้เพื่อตรวจสอบว่าผู้ใช้ยังมีชีวิตอยู่หรือไม่ ในขณะนี้ผู้ใช้ยังไม่อยู่มีชีวิตและเกิดขึ้น เนื่องจากโมเดลตัวละครของพวกเขายังต้องถูกเพิ่ม
Attributes ช่วยให้คุณปรับแต่งวัตถุใน Roblox ด้วยข้อมูลของคุณเอง Attribute ประกอบด้วยชื่อและค่า คุณสามารถสร้างหนึ่งในวัตถุใดๆ โดยใช้ฟังก์ชัน SetAttribute เรียก SetAttribute บน player เพื่อสร้าง attribute ใหม่ชื่อว่า "IsAlive" โดยมีค่าเป็น false
local function onPlayerAdded(player)
local leaderstats = Instance.new("Folder")
leaderstats.Name = "leaderstats"
leaderstats.Parent = player
local points = Instance.new("IntValue")
points.Name = "Points"
points.Value = 0
points.Parent = leaderstats
player:SetAttribute("IsAlive", false)
player.CharacterAdded:Connect(function(character)
onCharacterAdded(character, player)
end)
endเมื่อโมเดลตัวละครของผู้ใช้เกิดใหม่ ค่า IsAlive จะต้องถูกเปลี่ยนเป็น true เพื่อให้ผู้ใช้สามารถเริ่มได้รับคะแนนอีกครั้ง
- ใน onCharacterAdded ตั้งค่า attribute IsAlive ของ player เป็น true
- ใน onCharacterDied ตั้งค่า attribute IsAlive ของ player เป็น false
local Players = game:GetService("Players")
local function onCharacterAdded(character, player)
player:SetAttribute("IsAlive", true)
local humanoid = character:WaitForChild("Humanoid")
humanoid.Died:Connect(function()
local points = player.leaderstats.Points
points.Value = 0
player:SetAttribute("IsAlive", false)
end)
endสุดท้าย IsAlive ควรจะ ตรวจสอบ ก่อนที่จะมอบคะแนนใน while loop ที่ส่วนท้ายของสคริปต์ ฟังก์ชัน GetAttribute จะรับชื่อของ attribute และส่งคืนค่า ใน while loop ให้ห่อหุ้มโค้ดเพื่อมอบคะแนนใน if statement โดยมีเงื่อนไขว่า player:GetAttribute("IsAlive")
while true do
task.wait(1)
local playerList = Players:GetPlayers()
for currentPlayer = 1, #playerList do
local player = playerList[currentPlayer]
if player:GetAttribute("IsAlive") then
local points = player.leaderstats.Points
points.Value += 1
end
end
endทดสอบเกมของคุณตอนนี้และคุณควรพบว่าผู้ใช้ได้รับคะแนนทุกๆ วินาทีที่พวกเขายังมีชีวิตอยู่ และอยู่ที่ 0 เมื่อไม่อยู่ มีเพื่อนของคุณเล่นกับคุณและดูว่าใครสามารถทำคะแนนสูงสุดได้
นี่เป็นเพียงจุดเริ่มต้น: คุณสามารถปรับปรุงเกมของคุณสำหรับผู้ใช้ต่อไป นี่คือเคล็ดลับบางประการ:
- วางโค้ดสำหรับแพลตฟอร์มทั้งหมดลงในสคริปต์เดียว ทำให้การอัปเดตง่ายขึ้นมาก
- สร้างพื้นที่ล็อบบี้ที่ผู้ใช้รอเพื่อถูกส่งไปยังพื้นที่เกม ทำให้ผู้ใช้เริ่มพร้อมกัน
- ประกาศผู้ชนะของแต่ละรอบ
โค้ดสุดท้าย
local Players = game:GetService("Players")
local function onCharacterAdded(character, player)
player:SetAttribute("IsAlive", true)
local humanoid = character:WaitForChild("Humanoid")
humanoid.Died:Connect(function()
local points = player.leaderstats.Points
points.Value = 0
player:SetAttribute("IsAlive", false)
end)
end
local function onPlayerAdded(player)
local leaderstats = Instance.new("Folder")
leaderstats.Name = "leaderstats"
leaderstats.Parent = player
local points = Instance.new("IntValue")
points.Name = "Points"
points.Value = 0
points.Parent = leaderstats
player:SetAttribute("IsAlive", false)
player.CharacterAdded:Connect(function(character)
onCharacterAdded(character, player)
end)
end
Players.PlayerAdded:Connect(onPlayerAdded)
while true do
task.wait(1)
local playerList = Players:GetPlayers()
for i = 1, #playerList do
local player = playerList[i]
if player:GetAttribute("IsAlive") then
local points = player.leaderstats.Points
points.Value += 1
end
end
end