Napisz przycisk ulepszenia

*Ta zawartość została przetłumaczona przy użyciu narzędzi AI (w wersji beta) i może zawierać błędy. Aby wyświetlić tę stronę w języku angielskim, kliknij tutaj.


Gracze mogą teraz zbierać monety i tracić je, gdy umierają, ale monety nic nie robią, a większość świata 3D jest niedostępna bez możliwości skakania bardzo wysoko. Ta sekcja samouczka nauczy Cię, jak dokończyć logikę dla Twojego doświadczenia, dodając przycisk na ekranie, który wydaje monety na zwiększenie mocy skoku.

Utwórz przycisk ulepszenia

Interfejsy 2D w Robloxie zazwyczaj składają się z kolekcji komponentów GUI wewnątrz kontenera GUI. W tym przypadku potrzebujesz tylko komponentu TextButton, który mówi "Ulepsz Skok (5 Monet)" wewnątrz kontenera ScreenGui.

Ustaw GUI ulepszenia

W ReplicatedStorage utwórz folder o nazwie Instances.
W folderze Instances utwórz ScreenGui o nazwie JumpPurchaseGui z opcją ResetOnSpawn wyłączoną.
Wewnątrz JumpPurchaseGui utwórz TextButton o nazwie JumpButton z następującymi właściwościami:
- Text: "Ulepsz Skok (5 Monet)"
- TextSize: 25
- AnchorPoint: 1, 1
- Position: {1, 0}, {1, 0}
Również w folderze Instances utwórz RemoteFunction o nazwie IncreaseJumpPowerFunction.
Na koniec w usłudze StarterPlayer włącz właściwość CharacterUseJumpPower.

Zdefiniuj dane o mocy skoku

Obecnie tylko liczba monet jest przechowywana dla każdego gracza w module skryptowym PlayerData. Musisz również przechować i zaktualizować moc skoku w ten sam sposób. Ponieważ funkcje w PlayerData nie są specyficzne dla danych, które są zmieniane, wszystko, co trzeba zrobić, aby przechować moc skoku gracza, to dodać klucz Jump i zainicjować jego początkową wartość w defaultPlayerData().

Zaktualizuj PlayerData o moc skoku

W ServerStorage zastąp istniejący kod w module skryptowym PlayerData następującym:
```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
```

Zaktualizuj dane o mocy skoku

Teraz, gdy PlayerData może śledzić moc skoku, musisz wdrożyć logikę na serwerze, aby zaktualizować moc skoku na podstawie żądania klienta.

Serwer i klient mogą komunikować się przez RemoteEvents lub RemoteFunctions. Zdalne wydarzenia nie wstrzymują działania, gdy są uruchamiane i mogą być używane do jednostronnej komunikacji. Zdalne funkcje, z drugiej strony, wstrzymują działanie, dopóki nie otrzymają odpowiedzi, co umożliwia komunikację dwukierunkową.

Dla tego samouczka klient musi wiedzieć, czy serwer pomyślnie zwiększył moc skoku gracza, więc powinieneś użyć zdalnej funkcji.

Utwórz JumpService

W ServerScriptService utwórz skrypt o nazwie JumpService z następującym kodem:
```lua
-- Usługi
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local ServerStorage = game:GetService("ServerStorage")
local Players = game:GetService("Players")
-- Modele
local Leaderboard = require(ServerStorage.Leaderboard)
local PlayerData = require(ServerStorage.PlayerData)
-- Wydarzenia
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)
-- Zaktualizuj tabelę mocy skoku
local newJumpPower = PlayerData.updateValue(player, JUMP_KEY_NAME, updateFunction)
-- Zaktualizuj moc skoku gracza
local character = player.Character or player.CharacterAdded:Wait()
local humanoid = character:FindFirstChildWhichIsA("Humanoid")
if humanoid then
humanoid.JumpPower = newJumpPower
-- Zaktualizuj tablicę liderów skoków
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
-- Zwiększ moc skoku gracza
updateJumpPower(player, function(oldJumpPower)
oldJumpPower = oldJumpPower or 0
return oldJumpPower + JUMP_POWER_INCREMENT
end)
-- Zaktualizuj tabelę monet
local newCoinAmount = PlayerData.updateValue(player, COIN_KEY_NAME, function(oldCoinAmount)
return oldCoinAmount - JUMP_COIN_COST
end)
-- Zaktualizuj tablicę liderów monet
Leaderboard.setStat(player, COIN_KEY_NAME, newCoinAmount)
return true
end
local function onCharacterAdded(player)
-- Resetuj moc skoku gracza, gdy postać zostanie dodana
updateJumpPower(player, function(_)
return 0
end)
end
-- Inicjalizuj wszelkich graczy dodanych przed połączeniem z wydarzeniem PlayerAdded
for _, player in Players:GetPlayers() do
onCharacterAdded(player)
end
-- Normalna inicjalizacja graczy z wydarzenia 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)
```

