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 ulepszeniaW 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 skokuW ServerStorage zastąp istniejący kod w module skryptowym PlayerData następującym:```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```
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 JumpServiceW ServerScriptService utwórz skrypt o nazwie JumpService z następującym kodem:```lua-- Usługilocal ReplicatedStorage = game:GetService("ReplicatedStorage")local ServerStorage = game:GetService("ServerStorage")local Players = game:GetService("Players")-- Modelelocal Leaderboard = require(ServerStorage.Leaderboard)local PlayerData = require(ServerStorage.PlayerData)-- Wydarzenialocal 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)-- Zaktualizuj tabelę mocy skokulocal newJumpPower = PlayerData.updateValue(player, JUMP_KEY_NAME, updateFunction)-- Zaktualizuj moc skoku graczalocal character = player.Character or player.CharacterAdded:Wait()local humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenhumanoid.JumpPower = newJumpPower-- Zaktualizuj tablicę liderów skokówLeaderboard.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-- Zwiększ moc skoku graczaupdateJumpPower(player, function(oldJumpPower)oldJumpPower = oldJumpPower or 0return oldJumpPower + JUMP_POWER_INCREMENTend)-- Zaktualizuj tabelę monetlocal newCoinAmount = PlayerData.updateValue(player, COIN_KEY_NAME, function(oldCoinAmount)return oldCoinAmount - JUMP_COIN_COSTend)-- Zaktualizuj tablicę liderów monetLeaderboard.setStat(player, COIN_KEY_NAME, newCoinAmount)return trueendlocal function onCharacterAdded(player)-- Resetuj moc skoku gracza, gdy postać zostanie dodanaupdateJumpPower(player, function(_)return 0end)end-- Inicjalizuj wszelkich graczy dodanych przed połączeniem z wydarzeniem PlayerAddedfor _, player in Players:GetPlayers() doonCharacterAdded(player)end-- Normalna inicjalizacja graczy z wydarzenia 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)```
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 JumpButtonClickHandlerW ReplicatedStorage utwórz skrypt o nazwie JumpButtonClickHandler z RunContext ustawionym na Client i następującym kodem:```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 będzie wiadomością o błędzie, jeśli success jest fałszyweerror(purchased)elseif success and not purchased thenwarn("Niewystarczająca liczba monet!")endendjumpButton.Activated:Connect(onButtonClicked)-- Dodaj JumpPurchaseGui do GUI graczajumpPurchaseGui.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.