Trong các hướng dẫn trước, bạn đã tạo ra nhiều tính năng trò chơi khác nhau bao gồm các nền tảng mờ dần và những dòng dung nham chết chóc. Hướng dẫn này kết hợp những điều này thành một trò chơi có thể chơi được, nơi người dùng xem ai có thể sống lâu nhất. Mỗi giây họ sống sót, một điểm sẽ được thêm vào điểm số của họ.
Thiết lập
Đầu tiên, bạn cần thiết lập cảnh cho trò chơi của mình. Nhân bản các nền tảng mờ dần mà bạn đã tạo trong hướng dẫn trước và để người dùng cạnh tranh xem ai có thể đứng trên các nền tảng lâu nhất có thể.
Bạn cũng có thể sử dụng dung nham chết chóc để giết người dùng khi họ rơi khỏi các nền tảng, hoặc chỉ để họ rơi xuống cái chết của mình. Hãy chắc chắn rằng bạn đặt một SpawnLocation ở đâu đó mà người dùng có thể nhảy lên các nền tảng để bắt đầu chơi.

Điểm của người chơi
Roblox có một Bảng xếp hạng tích hợp để hiển thị thống kê của người dùng. Khi bạn thiết lập điểm cho người chơi thông qua bảng xếp hạng, chúng sẽ xuất hiện ở bên phải màn hình trong trò chơi.

Bạn sẽ học thêm nhiều cách tùy chỉnh để hiển thị thông tin trong các hướng dẫn sau, nhưng bảng xếp hạng là cách đơn giản nhất để tạo ra một hệ thống ghi điểm có thể nhìn thấy trong Roblox.
Tốt nhất là đặt các script thiết lập trạng thái trò chơi vào ServerScriptService vì chúng sẽ tự động chạy khi trò chơi bắt đầu. Trong ServerScriptService, tạo một script có tên là SetupPoints.

