ผู้เล่นสามารถเก็บเหรียญและสูญเสียมันเมื่อพวกเขาตาย แต่เหรียญไม่ทำอะไร และโลก 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 ที่มีอยู่ด้วยโค้ดต่อไปนี้:```lualocal 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,}endlocal function getData(player)local data = playerData[tostring(player.UserId)] or defaultPlayerData()playerData[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 PlayerData```
อัปเดตข้อมูลพลังการกระโดด
ตอนนี้ PlayerData สามารถติดตามพลังการกระโดดได้ คุณต้องนำตรรกะไปใช้งานบนเซิร์ฟเวอร์เพื่ออัปเกรดพลังการกระโดดจากคำขอของลูกค้า
เซิร์ฟเวอร์และลูกค้าสามารถสื่อสารผ่าน RemoteEvents หรือ RemoteFunctions อีเวนต์ระยะไกลไม่ส่งผลกระทบเมื่อถูกเรียกใช้งานและสามารถใช้ในการสื่อสารแบบทางเดียว ฟังก์ชันระยะไกลในทางกลับกัน จะค้นหาจนกว่าจะได้รับการตอบกลับ ซึ่งอนุญาตให้มีการสื่อสารแบบสองทาง
สำหรับบทเรียนนี้ ลูกค้าต้องรู้ว่าเซิร์ฟเวอร์อัปเกรดพลังการกระโดดของผู้เล่นสำเร็จ ดังนั้นคุณควรใช้ฟังก์ชันระยะไกล
สร้าง JumpServiceใน ServerScriptService ให้สร้างสคริปต์ชื่อ JumpService ที่มีโค้ดต่อไปนี้:```lua-- Serviceslocal ReplicatedStorage = game:GetService("ReplicatedStorage")local ServerStorage = game:GetService("ServerStorage")local Players = game:GetService("Players")-- Moduleslocal Leaderboard = require(ServerStorage.Leaderboard)local PlayerData = require(ServerStorage.PlayerData)-- Eventslocal IncreaseJumpPowerFunction = ReplicatedStorage.Instances.IncreaseJumpPowerFunctionlocal JUMP_KEY_NAME = PlayerData.JUMP_KEY_NAMElocal COIN_KEY_NAME = PlayerData.COIN_KEY_NAMElocal JUMP_POWER_INCREMENT = 30local JUMP_COIN_COST = 5local 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 thenhumanoid.JumpPower = newJumpPower-- อัปเดตลีดเดอร์บอร์ดพลังการกระโดดLeaderboard.setStat(player, JUMP_KEY_NAME, newJumpPower)endendlocal function onPurchaseJumpIncrease(player)local coinAmount = PlayerData.getValue(player, COIN_KEY_NAME)if coinAmount < JUMP_COIN_COST thenreturn falseend-- เพิ่มพลังการกระโดดของผู้เล่นupdateJumpPower(player, function(oldJumpPower)oldJumpPower = oldJumpPower or 0return oldJumpPower + JUMP_POWER_INCREMENTend)-- อัปเดตตารางเหรียญlocal newCoinAmount = PlayerData.updateValue(player, COIN_KEY_NAME, function(oldCoinAmount)return oldCoinAmount - JUMP_COIN_COSTend)-- อัปเดตลีดเดอร์บอร์ดเหรียญLeaderboard.setStat(player, COIN_KEY_NAME, newCoinAmount)return trueendlocal function onCharacterAdded(player)-- รีเซ็ตพลังการกระโดดของผู้เล่นเมื่อมีการเพิ่มตัวละครupdateJumpPower(player, function(_)return 0end)end-- เริ่มต้นผู้เล่นใด ๆ ที่เพิ่มเข้ามาก่อนที่จะเชื่อมต่อกับเหตุการณ์ PlayerAddedfor _, player in Players:GetPlayers() doonCharacterAdded(player)end-- การเริ่มต้นปกติของผู้เล่นจากเหตุการณ์ PlayerAddedlocal function onPlayerAdded(player)player.CharacterAdded:Connect(function()onCharacterAdded(player)end)endlocal function onPlayerRemoved(player)updateJumpPower(player, function(_)return nilend)endIncreaseJumpPowerFunction.OnServerInvoke = onPurchaseJumpIncreasePlayers.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 และโค้ดต่อไปนี้:```lualocal ReplicatedStorage = game:GetService("ReplicatedStorage")local Players = game:GetService("Players")local player = Players.LocalPlayerlocal playerGui = player.PlayerGuilocal IncreaseJumpPowerFunction = ReplicatedStorage.Instances.IncreaseJumpPowerFunctionlocal jumpPurchaseGui = ReplicatedStorage.Instances.JumpPurchaseGuilocal jumpButton = jumpPurchaseGui.JumpButtonlocal function onButtonClicked()local success, purchased = pcall(IncreaseJumpPowerFunction.InvokeServer, IncreaseJumpPowerFunction)if not success then-- purchased จะเป็นข้อความแสดงข้อผิดพลาดถ้าความสำเร็จเป็นเท็จerror(purchased)elseif success and not purchased thenwarn("เหรียญไม่เพียงพอ!")endendjumpButton.Activated:Connect(onButtonClicked)-- เพิ่ม JumpPurchaseGui ลงใน GUI ของผู้เล่นjumpPurchaseGui.Parent = playerGui```
ส่วนถัดไปจะอธิบายโค้ดให้ละเอียดมากขึ้น
- รับการอ้างอิงไปยัง GUI และฟังก์ชันเซิร์ฟเวอร์ - ตัวแปร IncreaseJumpPowerFunction, jumpPurchaseGui, และ jumpButton มีการอ้างอิงไปยังฟังก์ชันและ GUI ที่เรียกฟังก์ชันที่คุณจะต้องใช้ในภายหลัง
- กำหนดตัวจัดการเหตุการณ์ - onButtonClicked() นิยามตรรกะเมื่อผู้ใช้คลิกปุ่มอัพเกรด มันใช้ pcall() (การเรียกอย่างมีการป้องกัน) เพื่อเรียกใช้ RemoteFunction การสื่อสารระหว่างลูกค้าและเซิร์ฟเวอร์เช่นนี้ต้องการ pcall() เพื่อจัดการข้อผิดพลาดหรือปัญหาในการเชื่อมต่อ
- เชื่อมโยงตัวจัดการเข้ากับปุ่ม - อีเวนต์ Activated สามารถใช้งานได้ในทุกแพลตฟอร์ม รวมถึงเมาส์ แท็บเล็ต หรือคอนเทคxt ของเกม มันจะเกิดขึ้นเมื่อมีการ คลิก, สัมผัส, หรือ ปล่อยปุ่มเกมแพด
ทดสอบเกม
เลือก Test จากเมนูแบบหล่นลงและคลิก Play ปุ่ม อัพเกรดกระโดด จะปรากฏขึ้นที่มุมขวาล่าง
ลองคลิกปุ่มก่อนที่คุณจะเก็บเหรียญเพื่อที่จะตรวจสอบว่ามันไม่ได้มอบพลังการกระโดดเพิ่มเติมให้คุณ แล้วลองสะสมเหรียญดูว่าการอัพเกรดทำงานหรือไม่เมื่อคุณคลิกอีกครั้ง
เมื่อโค้ดเสร็จสมบูรณ์ ลองปรับระดับความยาก: เพิ่มเหรียญถ้าจังหวะดูช้า หรือเอาออกไปบางส่วนและซ่อนมันในที่ที่ยากขึ้นถ้าการอัพเกรดง่ายเกินไป