Viết một 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 bây 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 trò chơi 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 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 mạnh 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 bộ sưu tập các thành phần GUI bên trong một thùng chứa GUI.Trong trường hợp này, bạn chỉ cần một thành phần TextButton nói rằng Nâng cấp Nhảy (5 Tiền xu) bên trong một thùng chứa ScreenGui.

Để tạo GUI:

  1. Trong cửa sổ Explorer , thêm một thư mục mới vào ReplicatedStorage , sau đó đổi tên thư mục thành Instances .Bất kỳ đối tượng nào trong ReplicatedStorage có thể truy cập vào khách hàng Roblox của mỗi người chơi, nơi GUIs được hiển thị.
  2. Thêm một đối tượng ScreenGui vào thư mục Instances .
  3. Chọn đối tượng ScreenGui , sau đó trong cửa sổ Tính năng ,
    1. Đặt Tên đến JumpPurchaseGui .
    2. Vô hiệu hóa ResetOnSpawn để đảm bảo GUI vẫn là cha của người chơi khi họ hồi sinh.
  4. Trong cửa sổ Explorer , hãy chèn một TextButton vào thùng chứa JumpPurchaseGui , sau đó đổi tên nút văn bản thành JumpButton .
  5. (Tùy chọn) Tùy chỉnh sự xuất hiện và vị trí của nút bằng cách cấu hình các thuộc tính của nó. Các gợi ý đơn giản bao gồm:
    • Đặt thuộc tính Văn bản thành Nhảy nâng cấp (5 tiền xu) .
    • Đặt thuộc tính Kích thước văn bản thành 25.
    • Set AnchorPoint to 1, 1Vị trí to {1, 0},{1, 0} to di chuyển nút vào góc dưới bên phải.

Bạn sẽ thêm nút vào GUI của người chơi sau trong hướng dẫn này, nhưng trước khi bạn làm, bạn cần phải xác định tất cả các logic và dữ liệu cần thiết để nút hoạt động.

Xác định dữ liệu sức nhảy

Hiện tại, chỉ số tiền xu được lưu cho mỗi người chơi trong kịch bản module PlayerData .Bạn cũng cần lưu trữ và cập nhật sức nhảy theo cùng một cách.Bởi vì các chức năng 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 sức mạnh nhảy của người chơi là thêm một chìa khóa Jump và khởi tạo giá trị ban đầu của nó trong DEFAULT_PLAYER_DATA .

Để cập nhật kịch bản mô-đun Dữ liệu người chơi để lưu sức nhảy:

  1. Trong cửa sổ Explorer , mở trình kịch bản module PlayerData trong ServerStorage .

  2. Thay thế mã trong kịch bản bằng các mẫu sau, mà khởi tạo một giá trị cho mỗi người chơi cùng với giá trị hiện có của họ:


    local PlayerData = {}
    PlayerData.COIN_KEY_NAME = "Coins"
    PlayerData.JUMP_KEY_NAME = "Jump"
    local playerData = {
    --[[
    [userId: string] = {
    ["Coins"] = coinAmount: number,
    ["Jump"] = jumpPower: number
    }
    --]]
    }
    local DEFAULT_PLAYER_DATA = {
    [PlayerData.COIN_KEY_NAME] = 0,
    [PlayerData.JUMP_KEY_NAME] = 0,
    }
    local function getData(player)
    local data = playerData[tostring(player.UserId)] or DEFAULT_PLAYER_DATA
    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ờ PlayerData có thể theo dõi sức mạnh nhảy, bạn cần triển khai logic trên máy chủ để nâng cấp sức mạnh nhảy từ yêu cầu của khách hàng của người chơi.

Máy chủ và khách hàng có thể giao tiếp thông qua sự kiện remote hoặc chức năng remote.Sự kiện điều khiển từ xa không xảy ra khi bị kích hoạt và thích hợp cho giao tiếp một chiều.Chức năng remote hoạt động cho đến khi nhận được phản hồi, cho phép giao tiếp hai chiều.Trong trường hợp này, khách hàng cần biết liệu máy chủ đã nâng cấp thành công sức nhảy của người chơi hay không, do đó chức năng điều khiển từ xa là lý tưởng.