Lắng nghe người chơi
Trong Roblox, một dịch vụ là một đối tượng thực hiện một loạt các chức năng hữu ích. Dịch vụ Players có một sự kiện gọi là PlayerAdded mà bạn có thể sử dụng để thiết lập điểm cho mỗi người dùng tham gia trò chơi.
Bạn có thể truy cập các dịch vụ bằng cách sử dụng hàm GetService trong đối tượng game. game là một biến có thể truy cập từ bất kỳ đâu chứa mọi thứ trong trò chơi của bạn.
Tạo một biến cho dịch vụ Players bằng cách sử dụng game:GetService("Players").
Tạo một hàm có tên onPlayerAdded với một tham số cho người chơi đến.
Kết nối hàm onPlayerAdded với sự kiện PlayerAdded.
local Players = game:GetService("Players")local function onPlayerAdded(player)endPlayers.PlayerAdded:Connect(onPlayerAdded)
Tạo một thư mục thống kê
Để hiển thị điểm của người dùng trong bảng xếp hạng, tất cả những gì bạn cần làm là tạo một Folder mới trong đối tượng Player của họ có tên là "leaderstats" và đặt điểm của họ vào đó. Các đối tượng mới có thể được tạo từ trong một script thông qua hàm Instance.new().
Tạo một đối tượng Folder mới bằng cách sử dụng Instance.new("Folder"), lưu kết quả vào một biến mới có tên là leaderstats.
local function onPlayerAdded(player)local leaderstats = Instance.new("Folder")endĐặt thuộc tính Name của leaderstats thành "leaderstats".
Parent leaderstats vào player.
local Players = game:GetService("Players")local function onPlayerAdded(player)local leaderstats = Instance.new("Folder")leaderstats.Name = "leaderstats"leaderstats.Parent = playerendPlayers.PlayerAdded:Connect(onPlayerAdded)
Tạo điểm
Hệ thống bảng xếp hạng đọc bất kỳ giá trị nào trong thư mục leaderstats và hiển thị bất cứ điều gì nó tìm thấy.
Để thêm một thống kê theo dõi điểm của người chơi, một đối tượng IntValue mới có thể được parent vào thư mục leaderstats. Tên của đối tượng giá trị sẽ được hiển thị cùng với giá trị hiện tại của nó.
- Sử dụng một biến có tên là points để tạo một đối tượng IntValue mới bằng cách sử dụng Instance.new().
- Đặt Name thành "Points".
- Đặt Value thành 0; đây là giá trị mà bảng xếp hạng sẽ hiển thị ban đầu cho người chơi.
- Parent đối tượng points vào thư mục 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)Kiểm tra trò chơi của bạn và bạn sẽ thấy bảng xếp hạng xuất hiện ở góc trên bên phải với tên của người dùng và điểm số bên cạnh họ.
Đếm thời gian
Mỗi người dùng nên kiếm được một điểm cho mỗi giây họ sống. Một vòng lặp while và hàm task.wait() có thể được sử dụng để cập nhật giá trị điểm mỗi giây.
- Ở cuối script, tạo một vòng lặp while với true là điều kiện.
- Trong vòng lặp, task.wait() trong 1 giây.
Players.PlayerAdded:Connect(onPlayerAdded)
while true do
task.wait(1)
endDanh sách người chơi
Để chạy mã cho mỗi người dùng trong trò chơi, bạn cần lặp qua mảng người dùng được trả về bởi hàm GetPlayers.
Một mảng là một danh sách các mục được lưu trữ theo thứ tự. Mỗi mục có thể được truy cập bằng vị trí chỉ số của nó, bắt đầu từ 1. Bạn có thể lấy độ dài của một mảng bằng cách thêm # vào trước nó.
- Lưu kết quả của Players:GetPlayers() vào một biến playerList.
- Tạo một vòng lặp for với giá trị bắt đầu là 1 và giá trị kết thúc là #playerList, để bạn có một lần lặp của vòng lặp cho mỗi người chơi.
while true do
task.wait(1)
local playerList = Players:GetPlayers()
for currentPlayer = 1, #playerList do
-- Thêm logic của bạn ở đây cho mỗi người chơi trong playerList
end
endThưởng điểm
Để thưởng một điểm cho mỗi người dùng trong vòng lặp for, bạn sẽ cần lấy người dùng ra khỏi mảng và thêm 1 vào đối tượng Points được lưu trữ trong thư mục leaderstats của họ.
Các đối tượng được lưu trữ trong một mảng được truy cập bằng cách sử dụng dấu ngoặc vuông - ví dụ, mục đầu tiên trong mảng playerList có thể được truy cập bằng playerList[1]. Nếu bạn viết playerList[currentPlayer] trong vòng lặp for, bạn có thể di chuyển qua từng người dùng trong danh sách với mỗi lần lặp của vòng lặp.
- Lưu người dùng tại playerList[currentPlayer] vào một biến có tên là player.
- Lưu đối tượng Points của người dùng vào một biến có tên là 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
endKiểm tra trò chơi của bạn và bạn sẽ thấy rằng bảng xếp hạng hiển thị điểm số của người chơi tăng lên 1 mỗi giây.
Lắng nghe các nhân vật
Mục tiêu của trò chơi là xem ai có thể sống lâu nhất, vì vậy những người dùng chết sẽ cần phải có điểm số của họ được đặt lại về 0.
Bạn sẽ cần lấy mô hình Character cho người dùng để phát hiện khi họ đã chết. Mô hình này chỉ được thêm vào trò chơi sau khi đối tượng Player đã được tải và bạn có thể sử dụng sự kiện CharacterAdded để lắng nghe khi nhân vật đã sẵn sàng để sử dụng. Tạo một hàm có tên là onCharacterAdded với hai tham số: một cho nhân vật, một cho người chơi.
local Players = game:GetService("Players")
local function onCharacterAdded(character, player)
end
local function onPlayerAdded(player)
local leaderstats = Instance.new("Folder")Mặc dù bạn đã bao gồm người dùng trong các tham số của hàm onCharacterAdded, sự kiện thực tế CharacterAdded chỉ trả về nhân vật, không phải người dùng liên kết. Để truyền đối tượng player cũng như vậy, hãy sử dụng một hàm ẩn danh cho kết nối sự kiện.
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Đặt lại điểm
Khi một người dùng chết, Humanoid của họ tự động kích hoạt một sự kiện Died. Bạn có thể sử dụng sự kiện này để tìm ra khi nào cần đặt lại điểm của họ.
Humanoid được tìm thấy bên trong mô hình Character, nhưng nội dung của mô hình đó chỉ được lắp ráp khi người dùng xuất hiện. Để làm cho mã của bạn an toàn chờ đợi đối tượng Humanoid được tải, hãy sử dụng hàm WaitForChild(). Bạn có thể gọi nó trên bất kỳ đối tượng cha nào, truyền vào tên chuỗi của đứa trẻ mà bạn đang chờ đợi. Tạo một biến để chờ đợi Humanoid bằng cách sử dụng character:WaitForChild("Humanoid").
local Players = game:GetService("Players")
local function onCharacterAdded(character, player)
local humanoid = character:WaitForChild("Humanoid")
endHàm bạn cần kết nối với sự kiện Died rất ngắn và chỉ bao giờ cần ở đây, vì vậy bạn có thể sử dụng một hàm ẩn danh một lần nữa.
- Kết nối một hàm ẩn danh mới với sự kiện Died của Humanoid.
- Trong hàm ẩn danh, tạo một biến có tên là points cho đối tượng Points của người chơi.
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)
endKiểm tra điều này và bạn sẽ thấy điểm số của người dùng được đặt lại khi họ chết.
Kiểm tra người chơi
Nếu người dùng tiếp tục kiếm điểm ngay cả khi đã chết, điều này sẽ không đúng với tinh thần của trò chơi, vì vậy mã cần kiểm tra xem người dùng có còn sống hay không trước khi thưởng một điểm.
Bạn cần bắt đầu bằng cách định nghĩa một thuộc tính trong hàm onPlayerAdded có thể được sử dụng để kiểm tra xem người dùng có còn sống hay không. Tại thời điểm này, người dùng chưa sống và chưa xuất hiện, vì mô hình nhân vật của họ vẫn cần được thêm vào.
Các thuộc tính cho phép bạn tùy chỉnh các đối tượng trong Roblox với dữ liệu của riêng bạn. Một thuộc tính bao gồm một tên và một giá trị. Bạn có thể tạo một thuộc tính trên bất kỳ đối tượng nào bằng cách sử dụng hàm SetAttribute. Gọi SetAttribute trên player để tạo một thuộc tính mới có tên là "IsAlive" với giá trị 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)
endKhi mô hình nhân vật của người dùng tái sinh, giá trị của IsAlive cần được thay đổi thành true để người dùng có thể bắt đầu kiếm điểm trở lại.
- Trong onCharacterAdded, đặt thuộc tính IsAlive của player thành true.
- Trong onCharacterDied, đặt thuộc tính IsAlive của player thành 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)
endCuối cùng, IsAlive nên được kiểm tra trước khi bất kỳ điểm nào được thưởng trong vòng lặp while ở cuối script. Hàm GetAttribute nhận tên của một thuộc tính và trả về giá trị. Trong vòng lặp while, bọc mã để thưởng một điểm trong một câu lệnh if với điều kiện 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
endKiểm tra trò chơi của bạn bây giờ và bạn sẽ thấy người dùng kiếm điểm mỗi giây họ còn sống, và giữ ở mức 0 khi không còn sống. Hãy để bạn bè chơi cùng bạn và xem ai có thể đạt được điểm số cao nhất.
Đây chỉ là khởi đầu: bạn có thể tiếp tục cải thiện trò chơi của mình cho người dùng. Dưới đây là một số mẹo:
- Đặt mã cho tất cả các nền tảng vào một script duy nhất, giúp việc cập nhật dễ dàng hơn.
- Tạo một khu vực chờ nơi người dùng chờ được dịch chuyển đến khu vực trò chơi, cho phép người dùng bắt đầu đồng thời.
- Thông báo người chiến thắng của mỗi vòng.
Mã cuối cùng
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