Teraz, gdy możesz wykryć, kiedy gracz zebrał monetę, ten rozdział samouczka nauczy cię, jak policzyć, ile monet zebrał gracz, i uczynić tę kwotę widoczną na rankingwyników.
Stwórz skrypt modułu, aby zapisać kolekcjamonet
Aby zarządzać przechowywaniem i zarządzaniem danymi kolekcji monet każdego gracza, musisz utworzyć obiekt ModuleScript, który zawiera strukturę danych i funkcje, które uzyskują dane o kolekcji monet dla każdego gracza.Skrypty modułu są ponownie używalnym kodem, który mogą wymagać inne skrypty.W tym przypadku skrypt modułu CoinService wymaga tego modułu, aby mógł aktualizować dane o kolekcji monet, gdy gracze dotykają monet.
Aby utworzyć skrypt modułu:
W oknie Eksploratora przewiń nad ServerStorage i kliknij przycisk ⊕ . Wyświetla się menu kontekstowe.
Z menu kontekstowego wybierz ModuleScript .Nowa skrypt modułu wyświetla się pod ServerStorage .Umieszczasz skrypt modułu w ServerStorage , ponieważ chcesz zarządzać logiką kolekcji monet na serwerze.
Zmień nazwę skryptu modułu na PlayerData .
Zastąp domyślny kod następującym kodem:
local PlayerData = {}PlayerData.COIN_KEY_NAME = "Coins"local playerData = {--[[[userId: string] = {["Coins"] = coinAmount: number}]]}local DEFAULT_PLAYER_DATA = {[PlayerData.COIN_KEY_NAME] = 0}local function getData(player)local data = playerData[tostring(player.UserId)] or DEFAULT_PLAYER_DATAplayerData[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 PlayerDataWyjaśnienie koduSkrypt modułu definiuje tabelę PlayerData, która zawiera zero lub wiele playerData tabel, które reprezentują dane o kolekcji monet dla gracza.Każdy skrypt, który wymaga tego modułu skryptowego, otrzymuje tę samą kopię tabeli PlayerData, umożliwiając wielu skryptom modyfikowanie i udostępnianie danych o kolekcji monet.
Oświadcz o strukturach danych
Skrypt modułu rozpoczyna się od deklaracji pustego stołu, PlayerData, który zostaje zwrócony na końcu skryptu.Zawiera również metody akcesorów, aby uzyskać i ustawić wartości w tabeli.
Tabela playerData zawiera komentarze opisujące strukturę tabeli, co ułatwia zrozumienie kodu.W tym przypadku tabela playerData zawiera userId i odpowiednie pole o nazwie Coins, które reprezentuje ilość zebranych monet dla tego gracza.
local PlayerData = {}PlayerData.COIN_KEY_NAME = "Coins"local playerData = {--[[[userId: string] = {["Coins"] = coinAmount: number}]]}...return PlayerDataOkreśl lokalny akcesor danych
getData() jest lokalną funkcją, która odzyskuje dane dla określonej playerData tabeli.Jeśli gracz nie zebrał monety, zwraca ona tabelę DEFAULT_PLAYER_DATA, aby upewnić się, że każdy gracz ma jakieś dane związane z nim.Powszechną konwencją jest tworzenie prostych, skierowanych na zewnątrz funkcji, które rozładowują logikę do lokalnie skupionych funkcji, które wykonują ciężkie prace.
local DEFAULT_PLAYER_DATA = {[PlayerData.COIN_KEY_NAME] = 0}local function getData(player)local data = playerData[tostring(player.UserId)] or DEFAULT_PLAYER_DATAplayerData[tostring(player.UserId)] = datareturn dataendOkreśl publicznych dostawców danych
getValue() i updateValue() są funkcjami skierowanymi do publiczności, które inne skrypty, które wymagają tego skryptu modułu, mogą wezwać.W naszym przypadku CoinService używa tych funkcji, aby aktualizować dane o kolekcji monet gracza za każdym razem, gdy dotknie on monety.
function 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 newValueend
Wdroż tabelę ranking
Możesz reprezentować dane o kolekcji monet wizualnie za pomocą tablicy wyników na ekranie.Roblox zawiera wbudowany system, który automatycznie generuje tabelę wyników za pomocą domyślnego interfejsu.
Aby utworzyć tabelę ranking:
W oknie Eksploratora utwórz ModuleScript w ServerStorage , a następnie zmień nazwę skryptu modułu na Tabelę wyników .
Zastąp domyślny kod następującym kodem:
local Leaderboard = {}-- Tworzenie nowej tabeli rankinglocal function setupLeaderboard(player)local leaderstats = Instance.new("Folder")-- Nazwa 'leaderstats' jest zarezerwowana i rozpoznawana przez Roblox do tworzenia tabeli rankingleaderstats.Name = "leaderstats"leaderstats.Parent = playerreturn leaderstatsend-- Tworzenie nowej wartości statystyk tabeli liderówlocal function setupStat(leaderstats, statName)local stat = Instance.new("IntValue")stat.Name = statNamestat.Value = 0stat.Parent = leaderstatsreturn statend-- Aktualizacja wartości statystyk graczafunction Leaderboard.setStat(player, statName, value)local leaderstats = player:FindFirstChild("leaderstats")if not leaderstats thenleaderstats = setupLeaderboard(player)endlocal stat = leaderstats:FindFirstChild(statName)if not stat thenstat = setupStat(leaderstats, statName)endstat.Value = valueendreturn LeaderboardWyjaśnienie koduNastępujące sekcje opisują, jak tablica wyników działa bardziej szczegółowo.
Stwórz tabelę wyników
Funkcja setupLeaderboard() tworzy nową instancję katalogu o nazwie leaderstats i ustawia ją jako dziecko określonego gracza.Roblox automatycznie rozpoznaje folder o nazwie leaderstats jako pojemnik statystyk i tworzy element interfejsu użytkownika do wyświetlania statystyk.Wymaga, aby wartości w leaderstats były przechowywane jako obiekty "wartości" (takie jak StringValue , IntValue lub NumberValue ).
-- Tworzenie nowej tabeli rankinglocal function setupLeaderboard(player)local leaderstats = Instance.new("Folder")-- Nazwa 'leaderstats' jest zarezerwowana i rozpoznawana przez Roblox do tworzenia tabeli rankingleaderstats.Name = "leaderstats"leaderstats.Parent = playerreturn leaderstatsend-- Tworzenie nowej wartości statystyk tabeli liderówlocal function setupStat(leaderstats, statName)local stat = Instance.new("IntValue")stat.Name = statNamestat.Value = 0stat.Parent = leaderstatsreturn statendAktualizacja statystyk gracza
setStat() jest jedyną publiczną funkcją w module Tabela liderów .Tworzy wartości statystyczne dla określonego gracza lub samej tabeli wyników, jeśli nie istnieje już.
FindFirstChild() bierze nazwę obiektu i zwraca obiekt, jeśli istnieje, lub nil jeśli nie istnieje.Jest to powszechna, bezpieczna metoda sprawdzenia, czy obiekt istnieje przed jego użyciem.
-- Aktualizacja wartości statystyk graczafunction Leaderboard.setStat(player, statName, value)local leaderstats = player:FindFirstChild("leaderstats")if not leaderstats thenleaderstats = setupLeaderboard(player)endlocal stat = leaderstats:FindFirstChild(statName)if not stat thenstat = setupStat(leaderstats, statName)endstat.Value = valueend
Zintegruj skrypty modułu
Po zakończeniu skryptów modułów Dane gracza i Tabela wyników , wymagaj ich w skrypcie CoinService , aby zarządzać i wyświetlać dane o monetach gracza.Aby zaktualizować CoinService :
W oknie Eksploratora otwórz skrypt CoinService .
Zastąp istniejący kod następującym kodem:
-- Inicjalizacja usług i zmiennychlocal Workspace = game:GetService("Workspace")local Players = game:GetService("Players")local ServerStorage = game:GetService("ServerStorage")-- Modułylocal Leaderboard = require(ServerStorage.Leaderboard)local PlayerData = require(ServerStorage.PlayerData)local coinsFolder = Workspace.World.Coinslocal coins = coinsFolder:GetChildren()local COIN_KEY_NAME = PlayerData.COIN_KEY_NAMElocal COOLDOWN = 10local COIN_AMOUNT_TO_ADD = 1local function updatePlayerCoins(player, updateFunction)-- Aktualizacja tabeli monetlocal newCoinAmount = PlayerData.updateValue(player, COIN_KEY_NAME, updateFunction)-- Aktualizacja rankingmonetLeaderboard.setStat(player, COIN_KEY_NAME, newCoinAmount)end-- Definiowanie obsługi zdarzenialocal function onCoinTouched(otherPart, coin)if coin:GetAttribute("Enabled") thenlocal character = otherPart.Parentlocal player = Players:GetPlayerFromCharacter(character)if player then-- Gracz dotknął monetycoin.Transparency = 1coin:SetAttribute("Enabled", false)updatePlayerCoins(player, function(oldCoinAmount)oldCoinAmount = oldCoinAmount or 0return oldCoinAmount + COIN_AMOUNT_TO_ADDend)task.wait(COOLDOWN)coin.Transparency = 0coin:SetAttribute("Enabled", true)endendend-- Konfiguracja słuchaczy wydarzeńfor _, coin in coins docoin:SetAttribute("Enabled", true)coin.Touched:Connect(function(otherPart)onCoinTouched(otherPart, coin)end)endWyjaśnienie koduZmiany w oryginalnym skrypcie CoinService obejmują:
- Oświadczenie COIN_AMOUNT_TO_ADD jako liczbę monet do dodania, gdy gracz zbiera monetę, oraz COIN_KEY_NAME jako nazwę klucza określoną w PlayerData .
- Tworzenie funkcji pomocniczej updatePlayerCoins() do aktualizacji liczby monet gracza i statystyki związanej z tablicą liderów
- Zastąpienie oświadczenia placeholder print() we w onCoinTouched() wezwaniem do updatePlayerCoins().
Testowanie gry
Nadszedł czas, aby sprawdzić, czy kolekcja monet działa tak, jak zamierzał.Kiedy dotkniesz i zbierzesz monetę w gra, powinieneś być w stanie zobaczyć ilość monet, które zebrałeś na interfejsie UI tablicy wyników.Aby przetestować swoje doświadczenie:
Na pasku narzędzi kliknij przycisk Graj . Studio wchodzi w tryb testowania gry.
Przesuń postać, aby dotknąć monety.Jeśli twoje skrypty działają poprawnie, interfejs wyszukiwarki wyników wyświetla się i zwiększa liczbę monet, gdy zbierasz więcej monet.