Bây giờ bạn có thể phát hiện khi một người chơi đã thu thập được một đồng xu, phần này của hướng dẫn dạy bạn cách đếm bao nhiêu đồng xu mà người chơi đã thu thập, và làm cho số tiền đó trở nên hiển thị trên bảng xếp hạng.
Tạo một kịch bản module để ghi lại việc thu thập tiền bộ sưu tập
Để quản lý và lưu trữ dữ liệu sưu tầm tiền của mỗi người chơi, bạn cần tạo một đối tượng ModuleScript để chứa một cấu trúc dữ liệu và chức năng truy cập dữ liệu sưu tầm tiền cho mỗi người chơi.Các kịch bản mô-đun là mã có thể tái sử dụng mà các kịch bản khác có thể yêu cầu.Trong trường hợp này, CoinService yêu cầu kịch bản module này để có thể cập nhật dữ liệu thu thập tiền xu khi người chơi chạm vào tiền xu.
Để tạo một kịch bản module:
Trong cửa sổ Explorer , di chuột qua ServerStorage và nhấp vào nút ⊕ . Một menu ngữ cảnh hiển thị.
Từ menu ngữ cảnh, hãy chọn ModuleScript .Một kịch bản module mới hiển thị dưới ServerStorage .Bạn đang đặt một kịch bản module vào ServerStorage vì bạn muốn quản lý logic thu thập tiền xu trên máy chủ.
Đổi tên kịch bản mô-đun thành PlayerData .
Thay thế mã mặc định bằng mã sau:
local PlayerData = {}PlayerData.COIN_KEY_NAME = "Coins"local playerData = {--[[[userId: string] = {["Coins"] = coinAmount: number}]]}local DEFAULT_PLAYER_DATA = {[PlayerData.COIN_KEY_NAME] = 0}local function getData(player)local data = playerData[tostring(player.UserId)] or DEFAULT_PLAYER_DATAplayerData[tostring(player.UserId)] = datareturn dataendfunction PlayerData.getValue(player, key)return getData(player)[key]endfunction PlayerData.updateValue(player, key, updateFunction)local data = getData(player)local oldValue = data[key]local newValue = updateFunction(oldValue)data[key] = newValuereturn newValueendreturn PlayerDataGiải thích mãTập lệnh mô-đun định nghĩa một bảng PlayerData chứa không có hoặc nhiều bảng playerData , đại diện cho dữ liệu thu thập tiền xu cho một người chơi.Mọi kịch bản yêu cầu kịch bản module này nhận được bản sao giống nhau của bảng PlayerData, cho phép nhiều kịch bản thay đổi và chia sẻ dữ liệu thu thập tiền xu.
Tuyên bố cấu trúc dữ liệu
Tập lệnh mô-đun bắt đầu với tuyên bố về một bảng trống, PlayerData , được trả lại vào cuối tập lệnh.Nó cũng bao gồm các phương pháp truy cập để lấy và đặt giá trị trong bảng.
Bảng playerData bao gồm các bình luận mô tả cấu trúc của bảng, làm cho mã dễ hiểu hơn.Trong trường hợp này, một bảng playerData bao gồm một userId và một trường tương ứng có tên là Coins đại diện cho số tiền xu được thu thập cho người chơi đó.
local PlayerData = {}PlayerData.COIN_KEY_NAME = "Coins"local playerData = {--[[[userId: string] = {["Coins"] = coinAmount: number}]]}...return PlayerDataXác định một truy cập dữ liệu địa phương
getData() là một chức năng địa phương truy xuất dữ liệu cho một bảng cụ thể playerData .Nếu một người chơi chưa thu thập được một đồng tiền, nó trả về một bảng DEFAULT_PLAYER_DATA để đảm bảo rằng mỗi người chơi có một số dữ liệu liên quan đến họ.Một công ước phổ biến là tạo các chức năng đơn giản, hướng công cộng mà chuyển giao logic sang các chức năng có phạm vi địa phương thực hiện nâng hạ nặng.
local DEFAULT_PLAYER_DATA = {[PlayerData.COIN_KEY_NAME] = 0}local function getData(player)local data = playerData[tostring(player.UserId)] or DEFAULT_PLAYER_DATAplayerData[tostring(player.UserId)] = datareturn dataendXác định truy cập dữ liệu công cộng
getValue() và updateValue() là chức năng công cộng mà các kịch bản khác cần kịch bản module này có thể gọi.Trong trường hợp của chúng tôi, CoinService sử dụng các chức năng này để cập nhật dữ liệu bộ sưu tập tiền xu của người chơi mỗi khi người chơi chạm vào một đồng xu.
function PlayerData.getValue(player, key)return getData(player)[key]endfunction PlayerData.updateValue(player, key, updateFunction)local data = getData(player)local oldValue = data[key]local newValue = updateFunction(oldValue)data[key] = newValuereturn newValueend
Triển khai bảng xếp hạng
Bạn có thể đại diện dữ liệu thu thập tiền xu bằng cách hiển thị bảng xếp hạng trên màn hình.Roblox bao gồm một hệ thống tích hợp sẵn tự động tạo bảng xếp hạng bằng cách sử dụng UI mặc định.
Để tạo bảng xếp hạng:
Trong cửa sổ Explorer , tạo một ModuleScript trong ServerStorage , sau đó đổi tên kịch bản module thành Bảng xếp hạng .
Thay thế mã mặc định bằng mã sau:
local Leaderboard = {}-- Tạo một bảng xếp hạng mớilocal function setupLeaderboard(player)local leaderstats = Instance.new("Folder")-- Tên 'leaderstats' là một tên được dự trữ Roblox công nhận để tạo bảng xếp hạngleaderstats.Name = "leaderstats"leaderstats.Parent = playerreturn leaderstatsend-- Tạo một giá trị chỉ số bảng xếp hạng mớilocal function setupStat(leaderstats, statName)local stat = Instance.new("IntValue")stat.Name = statNamestat.Value = 0stat.Parent = leaderstatsreturn statend-- Cập nhật giá trị chỉ số của một người chơifunction Leaderboard.setStat(player, statName, value)local leaderstats = player:FindFirstChild("leaderstats")if not leaderstats thenleaderstats = setupLeaderboard(player)endlocal stat = leaderstats:FindFirstChild(statName)if not stat thenstat = setupStat(leaderstats, statName)endstat.Value = valueendreturn LeaderboardGiải thích mãCác phần tiếp theo mô tả cách bảng xếp hạng hoạt động chi tiết hơn.
Tạo bảng xếp hạng
Chức năng setupLeaderboard() tạo một ví dụ thư mục mới có tên là leaderstats và đặt nó là con của người chơi được chỉ định.Roblox tự động nhận ra một thư mục có tên leaderstats như một container của chỉ số và tạo một thành phần UI để hiển thị chỉ số.Nó yêu cầu các giá trị trong leaderstats được lưu trữ như đối tượng "giá trị" (như StringValue , IntValue hoặc NumberValue ).
-- Tạo một bảng xếp hạng mớilocal function setupLeaderboard(player)local leaderstats = Instance.new("Folder")-- Tên 'leaderstats' là một tên được dự trữ Roblox công nhận để tạo bảng xếp hạngleaderstats.Name = "leaderstats"leaderstats.Parent = playerreturn leaderstatsend-- Tạo một giá trị chỉ số bảng xếp hạng mớilocal function setupStat(leaderstats, statName)local stat = Instance.new("IntValue")stat.Name = statNamestat.Value = 0stat.Parent = leaderstatsreturn statendCập nhật chỉ số người chơi
setStat() là chức năng công cộng duy nhất trong mô-đun Bảng xếp hạng .Nó tạo giá trị chỉ số cho một người chơi hoặc bảng xếp hạng cụ thể nếu nó chưa tồn tại.
FindFirstChild() lấy tên của một đối tượng và trả về đối tượng nếu nó tồn tại, hoặc nil nếu nó không tồn tại.Đó là một phương pháp phổ biến và an toàn để xác định xem một đối tượng có tồn tại trước khi bạn sử dụng nó.
-- Cập nhật giá trị chỉ số của một người chơifunction Leaderboard.setStat(player, statName, value)local leaderstats = player:FindFirstChild("leaderstats")if not leaderstats thenleaderstats = setupLeaderboard(player)endlocal stat = leaderstats:FindFirstChild(statName)if not stat thenstat = setupStat(leaderstats, statName)endstat.Value = valueend
Tích hợp các kịch bản module
Với cả hai mô-đun Dữ liệu người chơi và Bảng xếp hạng hoàn thành, yêu cầu chúng trong mô-đun CoinService để quản lý và hiển thị dữ liệu tiền xu người chơi.Để cập nhật CoinService :
Trong cửa sổ Explorer , mở kịch bản CoinService .
Thay thế mã hiện tại bằng mã sau:
-- Khởi tạo các dịch vụ và biến sốlocal Workspace = game:GetService("Workspace")local Players = game:GetService("Players")local ServerStorage = game:GetService("ServerStorage")-- Mô-đunlocal Leaderboard = require(ServerStorage.Leaderboard)local PlayerData = require(ServerStorage.PlayerData)local coinsFolder = Workspace.World.Coinslocal coins = coinsFolder:GetChildren()local COIN_KEY_NAME = PlayerData.COIN_KEY_NAMElocal COOLDOWN = 10local COIN_AMOUNT_TO_ADD = 1local function updatePlayerCoins(player, updateFunction)-- Cập nhật bảng tiền xulocal newCoinAmount = PlayerData.updateValue(player, COIN_KEY_NAME, updateFunction)-- Cập nhật bảng xếp hạng tiền xuLeaderboard.setStat(player, COIN_KEY_NAME, newCoinAmount)end-- Xác định người xử lý sự kiệnlocal function onCoinTouched(otherPart, coin)if coin:GetAttribute("Enabled") thenlocal character = otherPart.Parentlocal player = Players:GetPlayerFromCharacter(character)if player then-- Người chơi chạm vào một đồng xucoin.Transparency = 1coin:SetAttribute("Enabled", false)updatePlayerCoins(player, function(oldCoinAmount)oldCoinAmount = oldCoinAmount or 0return oldCoinAmount + COIN_AMOUNT_TO_ADDend)task.wait(COOLDOWN)coin.Transparency = 0coin:SetAttribute("Enabled", true)endendend-- Thiết lập người lắng nghe sự kiệnfor _, coin in coins docoin:SetAttribute("Enabled", true)coin.Touched:Connect(function(otherPart)onCoinTouched(otherPart, coin)end)endGiải thích mãCác thay đổi đối với kịch bản ban đầu CoinService bao gồm:
- Tuyên bố COIN_AMOUNT_TO_ADD là số tiền xu cần thêm khi một người chơi thu thập một tiền xu, và COIN_KEY_NAME là tên chìa khóa được định nghĩa trong PlayerData .
- Tạo chức năng trợ giúp updatePlayerCoins() để cập nhật số tiền xu của người chơi và chỉ số bảng xếp hạng liên quan.
- Thay thế tuyên bố placeholder bằng một cuộc gọi đến .
Thử nghiệm
Đã đến lúc xem xem bộ sưu tập tiền xu hoạt động như dự định.Khi bạn chạm và thu thập một đồng tiền trong trò chơi, bạn nên có thể nhìn thấy số tiền xu bạn đã thu thập trên UI bảng xếp hạng.Để thử nghiệm trải nghiệm của bạn:
Trong thanh công cụ, nhấp vào nút Chơi . Studio bước vào chế độ thử nghiệm.
Di chuyển nhân vật của bạn để chạm vào một đồng xu.Nếu các kịch bản của bạn hoạt động đúng cách, giao diện người dùng bảng xếp hạng hiển thị và tăng số tiền xu của bạn khi bạn thu thập thêm tiền xu.