Pemain sekarang dapat mengumpulkan koin dan kehilangan koin tersebut saat mereka mati, tetapi koin tidak melakukan apa-apa, dan kebanyakan dari dunia 3D tidak dapat diakses tanpa kemampuan untuk melompat sangat tinggi. Bagian dari tutorial ini mengajarkan Anda cara menyelesaikan logika untuk pengalaman Anda dengan menambahkan tombol di layar yang menghabiskan koin untuk meningkatkan kekuatan lompatan.
Buat tombol upgrade
Antarmuka 2D di Roblox biasanya terdiri dari kumpulan komponen GUI di dalam wadah GUI. Dalam hal ini, Anda hanya memerlukan komponen TextButton yang mengatakan Upgrade Jump (5 Koin) di dalam wadah ScreenGui.
Siapkan GUI upgradeDi ReplicatedStorage, buat folder bernama Instances.Di dalam folder Instances, buat ScreenGui bernama JumpPurchaseGui dengan ResetOnSpawn dinonaktifkan.Di dalam JumpPurchaseGui, buat TextButton bernama JumpButton dengan properti sebagai berikut:- Text: "Upgrade Jump (5 Koin)"- TextSize: 25- AnchorPoint: 1, 1- Position: {1, 0}, {1, 0}Juga di dalam folder Instances, buat RemoteFunction bernama IncreaseJumpPowerFunction.Akhirnya, di layanan StarterPlayer, aktifkan properti CharacterUseJumpPower.
Tentukan data kekuatan lompatan
Saat ini, hanya jumlah koin yang disimpan untuk setiap pemain di skrip modul PlayerData. Anda juga perlu menyimpan dan memperbarui kekuatan lompatan dengan cara yang sama. Karena fungsi dalam PlayerData tidak spesifik untuk data yang diubah, yang diperlukan untuk menyimpan kekuatan lompatan pemain adalah menambahkan kunci Jump dan menginisialisasi nilai awalan di defaultPlayerData().
Perbarui PlayerData dengan kekuatan lompatanDi ServerStorage, ganti kode yang ada di module script PlayerData dengan yang berikut:```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```
Perbarui data kekuatan lompatan
Sekarang bahwa PlayerData dapat melacak kekuatan lompatan, Anda perlu menerapkan logika di server untuk meningkatkan kekuatan lompatan dari permintaan klien pemain.
Server dan klien dapat berkomunikasi melalui RemoteEvents atau RemoteFunctions. Event remote tidak menghasilkan saat dipicu dan dapat digunakan untuk komunikasi satu arah. Fungsi remote, di sisi lain, menghasilkan sampai mereka menerima balasan, yang memungkinkan komunikasi dua arah.
Untuk tutorial ini, klien perlu tahu jika server berhasil meningkatkan kekuatan lompatan pemain, jadi Anda harus menggunakan fungsi remote.
Buat JumpServiceDi ServerScriptService, buat skrip bernama JumpService dengan kode berikut:```lua-- Layananlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local ServerStorage = game:GetService("ServerStorage")local Players = game:GetService("Players")-- Modullocal Leaderboard = require(ServerStorage.Leaderboard)local PlayerData = require(ServerStorage.PlayerData)-- Eventlocal 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)-- Perbarui tabel kekuatan lompatlocal newJumpPower = PlayerData.updateValue(player, JUMP_KEY_NAME, updateFunction)-- Perbarui kekuatan lompat pemainlocal character = player.Character or player.CharacterAdded:Wait()local humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenhumanoid.JumpPower = newJumpPower-- Perbarui papan peringkat lompatanLeaderboard.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-- Tingkatkan kekuatan lompat pemainupdateJumpPower(player, function(oldJumpPower)oldJumpPower = oldJumpPower or 0return oldJumpPower + JUMP_POWER_INCREMENTend)-- Perbarui tabel koinlocal newCoinAmount = PlayerData.updateValue(player, COIN_KEY_NAME, function(oldCoinAmount)return oldCoinAmount - JUMP_COIN_COSTend)-- Perbarui papan peringkat koinLeaderboard.setStat(player, COIN_KEY_NAME, newCoinAmount)return trueendlocal function onCharacterAdded(player)-- Reset kekuatan lompat pemain saat karakter ditambahkanupdateJumpPower(player, function(_)return 0end)end-- Inisialisasi pemain yang ditambahkan sebelum terhubung ke event PlayerAddedfor _, player in Players:GetPlayers() doonCharacterAdded(player)end-- Inisialisasi normal pemain dari event 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)```
Bagian berikut menjelaskan kode dengan lebih detail.
Perbarui data kekuatan lompatan - updateJumpPower() memperbarui kekuatan lompatan pemain dan papan peringkat untuk memberikan umpan balik visual. Fungsi ini mirip dengan kode yang mengurangi pemain dalam Buat bahaya pemain. Dengan menyediakan model Character dan Humanoid ada untuk pemain yang ditingkatkan, fungsi ini memperbarui nilai properti JumpPower ke nilai baru yang disimpan oleh PlayerData, meningkatkannya sebesar 30. Jika Anda ingin permainan Anda bertahan sedikit lebih lama, Anda dapat mengurangi angka ini.
Validasi permintaan server - onPurchaseJumpIncrease() pertama memeriksa bahwa pemain benar-benar memiliki jumlah koin yang diperlukan untuk membeli upgrade. Semua permintaan dari klien ke server harus divalidasi untuk mencegah pelaku jahat mengirim permintaan palsu dan mengeksploitasi permainan Anda.
Tambahkan tombol ke GUI pemain
Objek ScreenGui hanya akan muncul di layar jika dipasang ke objek PlayerGui pemain. Secara default, ini berisi GUI sistem seperti jendela chat. Anda sekarang perlu membuat skrip di ReplicatedStorage untuk menyalin tombol upgrade ke dalam GUI setiap pemain dan menerapkan perilaku saat tombol ditekan.
Buat JumpButtonClickHandlerDi ReplicatedStorage, buat skrip bernama JumpButtonClickHandler dengan RunContext disetel ke Client dan kode berikut:```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 akan menjadi pesan kesalahan jika berhasil falseerror(purchased)elseif success and not purchased thenwarn("Koin tidak cukup!")endendjumpButton.Activated:Connect(onButtonClicked)-- Tambahkan JumpPurchaseGui ke GUI pemainjumpPurchaseGui.Parent = playerGui```
Bagian berikut menjelaskan kode dengan lebih detail.
- Dapatkan referensi ke GUI dan fungsi server - Variabel IncreaseJumpPowerFunction, jumpPurchaseGui, dan jumpButton berisi referensi ke fungsi dan GUI yang memanggil fungsi yang Anda perlukan nanti.
- Definisikan penangan acara - onButtonClicked() mendefinisikan logika untuk saat pengguna mengklik tombol upgrade. Ia menggunakan pcall() (panggilan terlindungi) untuk memanggil RemoteFunction. Komunikasi klien-server seperti ini memerlukan pcall() untuk menangani kesalahan atau masalah koneksi.
- Hubungkan penangkap ke tombol - Event Activated kompatibel di semua platform, termasuk mouse, touchscreen, atau konteks gamepad. Ini dipicu saat klik, sentuh, atau tombol gamepad dilepaskan.
Uji permainan
Pilih Uji dari dropdown dan klik Mainkan. Tombol Upgrade Jump muncul di sudut kanan bawah.
Cobalah mengklik tombol sebelum Anda mengumpulkan koin untuk memeriksa bahwa itu tidak memberikan Anda kekuatan lompatan tambahan, kemudian coba kumpulkan beberapa koin dan lihat apakah upgrade berfungsi saat Anda mengklik lagi.
Dengan kode selesai, coba menyesuaikan tingkat kesulitan: tambahkan koin jika kecepatan terasa lambat, atau hapus beberapa dan sembunyikan di tempat yang lebih sulit jika upgrade datang terlalu mudah.