Oyuncular artık jetonları toplayabiliyor ve öldüklerinde bunları kaybediyor, ancak jetonların hiçbir işlevi yok ve 3D dünyanın çoğu çok yüksek zıplama yeteneği olmadan erişilemez. Bu öğreticinin bu bölümü, jeton harcayan bir ekran düğmesi ekleyerek deneyiminizin mantığını tamamlamayı öğretecek.
Yükseltme düğmesini oluşturun
Roblox'taki 2D arayüzleri, genellikle bir GUI kapsayıcısı içindeki bir dizi GUI bileşeninden oluşur. Bu durumda, bir TextButton bileşenine ihtiyacınız var ve bu bileşen "Jump'ı Yükselt (5 Jeton)" yazmalıdır ve bir ScreenGui kapsayıcısı içinde yer almalıdır.
Yükseltme GUI'sini ayarlayınReplicatedStorage içinde, Instances adında bir klasör oluşturun.Instances klasörü içinde, ResetOnSpawn özelliği devre dışı bırakılmış JumpPurchaseGui adında bir ScreenGui oluşturun.JumpPurchaseGui içinde, aşağıdaki özelliklere sahip JumpButton adında bir TextButton oluşturun:- Text: "Jump'ı Yükselt (5 Jeton)"- TextSize: 25- AnchorPoint: 1, 1- Position: {1, 0}, {1, 0}Instances klasörünün içinde ayrıca IncreaseJumpPowerFunction adında bir RemoteFunction oluşturun.Son olarak, StarterPlayer hizmeti üzerinde CharacterUseJumpPower özelliğini etkinleştirin.
Zıplama gücü verilerini tanımlayın
Şu anda her oyuncu için yalnızca jeton sayısı PlayerData modül script'inde saklanıyor. Zıplama gücünü aynı şekilde saklamak ve güncellemek için de bunu yapmanız gerekiyor. PlayerData'daki işlevler değiştirilen verilerle özel olmadığı için, oyuncu zıplama gücünü saklamak için gereken tek şey, bir Jump anahtarı eklemek ve başlangıç değerini defaultPlayerData() içinde başlatmaktır.
Zıplama gücü ile PlayerData'yı güncelleyinServerStorage içinde, mevcut PlayerData ModülScript'inin kodunu aşağıdaki ile değiştirin:```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```
Zıplama gücü verilerini güncelleyin
Artık PlayerData zıplama gücünü takip edebildiğine göre, sunucu üzerinde bir oyuncunun istemci talebinden zıplama gücünü yükseltmek için mantık uygulamanız gerekiyor.
Sunucu ve istemci, RemoteEvents veya RemoteFunctions üzerinden iletişim kurabilir. Uzak etkinlikler tetiklendiğinde bekleme yapmaz ve tek yönlü iletişim için kullanılabilir. Öte yandan, uzaktan işlevler yanıtı alıncaya kadar bekler ve bu, iki yönlü iletişimi sağlar.
Bu öğretici için istemcinin sunucunun oyuncunun zıplama gücünü başarılı bir şekilde yükseltip yükseltmediğini bilmesi gerektiğinden, uzaktan bir işlev kullanmalısınız.
JumpService OluşturServerScriptService içinde, aşağıdaki kodu içeren JumpService adında bir Script oluşturun:```lua-- Servislerlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local ServerStorage = game:GetService("ServerStorage")local Players = game:GetService("Players")-- Modüllerlocal Leaderboard = require(ServerStorage.Leaderboard)local PlayerData = require(ServerStorage.PlayerData)-- Etkinliklerlocal 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)-- Zıplama gücü tablosunu güncellelocal newJumpPower = PlayerData.updateValue(player, JUMP_KEY_NAME, updateFunction)-- Oyuncunun zıplama gücünü güncellelocal character = player.Character or player.CharacterAdded:Wait()local humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenhumanoid.JumpPower = newJumpPower-- Zıplama sıralamasını güncelleLeaderboard.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-- Oyuncunun zıplama gücünü artırupdateJumpPower(player, function(oldJumpPower)oldJumpPower = oldJumpPower or 0return oldJumpPower + JUMP_POWER_INCREMENTend)-- Jeton tablosunu güncellelocal newCoinAmount = PlayerData.updateValue(player, COIN_KEY_NAME, function(oldCoinAmount)return oldCoinAmount - JUMP_COIN_COSTend)-- Jeton sıralamasını güncelleLeaderboard.setStat(player, COIN_KEY_NAME, newCoinAmount)return trueendlocal function onCharacterAdded(player)-- Karakter eklendiğinde oyuncunun zıplama gücünü sıfırlayınupdateJumpPower(player, function(_)return 0end)end-- PlayerAdded etkinliğine bağlanmadan önce eklenen oyuncuları başlatfor _, player in Players:GetPlayers() doonCharacterAdded(player)end-- PlayerAdded etkinliğinden normal oyuncu başlatmalocal 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)```
Aşağıdaki bölümler kodu daha ayrıntılı olarak açıklar.
Zıplama gücü verisini güncelleyin - updateJumpPower() oyuncunun zıplama gücünü ve sıralamasını güncelleyerek görsel geri bildirim sağlar. Bu işlev, oyunculara hasar veren kodu, Oyuncu Tehlikeleri Oluştur ile benzerlik gösterir. Verilen bir Karakter modeli ve zıplama gücü artırılan Humanoid mevcutsa, işlev, PlayerData tarafından saklanan yeni değere JumpPower mülkünü günceller ve değeri 30 artırır. Oyununuza biraz daha uzun süre dayanmasını istiyorsanız, bu sayıyı azaltabilirsiniz.
Sunucu taleplerini doğrulayın - onPurchaseJumpIncrease() önce oyuncunun yükseltmeyi satın almak için gereken jeton sayısına gerçekten sahip olduğunu kontrol eder. İstemcilerden sunucuya gelen TÜM talepler, kötü niyetli kişilerin yanlış taleplerde bulunmasını ve oyununuzu istismar etmesini önlemek için doğrulanmalıdır.
Düğmeyi oyuncu GUI'sine ekleyin
Bir ScreenGui nesnesi yalnızca bir oyuncunun PlayerGui nesnesine ebeveyn olduğunda ekranda görünür. Varsayılan olarak, bu sistem GUI'si, sohbet penceresi gibi şeyleri içerir. Şimdi, ReplicatedStorage içinde, her oyuncunun GUI'sine yükseltme düğmesini kopyalayacak bir script oluşturmanız ve düğmeye basıldığında ne olacağını uygulamanız gerekiyor.
JumpButtonClickHandler OluşturReplicatedStorage içinde, RunContext özelliği Client olarak ayarlanmış JumpButtonClickHandler adında bir Script oluşturun ve ardından aşağıdaki kodu ekleyin:```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, eğer success false ise hata mesajı olacaktırerror(purchased)elseif success and not purchased thenwarn("Yeterli jeton yok!")endendjumpButton.Activated:Connect(onButtonClicked)-- JumpPurchaseGui'yi oyuncunun GUI'sine eklejumpPurchaseGui.Parent = playerGui```
Aşağıdaki bölümler kodu daha ayrıntılı olarak açıklar.
- GUI ve sunucu işlevine başvuruları elde edin - Değişkenler IncreaseJumpPowerFunction, jumpPurchaseGui ve jumpButton, ileride ihtiyaç duyacağınız işlev ve GUI'ye referans içerir.
- Olay işleyicisini tanımlayın - onButtonClicked() kullanıcılar yükseltme düğmesine tıkladığında ne olacağına dair mantığı tanımlar. pcall() (korumalı çağrı) kullanarak RemoteFunction'ı tetikler. Bu tür istemci-sunucu iletişimlerinin herhangi biri için bağlantı sorunları veya hataları yönetmek üzere pcall() kullanmak gerekir.
- İşleyiciyi düğmeye bağlayın - Activated olayı, fare, dokunmatik ekran veya oyun kumandası durumları dahil olmak üzere tüm platformlarda uyumludur. Bir tıklama, dokunma veya oyun kumandası düğmesi bırakıldığında tetiklenir.
Oyun Testi
Açılır menüden Test seçin ve Play'e tıklayın. Jump'ı Yükselt düğmesi sağ altta görünecektir.
Hiç jeton toplayamadan önce düğmeye tıklamayı deneyin, böylece bunun size ek zıplama gücü ödüllendirmediğini kontrol edin; ardından bazı jetonlar toplamayı deneyin ve tekrar tıkladığınızda yükseltmenin çalışıp çalışmadığını görebilirsiniz.
Kod tamamlandıktan sonra zorluğu ayarlamayı deneyin: tempoyu yavaş hissediyorsanız jeton ekleyin veya güncellemelerin çok kolay geldiği durumlarda bunları çıkarın ve daha zorlu noktalara yerleştirin.