สคริปต์ปุ่มอัพเกรด

*เนื้อหานี้แปลโดยใช้ AI (เวอร์ชัน Beta) และอาจมีข้อผิดพลาด หากต้องการดูหน้านี้เป็นภาษาอังกฤษ ให้คลิกที่นี่


ผู้เล่นสามารถเก็บเหรียญและสูญเสียมันเมื่อพวกเขาตาย แต่เหรียญไม่ทำอะไร และโลก 3D ส่วนใหญ่เข้าถึงไม่ได้โดยไม่มีความสามารถในการกระโดดสูงมาก ในส่วนนี้ของบทเรียนจะสอนวิธีการทำให้ตรรกะของคุณสมบูรณ์โดยการเพิ่มปุ่มบนหน้าจอที่ใช้เหรียญเพื่อเพิ่มพลังการกระโดด

สร้างปุ่มอัพเกรด

อินเตอร์เฟซ 2D ใน Roblox มักจะประกอบขึ้นจากการรวมกันของส่วนประกอบ GUI ภายในคอนเทนเนอร์ GUI ในกรณีนี้ คุณต้องใช้เพียง TextButton ที่เขียนว่า อัพเกรดกระโดด (5 เหรียญ) ภายในคอนเทนเนอร์ ScreenGui

ตั้งค่า GUI อัพเกรด

ใน ReplicatedStorage สร้างโฟลเดอร์ชื่อ Instances
ภายในโฟลเดอร์ Instances ให้สร้าง ScreenGui ชื่อ JumpPurchaseGui โดยปิดใช้งาน ResetOnSpawn
ภายใน JumpPurchaseGui ให้สร้าง TextButton ชื่อ JumpButton ที่มีคุณสมบัติต่อไปนี้:
- Text: "อัพเกรดกระโดด (5 เหรียญ)"
- TextSize: 25
- AnchorPoint: 1, 1
- Position: {1, 0}, {1, 0}
นอกจากนี้ ในโฟลเดอร์ Instances ให้สร้าง RemoteFunction ชื่อ IncreaseJumpPowerFunction
สุดท้ายในบริการ StarterPlayer ให้เปิดใช้งานคุณสมบัติ CharacterUseJumpPower

กำหนดข้อมูลพลังการกระโดด

ปัจจุบันนี้มีเพียงจำนวนเหรียญที่เก็บไว้สำหรับผู้เล่นแต่ละคนในสคริปต์โมดูล PlayerData คุณต้องเก็บและอัปเดตพลังการกระโดดในลักษณะเดียวกัน เนื่องจากฟังก์ชันใน PlayerData ไม่เฉพาะเจาะจงต่อข้อมูลที่ถูกเปลี่ยน สิ่งที่จำเป็นในการเก็บพลังการกระโดดของผู้เล่นคือการเพิ่มคีย์ Jump และกำหนดค่าเริ่มต้นใน defaultPlayerData()

อัปเดต PlayerData ด้วยพลังการกระโดด

ใน ServerStorage แทนที่โค้ดของโมดูล PlayerData ที่มีอยู่ด้วยโค้ดต่อไปนี้:
```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
```

อัปเดตข้อมูลพลังการกระโดด

ตอนนี้ PlayerData สามารถติดตามพลังการกระโดดได้ คุณต้องนำตรรกะไปใช้งานบนเซิร์ฟเวอร์เพื่ออัปเกรดพลังการกระโดดจากคำขอของลูกค้า

เซิร์ฟเวอร์และลูกค้าสามารถสื่อสารผ่าน RemoteEvents หรือ RemoteFunctions อีเวนต์ระยะไกลไม่ส่งผลกระทบเมื่อถูกเรียกใช้งานและสามารถใช้ในการสื่อสารแบบทางเดียว ฟังก์ชันระยะไกลในทางกลับกัน จะค้นหาจนกว่าจะได้รับการตอบกลับ ซึ่งอนุญาตให้มีการสื่อสารแบบสองทาง

สำหรับบทเรียนนี้ ลูกค้าต้องรู้ว่าเซิร์ฟเวอร์อัปเกรดพลังการกระโดดของผู้เล่นสำเร็จ ดังนั้นคุณควรใช้ฟังก์ชันระยะไกล

สร้าง JumpService

ใน ServerScriptService ให้สร้างสคริปต์ชื่อ JumpService ที่มีโค้ดต่อไปนี้:
```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)
-- อัปเดตตารางพลังการกระโดด
local newJumpPower = PlayerData.updateValue(player, JUMP_KEY_NAME, updateFunction)
-- อัปเดตพลังการกระโดดของผู้เล่น
local character = player.Character or player.CharacterAdded:Wait()
local humanoid = character:FindFirstChildWhichIsA("Humanoid")
if humanoid then
humanoid.JumpPower = newJumpPower
-- อัปเดตลีดเดอร์บอร์ดพลังการกระโดด
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
-- เพิ่มพลังการกระโดดของผู้เล่น
updateJumpPower(player, function(oldJumpPower)
oldJumpPower = oldJumpPower or 0
return oldJumpPower + JUMP_POWER_INCREMENT
end)
-- อัปเดตตารางเหรียญ
local newCoinAmount = PlayerData.updateValue(player, COIN_KEY_NAME, function(oldCoinAmount)
return oldCoinAmount - JUMP_COIN_COST
end)
-- อัปเดตลีดเดอร์บอร์ดเหรียญ
Leaderboard.setStat(player, COIN_KEY_NAME, newCoinAmount)
return true
end
local function onCharacterAdded(player)
-- รีเซ็ตพลังการกระโดดของผู้เล่นเมื่อมีการเพิ่มตัวละคร
updateJumpPower(player, function(_)
return 0
end)
end
-- เริ่มต้นผู้เล่นใด ๆ ที่เพิ่มเข้ามาก่อนที่จะเชื่อมต่อกับเหตุการณ์ PlayerAdded
for _, player in Players:GetPlayers() do
onCharacterAdded(player)
end
-- การเริ่มต้นปกติของผู้เล่นจากเหตุการณ์ 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)
```

