Dự án này sẽ sử dụng các câu lệnh điều kiện để tạo một phần sẽ trao hoặc trừ điểm trên bảng điểm tùy thuộc vào màu sắc của phần khi được chạm vào. Nếu là màu xanh, nó sẽ trao cho người chơi một số điểm. Nếu là màu xanh lá, nó sẽ trao cho người chơi nhiều điểm. Cuối cùng, nếu là màu đỏ, nó sẽ trừ điểm.
Thiết lập dự án
Phần trao điểm có thể được thêm vào bất kỳ dự án nào nơi điểm số là quan trọng. Ví dụ, một trò chơi phiêu lưu nơi người chơi thu thập điểm.
Theo dõi điểm số
Để thiết lập dự án này, bạn sẽ cần một bảng điểm để theo dõi điểm số và một phần thay đổi màu sắc. Mã cho bảng điểm sẽ được cung cấp.
Tạo một kịch bản mới trong ServerScriptService có tên là Leaderboard. Sao chép và dán mã dưới đây vào kịch bản.
-- Trong ServerScriptService, tạo một kịch bản có tên PlayerSetup với nội dung dưới đây.local Players = game:GetService("Players")local function onPlayerJoin(player)local leaderstats = Instance.new("Folder")leaderstats.Name = "leaderstats"leaderstats.Parent = player-- Ví dụ về IntValuelocal points = Instance.new("IntValue")points.Name = "Points"points.Value = 0points.Parent = leaderstatsend-- Chạy onPlayerJoin khi sự kiện PlayerAdded được kích hoạtPlayers.PlayerAdded:Connect(onPlayerJoin)
Phần thay đổi màu sắc
Kịch bản sẽ tuần hoàn qua ba màu khác nhau cho phần. Mỗi màu sẽ có một biến để lưu trữ giá trị RGB, một kiểu dữ liệu bao gồm một tập hợp ba số (đỏ, xanh lục, xanh lam) tạo ra màu sắc.
Tạo một phần có tên PointPart với một kịch bản đính kèm có tên PointScript.
Trong PointScript, sử dụng script.Parent để tham chiếu đến phần.
local pointPart = script.ParentTạo các biến để lưu trữ các màu sắc khác nhau. Mỗi biến nên được đặt thành Color3.fromRGB(), mà tạo ra một giá trị màu sắc.
- Xanh Dương (Một số điểm): (0, 0, 255)
- Xanh Lá (Nhiều điểm): (0, 255, 0)
- Đỏ (Mất điểm): (255, 0, 0)
local pointPart = script.Parent-- Màu sắclocal blue = Color3.fromRGB(0, 0, 255)local green = Color3.fromRGB(0, 255, 0)local red = Color3.fromRGB(255, 0, 0)Thêm biến cho một số lượng điểm nhỏ, một số lượng điểm lớn hơn, và một thứ ba để trừ điểm.
-- Màu sắclocal blue = Color3.fromRGB(0, 0, 255)local green = Color3.fromRGB(0, 255, 0)local red = Color3.fromRGB(255, 0, 0)-- Giá trị điểmlocal smallPoints = 10local largePoints = 50local losePoints = 100
Thêm dịch vụ người chơi
Để trao điểm, bạn sẽ cần truy cập thông tin của người chơi được lưu trữ trong Explorer dưới Players, và tách biệt khỏi đối tượng nhân vật. Đây là nơi thông tin như thống kê bảng điểm có thể được tìm thấy.
Bạn có thể làm như vậy bằng cách thêm dịch vụ Players vào kịch bản của bạn. Dịch vụ là các tập hợp thêm các hàm được xây dựng trước bởi các kỹ sư Roblox để giúp bạn tiết kiệm thời gian.
Lấy dịch vụ Players bằng cách gõ:
local Players = game:GetService("Players")
-- Giá trị điểmlocal smallPoints = 10local largePoints = 50local losePoints = 100-- Dịch vụ cần thiếtlocal Players = game:GetService("Players")
Chức năng và sự kiện
PointsScript sẽ cần hai chức năng. Chức năng đầu tiên sẽ trao và trừ điểm. Chức năng thứ hai sẽ kiểm tra xem một người chơi đã chạm vào phần hay chưa. Những chức năng này sẽ được kết nối với một sự kiện chạm, mà chạy mỗi khi phần đó bị chạm vào.
Tạo một chức năng mới có tên givePoints() và một tham số có tên player. Bên trong, thêm một câu lệnh in để sử dụng cho việc kiểm tra.
local Players = game:GetService("Players")-- Trao hoặc trừ điểmlocal function givePoints(player)print("Đang trao điểm cho người chơi")endDưới đó, tạo một chức năng thứ hai có tên partTouched() với một tham số có tên otherPart.
-- Trao hoặc trừ điểmlocal function givePoints(player)print("Đang trao điểm cho người chơi")end-- Kiểm tra xem người chơi có chạm vào phần khônglocal function partTouched(otherPart)endBên trong chức năng, sử dụng hàm GetPlayerFromCharacter() để kiểm tra nếu có một người chơi trong biến otherPart.
-- Kiểm tra xem người chơi có chạm vào phần khônglocal function partTouched(otherPart)local player = Players:GetPlayerFromCharacter(otherPart.Parent)endNếu một người chơi chạm vào phần, nó sẽ được lưu trữ trong biến player. Nếu không, biến sẽ giữ nguyên. Tự làm:
- Bên trong chức năng, kiểm tra xem người chơi có giá trị hay không. Nếu có, thì gọi givePoints(player).
- Dưới chức năng, kết nối partTouched() với sự kiện Touched của pointPart.
-- Kiểm tra xem người chơi có chạm vào phần khônglocal function partTouched(otherPart)-- Lấy người chơi nếu có người chạm vào phầnlocal player = Players:GetPlayerFromCharacter(otherPart.Parent)if player thengivePoints(player)endendpointPart.Touched:Connect(partTouched)Chạy dự án. Mỗi khi một người chơi chạm vào phần, bạn nên thấy một thông điệp trong cửa sổ Output nói: "Đang trao điểm cho người chơi"
Mẹo Khắc Phục Sự Cố:
- Kiểm tra rằng "Players" trong game:GetService("Players") được viết hoa và trong dấu ngoặc.
- partTouched() nên được kết nối với sự kiện Touched của pointPart.
Tạo Màu Sắc Luân Phiên
Để tuần hoàn qua các màu sắc, kịch bản sẽ sử dụng một vòng lặp while mà thay đổi màu của phần mỗi vài giây. Điều kiện cho vòng lặp này sẽ là đúng, vì vậy nó có thể chạy vô hạn.
Ở cuối kịch bản, tạo một vòng lặp while mới nơi điều kiện là đúng, nghĩa là vòng lặp luôn luôn chạy.
-- Kiểm tra xem người chơi có chạm vào phần khônglocal function partTouched(otherPart)-- Lấy người chơi nếu có người chạm vào phầnlocal player = Players:GetPlayerFromCharacter(otherPart.Parent)if player thengivePoints(player)endendpointPart.Touched:Connect(partTouched)-- Luân phiên qua màu sắcwhile true doendTự làm, lập trình một vòng lặp while true do mà thay đổi pointPart thành các biến màu sắc mà bạn đã tạo. Đừng quên sử dụng task.wait() giữa các màu. Khi hoàn thành, kiểm tra mã của bạn với phiên bản dưới đây.
-- Luân phiên qua 3 màu, chờ giữa mỗi màuwhile true dopointPart.Color = bluetask.wait(3)pointPart.Color = greentask.wait(2)pointPart.Color = redtask.wait(1)endKiểm tra chơi và kiểm tra rằng cả ba màu đều luân phiên mà không dừng lại.

