Teraz, gdy możesz wykryć, gdy gracz zebrał monetę, ta sekcja tutorialu nauczy cię, jak policzyć, ile monet zebrało graczy, i uczynić tę kwotę widoczną na ranking.
Utwórz modułowy skrypt, aby zapisać kolekcję monet
Aby zarządzać danymi zbieranymi w każdej kolekcji monet gracza, musisz utworzyć obiekt ModuleScript, aby zawierać strukturę danych i funkcje, które uzyskują dane zbierane w każdej kolekcji monet dla każdego gracza. Skrypty modułowe są ponownymi kodami, które inne skrypty mogą wymagać. W tym przypadku
Aby utworzyć skrypt modułu:
W oknie Explorer, przełącz nawigację nad ServerStorage i kliknij przycisk 2> ⊕2>. Wyświetlony zostanie menu kontekstowe.
Z menu kontekstowego wybierz ModuleScript. Nowy skrypt modułu wyświetlony jest pod ServerStorage. Jesteś umieszczając nowy skrypt modułu w ServerStorage, ponieważ chcesz zarządzać logiką zbierania monet na serwerze.
Zmień nazwę modułu skryptu na PlayerData .
Zastąp standardowy kod następujązym 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 określają tabelę PlayerData, która zawiera zero lub wiele tabel playerData, które reprezentują dane o zbiórce monet dla gracza. Każdy skrypt, który wymaga tego modułu, otrzymuje tę samą kopię tablicy PlayerData, umożliwiając wiele skryptów do modyfikacji i udostępniania danych o zbiórce monet.
Oznaczanie struktur danych
Skrypt modułu zaczyna się od deklaracji pustej tabeli, PlayerData , która jest zwracana na końcu skryptu. Zawiera również metody dostępu, 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 odpowiadającą imię pola nazyającym się 1> Coins1>, które reprezentuje ilość zebranych monet dla tego gracza.
local PlayerData = {}PlayerData.COIN_KEY_NAME = "Coins"local playerData = {--[[[userId: string] = {["Coins"] = coinAmount: number}]]}...return PlayerDataDefiniowanie lokalnego dostawcy danych
getData() jest lokalną funkcją, która odczytuje dane dla określonego playerData tabeli. Jeśli gracz nie zebrał monety, to zwraca tabelę DEFAULT_PLAYER_DATA, aby upewnić się, że każdy gracz ma kilka danych związanych z nim. Common Con약 jest stworzenie prostych, publicznych funkcji, które od
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 dataendDefinowanie dostępcników danych publicznych
getValue() Player() i updateValue() są funkcjami publicznie dostępnymi, które inne skrypty, które wymagają tego modułowego skryptu, mogą wezwywać. W naszym przypadku CoinService używa tych funkcji do aktualizacji danych o monetach gracza, gdy ten gracz dotyka 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żenie tabeli liderów
Możesz przedstawić wizualnie dane zbioru monet. Roblox wbudowuje system, który automatycznie generuje tabelę liderów, używając domyślnej interfejsu użytkownika.
Aby stworzyć tabelę ranking:
W oknie Explorer , utwórz ModuleScript w ServerStorage , a następnie zmień nazwę modułu skryptu na 1> Leaderboard1>.
Zastąp standardowy kod następujązym kodem:
local Leaderboard = {}-- Tworzenie nowego rankinglocal function setupLeaderboard(player)local leaderstats = Instance.new("Folder")-- „leaderstats” to rezerwowany nazwa Roblox uznana za nazwę rankingleaderstats.Name = "leaderstats"leaderstats.Parent = playerreturn leaderstatsend-- Tworzenie nowej wartości statystyki lideralocal function setupStat(leaderstats, statName)local stat = Instance.new("IntValue")stat.Name = statNamestat.Value = 0stat.Parent = leaderstatsreturn statend-- Aktualizowanie wartości statystyki 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 koduPoniższe sekcje opisują, jak tablica liderów działa bardziej szczegółowo.
Utworzenie listy liderów
Funkcja setupLeaderboard() tworzy nową instancję leaderstats i ustawia ją jako dziecko określonego gracza. Roblox automatycznie rozpozna
-- Tworzenie nowego rankinglocal function setupLeaderboard(player)local leaderstats = Instance.new("Folder")-- „leaderstats” to rezerwowany nazwa Roblox uznana za nazwę rankingleaderstats.Name = "leaderstats"leaderstats.Parent = playerreturn leaderstatsend-- Tworzenie nowej wartości statystyki lideralocal function setupStat(leaderstats, statName)local stat = Instance.new("IntValue")stat.Name = statNamestat.Value = 0stat.Parent = leaderstatsreturn statendAktualizowanie statystyk gracza
setStat() jest jedyną publiczną funkcją w modułach Leaderboard . tworzy wartości statystyk dla określonego gracza lub dla tablicy liderów, jeśli nie istnieje jeszcze.
FindFirstChild() wziął nazwę obiektu i zwraca obiekt, jeśli istnieje, lub nil jeśli nie. Jest to powszechny, bezpieczny sposób znalezienia, czy obiekt istnieje przed użyciem go.
-- Aktualizowanie wartości statystyki 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
Zintegrować Skrypcje Modułowe
Zarówno PlayerData i Leaderboard skrypty modułowe są ukończone, wymagają one w CoinService skrypcie, aby zarządzać i wyświetlać dane monety gracza. Aby aktualizować 2>CoinService2>:
W oknie Explorer otwórz skrypt CoinService .
Zastąp obecny kod kodem następującym:
-- Początkowa inicjalizacja usług i zmiennelocal 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)-- Aktualizuj tabelę monetlocal newCoinAmount = PlayerData.updateValue(player, COIN_KEY_NAME, updateFunction)-- Aktualizuj rankingmonetLeaderboard.setStat(player, COIN_KEY_NAME, newCoinAmount)end-- Definiowanie identyfikatora wydarzenialocal 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-- Ustawienie 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 CoinService skrypcie obejmują:
- Oświadczenie COIN_AMOUNT_TO_ADD jako liczbę monet do dodania, gdy gracz zbiera monetę, i COIN_KEY_NAME jako imię klucza zdefiniowane w PlayerData .
- Utworzenie funkcji pomocniczej updatePlayerCoins() do aktualizacji liczby monet gracza i statystyk tablicy liderów.
- Zastąpienie znacznika print() stwierdzenie w onCoinTouched() z wezwanie do updatePlayerCoins() .
Playtest
Nadszedł czas, aby zobaczyć, czy zbiór monet działa tak, jak zaplanowano. Gdy dotykasz i zbierasz monety w gra, powinieneś być w stanie zobaczyć ilość monet, które zebrałeś na pasku lidera. Aby przetestować swoją własną doświadczenie:
W menu Kliknij przycisk Graj. Studio wchodzi w tryb testu.
Przenieś swojego postaci, aby dotknąć monety. Jeśli twoje skrypty działają poprawnie, interfejs lidera wyświetla się i zwiększa liczbę monet, jak zbierasz więcej monet.