Người chơi hiện có thể thu thập tiền xu và mất chúng khi họ chết, nhưng tiền xu không có tác dụng gì, và hầu hết thế giới 3D không thể truy cập được mà 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ò chơi của bạn bằng cách thêm một nút trên màn hình mà tiêu tốn tiền xu để tăng cường sức nhảy.
Tạo nút nâng cấp
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 có nội dung Nâng cấp Nhảy (5 Tiền xu) bên trong một container ScreenGui.
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: "Nâng cấp Nhảy (5 Tiền xu)"
- 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, bậ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 được thay đổi, tất cả những gì cần thiết để lưu trữ sức nhảy của người chơi là thêm một khóa Jump và khởi tạo giá trị ban đầu của nó trong defaultPlayerData().
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
Bây giờ mà PlayerData có thể theo dõi sức nhảy, bạn cần triển khai 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 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 sức nhảy của người chơi thành công, vì vậy bạn nên sử dụng một hàm từ xa.
Trong ServerScriptService, tạo một Script có tên JumpService với mã sau:
```lua
-- Dịch vụ
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local ServerStorage = game:GetService("ServerStorage")
local Players = game:GetService("Players")
-- Module
local Leaderboard = require(ServerStorage.Leaderboard)
local PlayerData = require(ServerStorage.PlayerData)
-- Sự kiện
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 vào 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 của 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ã một cách 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. Hàm này tương tự như mã gây sát thương cho người chơi trong Tạo mối nguy hiểm cho người chơi. Nếu một mô hình Character và Humanoid tồn tại cho người chơi đang được nâng cấp, hàm 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 từ 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ả cá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ây giờ bạ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à triển khai hành vi khi nút được nhấn.
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ã một cách 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 các tham chiếu đến hàm và GUI mà 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ệ) để gọi RemoteFunction. Bất kỳ giao tiếp nào giữa client và máy chủ như thế này đều yêu cầu pcall() để xử lý lỗi hoặc vấn đề 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 chuột, màn hình cảm ứng hoặc bối cảnh gamepad. Nó được kích hoạt khi một nhấp chuột, chạm, hoặc nút gamepad được thả ra.
Chơi thử
Chọn Test từ menu thả xuống và nhấp vào Play. Nút Nâng cấp Nhảy xuất hiện ở góc dưới bên phải.
Hãy 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 xem nó có không trao 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 không.
Với mã đã hoàn thành, hãy thử điều chỉnh độ khó: thêm tiền xu nếu tốc độ cảm thấy chậm, hoặc loại bỏ một vài và giấu chúng ở những vị trí khó hơn nếu việc nâng cấp quá dễ dàng.