Mẹo khắc phục sự cố
Tại thời điểm này, nếu việc luân phiên màu sắc không hoạt động như dự định, hãy thử một trong các cách dưới đây.
- Kiểm tra rằng vòng lặp while nằm ở cuối kịch bản, dưới sự kiện Touched. Nếu vòng lặp không ở dưới cùng, nó sẽ giữ các phần khác của kịch bản không chạy đúng.
- Kiểm tra rằng mỗi màu bên trong Color3.fromRGB() được viết chính xác. Phải có ba số từ 0 đến 255 được phân cách bằng dấu phẩy, như (255, 50, 0).
Trao điểm cho người chơi
Người chơi sẽ được trao điểm dựa trên màu sắc hiện tại của phần khi họ chạm vào nó.
Tìm màu sắc hiện tại
Mỗi khi một người chơi chạm vào phần, kịch bản sẽ cần biết màu sắc hiện tại của phần để trao điểm sau này.
Tìm givePoints(). Thay thế thông điệp kiểm tra của bạn bằng một biến cho màu sắc hiện tại của pointPart. Biến này sẽ xác định số điểm mà người chơi nhận được (hoặc mất).
local function givePoints(player)local currentColor = pointPart.ColorendĐể ảnh hưởng đến điểm của một người chơi, hàm đó cần truy cập vào bảng điểm của người chơi. Tạo một biến để lưu trữ nó.
local function givePoints(player)local currentColor = pointPart.Colorlocal playerStats = player:WaitForChild("leaderstats")endBây giờ thêm một biến để lấy giá trị Points của người chơi, mà là một đứa trẻ trong bảng điểm của họ.
local function givePoints(player)local currentColor = pointPart.Colorlocal playerStats = player:WaitForChild("leaderstats")local playerPoints = playerStats:WaitForChild("Points")end
Trao hoặc trừ điểm
Tiếp theo, bạn sẽ sử dụng if và elseif để trao hoặc trừ điểm tùy thuộc vào màu sắc của phần khi được chạm vào. Nhớ rằng màu xanh trao một số điểm, màu xanh lá trao nhiều điểm và màu đỏ trừ điểm.
Bên trong givePoints(), bên dưới các biến, sử dụng một câu lệnh if để kiểm tra xem màu sắc hiện tại có phải là xanh dương và nếu có thì thêm smallPoints vào giá trị điểm hiện tại của người chơi.
local function givePoints(player)local currentColor = pointPart.Colorlocal playerStats = player:WaitForChild("leaderstats")local playerPoints = playerStats:WaitForChild("Points")if currentColor == blue thenplayerPoints.Value += smallPointsendendĐể kiểm tra màu xanh lá, thêm một điều kiện else if. Nếu xanh lá, thì thêm biến largePoints vào điểm của người chơi.
if currentColor == blue thenplayerPoints.Value += smallPointselseif currentColor == green thenplayerPoints.Value += largePointsendSử dụng một câu lệnh else để trừ điểm nếu pointsPart không phải là xanh dương và không phải màu xanh lá.
if currentColor == blue thenplayerPoints.Value += smallPointselseif currentColor == green thenplayerPoints.Value += largePointselseplayerPoints.Value -= losePointsendCuối cùng, hủy bỏ phần sau câu lệnh if để script không thể tiếp tục cấp phát điểm.
if currentColor == blue thenplayerPoints.Value += smallPointselseif currentColor == green thenplayerPoints.Value += largePointselseplayerPoints.Value -= losePointsendpointPart:Destroy()Kiểm tra chơi và kiểm tra rằng mỗi màu sắc đều trao điểm như mong đợi. Hãy chắc chắn kiểm tra tất cả ba điều kiện.
Cung cấp phản hồi cho người chơi
PointPart hoạt động, nhưng người chơi có thể không nhận thấy điều gì đã xảy ra trừ khi họ tình cờ nhìn vào bảng điểm của họ. Khắc phục điều đó bằng cách tạo ra các hạt khi PointPart bị hủy.
Việc thêm phản hồi khi người chơi sử dụng một phần, như âm thanh, rung lắc, hoặc các hạt, làm cho các tương tác với các đối tượng trở nên thỏa mãn hơn cho người chơi.
Tạo hiệu ứng hạt
Hiệu ứng hạt sẽ có màu giống như phần khi bị chạm vào. Vì các màu sắc đã được lưu trữ trong các biến, thật dễ dàng để tái sử dụng chúng.
Trong givePoints() ở cuối, tạo một thể hiện ParticleEmitter mới. Đảm bảo tên thể hiện được viết chính xác như đã hiển thị.
local particle = Instance.new("ParticleEmitter")endParticleEmitters sử dụng các chuỗi màu để điều khiển thuộc tính Color của chúng. Tạo một ColorSequence mới và truyền vào màu hiện tại của phần.
-- Hủy bỏ phầnpointPart:Destroy()-- Tạo ra các hạtlocal particle = Instance.new("ParticleEmitter")particle.Color = ColorSequence.new(currentColor)Hạt sẽ cần phải được làm cha cho người chơi đã chạm vào nó. Tạo một biến để lấy mô hình nhân vật của người chơi. Sau đó, làm cha cho hạt vào đầu của người chơi.
local particle = Instance.new("ParticleEmitter")particle.Color = ColorSequence.new(currentColor)local playerCharacter = player.Characterparticle.Parent = playerCharacter:WaitForChild("Head")Sử dụng task.wait() trong một giây nhanh, sau đó hủy hạt.
local particle = Instance.new("ParticleEmitter")particle.Color = ColorSequence.new(currentColor)local playerCharacter = player.Characterparticle.Parent = playerCharacter:WaitForChild("Head")task.wait(1)particle:Destroy()Kiểm tra chơi trò chơi và đảm bảo rằng các hạt tạm thời theo chân người chơi sau khi chạm vào mỗi màu sắc.
Mẹo Khắc Phục Sự Cố
Tại thời điểm này, nếu các hạt không hoạt động như mong muốn, hãy thử một trong những cách dưới đây.
- Đảm bảo khi tạo ra một thể hiện mới rằng ParticleEmitter được viết chính xác như đã hiển thị và bên trong dấu ngoặc.
- Khi làm cha cho các hạt, hãy đảm bảo sử dụng : giữa playerCharacter và WaitForChild() mà không có khoảng trắng giữa.
Hoàn chỉnh PointScript
Một phiên bản hoàn chỉnh của kịch bản có thể được tham khảo bên dưới.
local pointPart = script.Parent
--local storage = game:GetService("ServerStorage")
-- Trao một số điểm
local blue = Color3.fromRGB(0, 0, 255)
-- Trao nhiều điểm
local green = Color3.fromRGB(0, 255, 0)
-- Làm người chơi mất điểm
local red = Color3.fromRGB(255, 0, 0)
-- Điểm trao cho người chơi
local smallPoints = 10
local largePoints = 50
local losePoints = 100
local Players = game:GetService("Players")
local function givePoints(player)
local currentColor = pointPart.Color
local playerStats = player:WaitForChild("leaderstats")
local playerPoints = playerStats:WaitForChild("Points")
-- Trao điểm người chơi dựa trên màu sắc của phần
if currentColor == blue then
playerPoints.Value += smallPoints
elseif currentColor == green then
playerPoints.Value += largePoints
else
playerPoints.Value -= losePoints
end
-- Hủy bỏ phần, chờ một giây, và sau đó hủy bỏ hạt
pointPart:Destroy()
-- Tạo hiệu ứng sparkles và hủy bỏ nó
local playerCharacter = player.Character
local particle = Instance.new("ParticleEmitter")
particle.Color = ColorSequence.new(currentColor)
particle.Parent = playerCharacter:WaitForChild("Head")
task.wait(1)
particle:Destroy()
end
local function partTouched(otherPart)
local player = Players:GetPlayerFromCharacter(otherPart.Parent)
if player then
givePoints(player)
end
end
pointPart.Touched:Connect(partTouched)
-- Thay đổi màu sắc của phần dựa trên các biến. Cần nằm ở cuối kịch bản.
while true do
pointPart.Color = blue
task.wait(4)
pointPart.Color = green
task.wait(3)
pointPart.Color = red
task.wait(2)
end