ส่วนถัดไปจะอธิบายโค้ดให้ละเอียดมากขึ้น

  • อัปเดตข้อมูลพลังการกระโดด - updateJumpPower() อัปเดตพลังการกระโดดของผู้เล่นและลีดเดอร์บอร์ดเพื่อให้คำตอบเชิงภาพ ฟังก์ชันนี้คล้ายกับโค้ดที่ทำให้ผู้เล่นได้รับความเสียหายใน สร้างอันตรายให้กับผู้เล่น เมื่อมีการระบุโมเดล Character และ Humanoid สำหรับผู้เล่นที่ได้รับการอัปเกรด ฟังก์ชันจะอัปเดตคุณสมบัติ JumpPower เป็นค่าใหม่ที่เก็บไว้โดย PlayerData เพิ่มขึ้น 30 หากต้องการให้เกมของคุณมีระยะเวลานานขึ้นเล็กน้อย คุณสามารถลดตัวเลขนี้ได้

  • ตรวจสอบคำขอจากเซิร์ฟเวอร์ - onPurchaseJumpIncrease() จะตรวจสอบก่อนว่าผู้เล่นมีจำนวนเหรียญที่จำเป็นต่อการซื้ออัพเกรด ตัวเลือก ทุกคำขอ จากลูกค้าถึงเซิร์ฟเวอร์ควรได้รับการ ตรวจสอบ เพื่อป้องกันไม่ให้มีผู้ไม่หวังดีส่งคำขอที่เป็นเท็จและใช้ประโยชน์จากเกมของคุณ

เพิ่มปุ่มลงใน GUI ผู้เล่น

วัตถุ ScreenGui จะแสดงบนหน้าจอได้ก็ต่อเมื่อมันถูกจัดอยู่ในวัตถุ PlayerGui ของผู้เล่น โดยเริ่มต้นจะมี GUI ระบบอยู่ เช่น หน้าต่างแชท คุณต้องสร้างสคริปต์ใน ReplicatedStorage เพื่อคัดลอกปุ่มอัพเกรดไปยัง GUI ของผู้เล่นแต่ละคนและนำพฤติกรรมเมื่อมีการกดปุ่มมาใช้

สร้าง JumpButtonClickHandler

ใน ReplicatedStorage ให้สร้างสคริปต์ชื่อ JumpButtonClickHandler โดยตั้งค่า RunContext เป็น Client และโค้ดต่อไปนี้:
```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 จะเป็นข้อความแสดงข้อผิดพลาดถ้าความสำเร็จเป็นเท็จ
error(purchased)
elseif success and not purchased then
warn("เหรียญไม่เพียงพอ!")
end
end
jumpButton.Activated:Connect(onButtonClicked)
-- เพิ่ม JumpPurchaseGui ลงใน GUI ของผู้เล่น
jumpPurchaseGui.Parent = playerGui
```

ส่วนถัดไปจะอธิบายโค้ดให้ละเอียดมากขึ้น

  • รับการอ้างอิงไปยัง GUI และฟังก์ชันเซิร์ฟเวอร์ - ตัวแปร IncreaseJumpPowerFunction, jumpPurchaseGui, และ jumpButton มีการอ้างอิงไปยังฟังก์ชันและ GUI ที่เรียกฟังก์ชันที่คุณจะต้องใช้ในภายหลัง
  • กำหนดตัวจัดการเหตุการณ์ - onButtonClicked() นิยามตรรกะเมื่อผู้ใช้คลิกปุ่มอัพเกรด มันใช้ pcall() (การเรียกอย่างมีการป้องกัน) เพื่อเรียกใช้ RemoteFunction การสื่อสารระหว่างลูกค้าและเซิร์ฟเวอร์เช่นนี้ต้องการ pcall() เพื่อจัดการข้อผิดพลาดหรือปัญหาในการเชื่อมต่อ
  • เชื่อมโยงตัวจัดการเข้ากับปุ่ม - อีเวนต์ Activated สามารถใช้งานได้ในทุกแพลตฟอร์ม รวมถึงเมาส์ แท็บเล็ต หรือคอนเทคxt ของเกม มันจะเกิดขึ้นเมื่อมีการ คลิก, สัมผัส, หรือ ปล่อยปุ่มเกมแพด

ทดสอบเกม

เลือก Test จากเมนูแบบหล่นลงและคลิก Play ปุ่ม อัพเกรดกระโดด จะปรากฏขึ้นที่มุมขวาล่าง

ลองคลิกปุ่มก่อนที่คุณจะเก็บเหรียญเพื่อที่จะตรวจสอบว่ามันไม่ได้มอบพลังการกระโดดเพิ่มเติมให้คุณ แล้วลองสะสมเหรียญดูว่าการอัพเกรดทำงานหรือไม่เมื่อคุณคลิกอีกครั้ง

เมื่อโค้ดเสร็จสมบูรณ์ ลองปรับระดับความยาก: เพิ่มเหรียญถ้าจังหวะดูช้า หรือเอาออกไปบางส่วนและซ่อนมันในที่ที่ยากขึ้นถ้าการอัพเกรดง่ายเกินไป

©2026 Roblox Corporation. Roblox, โลโก้ Roblox และ Powering Imagination เป็นส่วนหนึ่งของเครื่องหมายการค้าที่จดทะเบียน และไม่ได้จดทะเบียนของเราในสหรัฐฯ และประเทศอื่นๆ