Rejestruj i wyświetlaj dane gracza

*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.


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:

  1. W oknie Eksploratora przewiń nad ServerStorage i kliknij przycisk . Wyświetla się menu kontekstowe.

  2. 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.

    Studio's Explorer window with both the ServerScriptService's plus icon and ModuleScript object highlighted.
  3. Zmień nazwę skryptu modułu na PlayerData .

    Studio's Explorer window with the PlayerData script highlighted under ServerStorage.
  4. 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_DATA
    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

    Skrypt 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 PlayerData

    Okreś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_DATA
    playerData[tostring(player.UserId)] = data
    return data
    end

    Okreś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]
    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

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:

  1. W oknie Eksploratora utwórz ModuleScript w ServerStorage , a następnie zmień nazwę skryptu modułu na Tabelę wyników .

    Studio's Explorer window with the Leaderboard script highlighted under ServerStorage.
  2. Zastąp domyślny kod następującym kodem:


    local Leaderboard = {}
    -- Tworzenie nowej tabeli ranking
    local function setupLeaderboard(player)
    local leaderstats = Instance.new("Folder")
    -- Nazwa 'leaderstats' jest zarezerwowana i rozpoznawana przez Roblox do tworzenia tabeli ranking
    leaderstats.Name = "leaderstats"
    leaderstats.Parent = player
    return leaderstats
    end
    -- Tworzenie nowej wartości statystyk tabeli liderów
    local function setupStat(leaderstats, statName)
    local stat = Instance.new("IntValue")
    stat.Name = statName
    stat.Value = 0
    stat.Parent = leaderstats
    return stat
    end
    -- Aktualizacja wartości statystyk gracza
    function Leaderboard.setStat(player, statName, value)
    local leaderstats = player:FindFirstChild("leaderstats")
    if not leaderstats then
    leaderstats = setupLeaderboard(player)
    end
    local stat = leaderstats:FindFirstChild(statName)
    if not stat then
    stat = setupStat(leaderstats, statName)
    end
    stat.Value = value
    end
    return Leaderboard

    Nastę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 ranking
    local function setupLeaderboard(player)
    local leaderstats = Instance.new("Folder")
    -- Nazwa 'leaderstats' jest zarezerwowana i rozpoznawana przez Roblox do tworzenia tabeli ranking
    leaderstats.Name = "leaderstats"
    leaderstats.Parent = player
    return leaderstats
    end
    -- Tworzenie nowej wartości statystyk tabeli liderów
    local function setupStat(leaderstats, statName)
    local stat = Instance.new("IntValue")
    stat.Name = statName
    stat.Value = 0
    stat.Parent = leaderstats
    return stat
    end

    Aktualizacja 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 gracza
    function Leaderboard.setStat(player, statName, value)
    local leaderstats = player:FindFirstChild("leaderstats")
    if not leaderstats then
    leaderstats = setupLeaderboard(player)
    end
    local stat = leaderstats:FindFirstChild(statName)
    if not stat then
    stat = setupStat(leaderstats, statName)
    end
    stat.Value = value
    end

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 :

  1. W oknie Eksploratora otwórz skrypt CoinService .

  2. Zastąp istniejący kod następującym kodem:


    -- Inicjalizacja usług i zmiennych
    local Workspace = game:GetService("Workspace")
    local Players = game:GetService("Players")
    local ServerStorage = game:GetService("ServerStorage")
    -- Moduły
    local Leaderboard = require(ServerStorage.Leaderboard)
    local PlayerData = require(ServerStorage.PlayerData)
    local coinsFolder = Workspace.World.Coins
    local coins = coinsFolder:GetChildren()
    local COIN_KEY_NAME = PlayerData.COIN_KEY_NAME
    local COOLDOWN = 10
    local COIN_AMOUNT_TO_ADD = 1
    local function updatePlayerCoins(player, updateFunction)
    -- Aktualizacja tabeli monet
    local newCoinAmount = PlayerData.updateValue(player, COIN_KEY_NAME, updateFunction)
    -- Aktualizacja rankingmonet
    Leaderboard.setStat(player, COIN_KEY_NAME, newCoinAmount)
    end
    -- Definiowanie obsługi zdarzenia
    local function onCoinTouched(otherPart, coin)
    if coin:GetAttribute("Enabled") then
    local character = otherPart.Parent
    local player = Players:GetPlayerFromCharacter(character)
    if player then
    -- Gracz dotknął monety
    coin.Transparency = 1
    coin:SetAttribute("Enabled", false)
    updatePlayerCoins(player, function(oldCoinAmount)
    oldCoinAmount = oldCoinAmount or 0
    return oldCoinAmount + COIN_AMOUNT_TO_ADD
    end)
    task.wait(COOLDOWN)
    coin.Transparency = 0
    coin:SetAttribute("Enabled", true)
    end
    end
    end
    -- Konfiguracja słuchaczy wydarzeń
    for _, coin in coins do
    coin:SetAttribute("Enabled", true)
    coin.Touched:Connect(function(otherPart)
    onCoinTouched(otherPart, coin)
    end)
    end

    Zmiany w oryginalnym skrypcie CoinService obejmują:

    • Importowanie modułów Dane o graczu i Tabela wyników z funkcją require().
    • 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:

  1. Na pasku narzędzi kliknij przycisk Graj . Studio wchodzi w tryb testowania gry.

    Play button highlighted in Studio's playtesting options.
  2. 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.