Để thực hiện nâng cấp nhảy:

  1. Trong cửa sổ Explorer , mở thư mục Instances trong ReplicatedStorage .

  2. Thêm một RemoteFunction vào thư mục Instances , sau đó đổi tên chức năng điều khiển từ xa thành IncreaseJumpPowerFunction .Bạn luôn tạo chức năng điều khiển từ xa trong ReplicatedStorage vì cả khách hàng và máy chủ đều phải có thể truy cập chúng.

    Studio's Explorer window with the IncreaseJumpPowerFunction script highlighted under the Instances folder.
  3. Trong cửa sổ Explorer , chọn StarterPlayer .

  4. Trong cửa sổ Tính năng , bật chức năng Sử dụng nhảy nhân vật tính năng.Mặc định, giá trị năng lượng nhảy của một nhân vật không xác định số tiền mà một nhân vật nhảy, vì vậy cần phải bật nó.

  5. Trong cửa sổ Explorer , hãy chèn một kịch bản mới vào ServerScriptService , sau đó đổi tên kịch bản thành JumpService .Tập lệnh này sẽ chứa logic cho nhảy nâng cấp.

  6. Thay thế mã mặc định bằng mã sau:


    -- Dịch vụ
    local ReplicatedStorage = game:GetService("ReplicatedStorage")
    local ServerStorage = game:GetService("ServerStorage")
    local Players = game:GetService("Players")
    -- Mô-đun
    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 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 tiếp theo mô tả mã chi tiết hơn.

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

    • Xác minh yêu cầu máy chủ - onPurchaseJumpIncrease() kiểm tra đầu tiên xem người chơi có thực sự có số tiền xu cần thiết để mua nâng cấp hay không. Tất cả các yêu cầu từ khách hàng đến máy chủ phải là được xác minh để ngăn chặn những kẻ xấu gửi yêu cầu giả mạo và lạm dụng trải nghiệm 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 vào đối tượng PlayerGui của người chơi.Mặc định, nó bao gồm GUI hệ thống như cửa sổ trò chuyện.Bây giờ bạn cần tạo một kịch bản 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ó được nhấn.

Để thêm nút vào GUI của người chơi khi họ tham gia:

  1. Trong cửa sổ Explorer , tạo một Tập lệnh trong ReplicatedStorage .

  2. Chọn kịch bản, sau đó trong cửa sổ Tính năng ,

    1. Đặt Tên đến JumpButtonClickHandler .
    2. Thiết lập RunContext đến Client . Điều này cho thiết động cơ luôn chạy kịch bản này trên khách hàng để tối ưu hóa giao tiếp mạng.
  3. Trong kịch bản mở, thay thế mã mặc định bằng mã sau:


    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
    -- đã mua sẽ là tin nhắc lỗi nếu thành công là sai
    error(purchased)
    elseif success and not purchased then
    warn("Not enough coins!")
    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 tiếp theo mô tả mã chi tiết hơn.

    • Nhận được tham chiếu đến chức năng GUI và máy chủ - Các biến IncreaseJumpPowerFunction , jumpPurchaseGuijumpButton chứa tham chiếu đến chức năng và GUI mà bạn sẽ cần sau này.
    • Xác định người xử lý sự kiện - onButtonClicked() xác định logic khi người dùng nhấp vào nút nâng cấp.Nó sử dụng pcall() (cuộc gọi bảo vệ) để kích hoạt RemoteFunction .Bất kỳ giao tiếp client-server như thế này yêu cầu pcall() để xử lý lỗi hoặc vấn đề kết nối.
    • Kết nối 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 gamepad.Nó kích hoạt khi một nhấp vào , chạm vào hoặc nút gamepad được phát hành.

Thử nghiệm

Bạn nên bây giờ có thể mua nâng cấp nhảy cho tiền xu bằng nút nâng cấp. Để kiểm tra dự án:

  1. Trong thanh công cụ, nhấp vào nút Chơi . Studio bước vào chế độ thử nghiệm.

    Play button highlighted in Studio's playtesting options.
  2. Nếu các kịch bản của bạn hoạt động đúng cách, một nút để mua sức mạnh nhảy xuất hiện trên màn hình.Hãy thử nhấp vào nút trước khi thu thập bất kỳ tiền xu nào để kiểm tra xem nó không trao cho bạn thêm sức nhảy, sau đó thử thu thập một số tiền xu và xem nếu nâng cấp hoạt động khi bạn nhấp lại.

Bây giờ khi mã hoàn thành, hãy thử cân bằng trò chơi thông qua số lượng và vị trí của các đồng tiền.Thêm thêm tiền nếu trò chơi cảm thấy quá chậm, hoặc trừ tiền và đặt chúng vào những nơi thách thức nếu cảm thấy quá nhanh và dễ dàng.