Lập trình nút nâng cấp

*Nội dung này được dịch bằng AI (Beta) và có thể có lỗi. Để xem trang này bằng tiếng Anh, hãy nhấp vào đây.


Người chơi giờ có thể thu thập tiền xu và mất chúng khi họ chết, nhưng tiền xu không làm gì cả, và hầu hết thế giới 3D không thể truy cập được nếu không có khả năng nhảy rất cao. Phần này của hướng dẫn sẽ dạy bạn cách hoàn thành logic cho trải nghiệm của bạn bằng cách thêm một nút trên màn hình chi tiêu tiền xu để tăng sức nhảy.

Tạo nút nâng cấp

Các giao diện 2D trong Roblox thường được tạo thành từ một tập hợp các thành phần GUI bên trong một container GUI. Trong trường hợp này, bạn chỉ cần một thành phần TextButton nói Upgrade Jump (5 Coins) bên trong một container ScreenGui.

Thiết lập GUI nâng cấp

Trong ReplicatedStorage, tạo một thư mục có tên Instances.
Bên trong thư mục Instances, tạo một ScreenGui có tên JumpPurchaseGui với ResetOnSpawn bị vô hiệu hóa.
Bên trong JumpPurchaseGui, tạo một TextButton có tên JumpButton với các thuộc tính sau:
- Text: "Upgrade Jump (5 Coins)"
- TextSize: 25
- AnchorPoint: 1, 1
- Position: {1, 0}, {1, 0}
Cũng bên trong thư mục Instances, tạo một RemoteFunction có tên IncreaseJumpPowerFunction.
Cuối cùng, trên dịch vụ StarterPlayer, kích hoạt thuộc tính CharacterUseJumpPower.

Định nghĩa dữ liệu sức nhảy

Hiện tại, chỉ có số lượng tiền xu được lưu trữ cho mỗi người chơi trong script module PlayerData. Bạn cũng cần lưu trữ và cập nhật sức nhảy theo cách tương tự. Bởi vì các hàm trong PlayerData không đặc thù cho dữ liệu đang thay đổi, mọi thứ bạn cần để lưu trữ sức nhảy của người chơi chỉ là thêm một khóa Jump và khởi tạo giá trị ban đầu của nó trong defaultPlayerData().

Cập nhật PlayerData với sức nhảy

Trong ServerStorage, thay thế mã của ModuleScript PlayerData hiện có bằng mã sau:
```lua
local PlayerData = {}
PlayerData.COIN_KEY_NAME = "Coins"
PlayerData.JUMP_KEY_NAME = "Jump"
local playerData = {
--[[
[userId: string] = {
["Coins"] = coinAmount: number,
["Jump"] = jumpPower: number
}
--]]
}
local function defaultPlayerData()
return {
[PlayerData.COIN_KEY_NAME] = 0,
[PlayerData.JUMP_KEY_NAME] = 0,
}
end
local function getData(player)
local data = playerData[tostring(player.UserId)] or defaultPlayerData()
playerData[tostring(player.UserId)] = data
return data
end
function PlayerData.getValue(player, key)
return getData(player)[key]
end
function PlayerData.updateValue(player, key, updateFunction)
local data = getData(player)
local oldValue = data[key]
local newValue = updateFunction(oldValue)
data[key] = newValue
return newValue
end
return PlayerData
```

Cập nhật dữ liệu sức nhảy

Giờ đây, PlayerData có thể theo dõi sức nhảy, bạn cần thực hiện logic trên máy chủ để nâng cấp sức nhảy từ yêu cầu của client.

Máy chủ và client có thể giao tiếp thông qua RemoteEvents hoặc RemoteFunctions. Các sự kiện từ xa không chờ đợi khi chúng được kích hoạt và có thể được sử dụng cho giao tiếp một chiều. Ngược lại, các hàm từ xa sẽ chờ cho đến khi chúng nhận được phản hồi, cho phép giao tiếp hai chiều.