Następujące sekcje opisują kod bardziej szczegółowo.

  • Aktualizuj dane o mocy skoku - updateJumpPower() aktualizuje moc skoku gracza i tablicę liderów, aby zapewnić wizualną informację zwrotną. Ta funkcja przypomina kod, który szkodzi graczom w Utwórz przeszkody dla graczy. Przy założeniu, że model Character i Humanoid istnieją dla ulepszanej postaci, funkcja aktualizuje właściwość JumpPower do nowej wartości przechowywanej w PlayerData, zwiększając ją o 30. Jeśli chcesz, aby Twoja gra trwała nieco dłużej, możesz zmniejszyć tę liczbę.

  • Weryfikuj żądania serwera - onPurchaseJumpIncrease() najpierw sprawdza, czy gracz rzeczywiście ma liczbę monet potrzebnych do zakupu ulepszenia. Wszystkie żądania od klientów do serwera powinny być weryfikowane, aby zapobiec złym działaniom polegającym na przesyłaniu fałszywych żądań i wykorzystywaniu Twojej gry.

Dodaj przycisk do GUI gracza

Obiekt ScreenGui pokazuje się na ekranie tylko wtedy, gdy jest zagnieżdżony w obiekcie PlayerGui gracza. Domyślnie zawiera on systemowe GUI, takie jak okno czatu. Musisz teraz stworzyć skrypt w ReplicatedStorage, aby skopiować przycisk ulepszenia do GUI każdego gracza i zaimplementować zachowanie po naciśnięciu przycisku.

Utwórz JumpButtonClickHandler

W ReplicatedStorage utwórz skrypt o nazwie JumpButtonClickHandler z RunContext ustawionym na Client i następującym kodem:
```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 będzie wiadomością o błędzie, jeśli success jest fałszywe
error(purchased)
elseif success and not purchased then
warn("Niewystarczająca liczba monet!")
end
end
jumpButton.Activated:Connect(onButtonClicked)
-- Dodaj JumpPurchaseGui do GUI gracza
jumpPurchaseGui.Parent = playerGui
```

Następujące sekcje opisują kod bardziej szczegółowo.

  • Uzyskaj odniesienia do GUI i funkcji serwera - Zmienne IncreaseJumpPowerFunction, jumpPurchaseGui i jumpButton zawierają odniesienia do funkcji i GUI, które wywołują funkcje, których będziesz potrzebować później.
  • Zdefiniuj funkcję obsługi zdarzeń - onButtonClicked() definiuje logikę dla momentów, gdy użytkownicy klikają przycisk ulepszenia. Używa pcall() (wywołanie chronione), aby wywołać RemoteFunction. Komunikacja klient-serwer tego typu wymaga pcall(), aby obsługiwać błędy lub problemy z połączeniem.
  • Połącz obsługę z przyciskiem - Zdarzenie Activated jest kompatybilne na wszystkich platformach, w tym kontekście myszy, ekranu dotykowego lub gamepada. Uruchamia się, gdy kliknięcie, dotknięcie lub naciśnięcie przycisku gamepada zostanie zwolnione.

Testowanie

Wybierz Test z rozwijanego menu i kliknij Graj. Przycisk Ulepsz Skok pojawi się w prawym dolnym rogu.

Spróbuj kliknąć przycisk, zanim zbierzesz jakiekolwiek monety, aby sprawdzić, czy nie przyznaje Ci dodatkowej mocy skoku, a następnie spróbuj zebrać kilka monet i sprawdź, czy ulepszenie działa, gdy klikniesz ponownie.

Gdy kod jest kompletny, spróbuj dostosować trudność: dodaj monety, jeśli gra wydaje się zbyt wolna, lub usuń kilka i schowaj je w trudniejszych miejscach, jeśli ulepszenia przychodzą zbyt łatwo.

©2026 Roblox Corporation. Nazwa Roblox, logo Roblox oraz hasło „Powering Imagination” należą do naszych zarejestrowanych i niezarejestrowanych znaków towarowych na terenie Stanów Zjednoczonych oraz w innych krajach.