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 część samouczka nauczy cię, jak dokończyć logikę swojej gry, dodając przycisk na ekranie, który wydaje monety na zwiększenie mocy skoku.
Utwórz przycisk ulepszenia
Interfejsy 2D w Robloxie składają się zazwyczaj 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.
W ReplicatedStorage utwórz folder o nazwie Instances.
W folderze Instances utwórz ScreenGui o nazwie JumpPurchaseGui z wyłączoną opcją ResetOnSpawn.
W 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 dotyczące mocy skoku
Obecnie tylko liczba monet jest przechowywana dla każdego gracza w skrypcie modułu PlayerData. Musisz również przechowywać i aktualizować moc skoku w ten sam sposób. Ponieważ funkcje w PlayerData nie są specyficzne dla zmienianych danych, wszystko, co musisz zrobić, to dodać klucz Jump i zainicjować jego początkową wartość w defaultPlayerData().
W ServerStorage zastąp istniejący kod modułu 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 dotyczące mocy skoku
Teraz, gdy PlayerData jest w stanie śledzić moc skoku, musisz zaimplementować logikę na serwerze, aby ulepszyć moc skoku na podstawie żądania klienta.
Serwer i klient mogą komunikować się za pomocą RemoteEvents lub RemoteFunctions. Zdarzenia zdalne nie czekają na odpowiedź, gdy są wywoływane, i mogą być używane do komunikacji jednostronnej. Funkcje zdalne, z drugiej strony, czekają, aż otrzymają odpowiedź, co pozwala na komunikację dwustronną.
W tym samouczku klient musi wiedzieć, czy serwer pomyślnie ulepszył moc skoku gracza, więc powinieneś użyć funkcji zdalnej.
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")
-- Moduły
local Leaderboard = require(ServerStorage.Leaderboard)
local PlayerData = require(ServerStorage.PlayerData)
-- Zdarzenia
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)
-- Aktualizuj tabelę mocy skoku
local newJumpPower = PlayerData.updateValue(player, JUMP_KEY_NAME, updateFunction)
-- Aktualizuj moc skoku gracza
local character = player.Character or player.CharacterAdded:Wait()
local humanoid = character:FindFirstChildWhichIsA("Humanoid")
if humanoid then
humanoid.JumpPower = newJumpPower
-- Aktualizuj tablicę wyników skoku
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)
-- Aktualizuj tabelę monet
local newCoinAmount = PlayerData.updateValue(player, COIN_KEY_NAME, function(oldCoinAmount)
return oldCoinAmount - JUMP_COIN_COST
end)
-- Aktualizuj tablicę wyników monet
Leaderboard.setStat(player, COIN_KEY_NAME, newCoinAmount)
return true
end
local function onCharacterAdded(player)
-- Zresetuj moc skoku gracza, gdy postać zostanie dodana
updateJumpPower(player, function(_)
return 0
end)
end
-- Inicjalizuj wszystkich graczy dodanych przed połączeniem z zdarzeniem PlayerAdded
for _, player in Players:GetPlayers() do
onCharacterAdded(player)
end
-- Normalna inicjalizacja graczy z zdarzenia 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)
```Poniższe sekcje opisują kod bardziej szczegółowo.
Aktualizuj dane dotyczące mocy skoku - updateJumpPower() aktualizuje moc skoku gracza i tablicę wyników, aby zapewnić wizualne informacje zwrotne. Ta funkcja przypomina kod, który zadaje obrażenia graczom w Utwórz zagrożenia dla graczy. Pod warunkiem, że model Character i Humanoid istnieją dla gracza, którego moc skoku jest ulepszana, funkcja aktualizuje właściwość JumpPower na nową wartość przechowywaną przez PlayerData, zwiększając ją o 30. Jeśli chcesz, aby twoja gra trwała nieco dłużej, możesz zmniejszyć tę liczbę.
Walidacja żądań serwera - onPurchaseJumpIncrease() najpierw sprawdza, czy gracz rzeczywiście ma wymaganą liczbę monet do zakupu ulepszenia. Wszystkie żądania od klientów do serwera powinny być walidowane, aby zapobiec złym aktorom składania fałszywych żądań i wykorzystywania twojej gry.
Dodaj przycisk do GUI gracza
Obiekt ScreenGui wyświetla się na ekranie tylko wtedy, gdy jest rodzicem obiektu PlayerGui gracza. Domyślnie zawiera on systemowe GUI, takie jak okno czatu. Musisz teraz utworzyć skrypt w ReplicatedStorage, aby skopiować przycisk ulepszenia do GUI każdego gracza i zaimplementować zachowanie, gdy przycisk zostanie naciśnięty.
W ReplicatedStorage utwórz skrypt o nazwie JumpButtonClickHandler z ustawionym RunContext 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 komunikatem o błędzie, jeśli success jest fałszywy
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
```Poniższe 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ą funkcję, której będziesz potrzebować później.
- Zdefiniuj obsługę zdarzeń - onButtonClicked() definiuje logikę dla momentu, gdy użytkownicy klikają przycisk ulepszenia. Używa pcall() (wywołanie chronione), aby wywołać RemoteFunction. Każda komunikacja klient-serwer tego typu wymaga pcall(), aby obsłużyć błędy lub problemy z połączeniem.
- Połącz obsługę z przyciskiem - Zdarzenie Activated jest kompatybilne na wszystkich platformach, w tym w kontekście myszy, ekranu dotykowego lub kontrolera. Wyzwala się, gdy kliknięcie, dotknięcie lub przycisk kontrolera zostanie zwolniony.
Testowanie
Wybierz Test z rozwijanego menu i kliknij Play. Przycisk Ulepsz Skok pojawia 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 zobacz, czy ulepszenie działa, gdy klikniesz ponownie.
Gdy kod jest gotowy, spróbuj dostosować trudność: dodaj monety, jeśli tempo wydaje się wolne, lub usuń kilka i schowaj je w trudniejszych miejscach, jeśli ulepszenia są zbyt łatwe.