Đối với hướng dẫn này, client cần biết nếu máy chủ đã nâng cấp thành công sức nhảy của người chơi, vì vậy bạn nên sử dụng một hàm từ xa.

Tạo JumpService

TrongServerScriptService, tạo một Script có tên JumpService với mã như sau:
```lua
-- Services
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local ServerStorage = game:GetService("ServerStorage")
local Players = game:GetService("Players")
-- Modules
local Leaderboard = require(ServerStorage.Leaderboard)
local PlayerData = require(ServerStorage.PlayerData)
-- Events
local IncreaseJumpPowerFunction = ReplicatedStorage.Instances.IncreaseJumpPowerFunction
local JUMP_KEY_NAME = PlayerData.JUMP_KEY_NAME
local COIN_KEY_NAME = PlayerData.COIN_KEY_NAME
local JUMP_POWER_INCREMENT = 30
local JUMP_COIN_COST = 5
local function updateJumpPower(player, updateFunction)
-- Cập nhật bảng sức nhảy
local newJumpPower = PlayerData.updateValue(player, JUMP_KEY_NAME, updateFunction)
-- Cập nhật sức nhảy của người chơi
local character = player.Character or player.CharacterAdded:Wait()
local humanoid = character:FindFirstChildWhichIsA("Humanoid")
if humanoid then
humanoid.JumpPower = newJumpPower
-- Cập nhật bảng xếp hạng nhảy
Leaderboard.setStat(player, JUMP_KEY_NAME, newJumpPower)
end
end
local function onPurchaseJumpIncrease(player)
local coinAmount = PlayerData.getValue(player, COIN_KEY_NAME)
if coinAmount < JUMP_COIN_COST then
return false
end
-- Tăng sức nhảy của người chơi
updateJumpPower(player, function(oldJumpPower)
oldJumpPower = oldJumpPower or 0
return oldJumpPower + JUMP_POWER_INCREMENT
end)
-- Cập nhật bảng tiền xu
local newCoinAmount = PlayerData.updateValue(player, COIN_KEY_NAME, function(oldCoinAmount)
return oldCoinAmount - JUMP_COIN_COST
end)
-- Cập nhật bảng xếp hạng tiền xu
Leaderboard.setStat(player, COIN_KEY_NAME, newCoinAmount)
return true
end
local function onCharacterAdded(player)
-- Đặt lại sức nhảy của người chơi khi nhân vật được thêm vào
updateJumpPower(player, function(_)
return 0
end)
end
-- Khởi tạo bất kỳ người chơi nào được thêm trước khi kết nối với sự kiện PlayerAdded
for _, player in Players:GetPlayers() do
onCharacterAdded(player)
end
-- Khởi tạo bình thường người chơi từ sự kiện PlayerAdded
local function onPlayerAdded(player)
player.CharacterAdded:Connect(function()
onCharacterAdded(player)
end)
end
local function onPlayerRemoved(player)
updateJumpPower(player, function(_)
return nil
end)
end
IncreaseJumpPowerFunction.OnServerInvoke = onPurchaseJumpIncrease
Players.PlayerAdded:Connect(onPlayerAdded)
Players.PlayerRemoving:Connect(onPlayerRemoved)
```

Các phần sau mô tả mã chi tiết hơn.

  • Cập nhật dữ liệu sức nhảy - updateJumpPower() cập nhật sức nhảy của người chơi và bảng xếp hạng để cung cấp phản hồi trực quan. Chức năng này tương tự như mã làm tổn thương người chơi trong Tạo mối nguy cho người chơi. Với một mô hình CharacterHumanoid tồn tại cho người chơi đang được nâng cấp, chức năng sẽ cập nhật thuộc tính JumpPower thành giá trị mới được lưu trữ bởi PlayerData, tăng nó lên 30. Nếu bạn muốn trò chơi của bạn kéo dài lâu hơn một chút, bạn có thể giảm số này.

  • Xác thực yêu cầu máy chủ - onPurchaseJumpIncrease() đầu tiên kiểm tra rằng người chơi thực sự có số tiền xu cần thiết để mua nâng cấp. Tất cả yêu cầu từ client đến máy chủ nên được xác thực để ngăn chặn những kẻ xấu gửi yêu cầu sai và khai thác trò chơi của bạn.

Thêm nút vào GUI của người chơi

Một đối tượng ScreenGui chỉ hiển thị trên màn hình nếu nó được gán cho đối tượng PlayerGui của người chơi. Theo mặc định, điều này chứa GUI hệ thống như cửa sổ trò chuyện. Bạn hiện cần tạo một script trong ReplicatedStorage để sao chép nút nâng cấp vào GUI của mỗi người chơi và thực hiện hành vi khi nút được nhấn.

Tạo JumpButtonClickHandler

Trong ReplicatedStorage, tạo một Script có tên JumpButtonClickHandler với RunContext được đặt thành Client và mã sau:
```lua
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
local player = Players.LocalPlayer
local playerGui = player.PlayerGui
local IncreaseJumpPowerFunction = ReplicatedStorage.Instances.IncreaseJumpPowerFunction
local jumpPurchaseGui = ReplicatedStorage.Instances.JumpPurchaseGui
local jumpButton = jumpPurchaseGui.JumpButton
local function onButtonClicked()
local success, purchased = pcall(IncreaseJumpPowerFunction.InvokeServer, IncreaseJumpPowerFunction)
if not success then
-- purchased sẽ là thông báo lỗi nếu success là false
error(purchased)
elseif success and not purchased then
warn("Không đủ tiền xu!")
end
end
jumpButton.Activated:Connect(onButtonClicked)
-- Thêm JumpPurchaseGui vào Gui của người chơi
jumpPurchaseGui.Parent = playerGui
```

Các phần sau mô tả mã chi tiết hơn.

  • Lấy tham chiếu đến GUI và hàm máy chủ - Các biến IncreaseJumpPowerFunction, jumpPurchaseGui, và jumpButton chứa tham chiếu đến hàm và GUI sẽ gọi hàm mà bạn sẽ cần sau này.
  • Định nghĩa trình xử lý sự kiện - onButtonClicked() định nghĩa logic cho khi người dùng nhấp vào nút nâng cấp. Nó sử dụng pcall() (gọi bảo vệ) để kích hoạt RemoteFunction. Bất kỳ tương tác nào giữa client và máy chủ như thế này yêu cầu pcall() để xử lý lỗi hoặc sự cố kết nối.
  • Kết nối trình xử lý với nút - Sự kiện Activated tương thích trên tất cả các nền tảng, bao gồm bối cảnh chuột, màn hình cảm ứng hoặc điều khiển trò chơi. Nó được kích hoạt khi một nhấp chuột, chạm, hoặc nút điều khiển được thả.

Chơi thử

Chọn Test từ menu thả xuống và nhấp vào Play. Nút Upgrade Jump xuất hiện ở góc dưới bên phải.

Thử nhấp vào nút trước khi bạn thu thập bất kỳ tiền xu nào để kiểm tra rằng nó không cấp cho bạn sức nhảy bổ sung, sau đó hãy thử thu thập một số tiền xu và xem liệu việc nâng cấp có hoạt động khi bạn nhấp lại hay không.

Khi mã đã hoàn tất, hãy thử điều chỉnh độ khó: thêm tiền xu nếu nhịp độ cảm thấy chậm, hoặc loại bỏ một vài và đặt chúng ở những vị trí khó hơn nếu việc nâng cấp trở nên quá dễ dàng.

©2026 Roblox Corporation. Roblox, logo Roblox và Powering Imagination là các nhãn hiệu đã đăng ký và chưa đăng ký của chúng tôi tại Hoa Kỳ và các quốc gia khác.