Rejestracja i wyświetlanie danych 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ę, musisz zliczyć, ile monet gracze zebrali i uczynić tę wartość widoczną na tablicy wyników.

Utwórz skrypt modułowy do rejestrowania zbierania monet

Aby obsłużyć przechowywanie i zarządzanie danymi zbierania monet każdego gracza, musisz utworzyć obiekt ModuleScript, który zawiera strukturę danych i funkcje, które uzyskują dostęp do danych zbierania monet dla każdego gracza. Skrypty modułowe to wielokrotnego użytku kod, który inne skrypty mogą wymagać. W tym przypadku CoinService wymaga tego skryptu modułowego, aby mógł aktualizować dane zbierania monet, gdy gracze dotykają monet.

Utwórz PlayerData
W ServerStorage utwórz ModuleScript o nazwie PlayerData z następującym kodem:
```lua
local PlayerData = {}
PlayerData.COIN_KEY_NAME = "Coins"
local playerData = {
--[[
[userId: string] = {
["Coins"] = coinAmount: number
}
]]
}
local function defaultPlayerData()
return {
[PlayerData.COIN_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
```

Skrypt modułowy definiuje tabelę PlayerData, która zawiera zero lub wiele tabel playerData, które reprezentują dane zbierania monet dla gracza. Każdy skrypt, który wymaga tego skryptu modułowego, otrzymuje tę samą kopię tabeli PlayerData, co pozwala wielu skryptom na modyfikowanie i dzielenie się danymi zbierania monet.

Zadeklaruj struktury danych

Skrypt modułowy zaczyna się od deklaracji pustej tabeli PlayerData, która jest zwracana na końcu skryptu. Zawiera również metody dostępu do uzyskiwania i ustawiania wartości w tabeli.

Tabela playerData zawiera komentarze, które opisują strukturę tabeli, co ułatwia zrozumienie kodu. W tym przypadku tabela playerData zawiera userId i odpowiadające 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

Zdefiniuj lokalny dostęp do danych

getData() to lokalna funkcja, która pobiera dane dla konkretnej tabeli playerData. Jeśli gracz nie zebrał monety, zwraca tabelę z funkcji defaultPlayerData(), aby zapewnić, że każdy gracz ma jakieś dane związane z nimi. Powszechną konwencją jest tworzenie prostych, publicznych funkcji, które przenoszą logikę do funkcji o lokalnym zakresie, które wykonują ciężką pracę.

local function defaultPlayerData()
return {
[PlayerData.COIN_KEY_NAME] = 0
}
end
local function getData(player)
local data = playerData[tostring(player.UserId)] or defaultPlayerData()
playerData[tostring(player.UserId)] = data
return data
end

Zdefiniuj publiczne akcesory danych

getValue() i updateValue() to funkcje publiczne, które inne skrypty, które wymagają tego skryptu modułowego, mogą wywoływać. W naszym przypadku CoinService używa tych funkcji do aktualizacji danych zbierania monet gracza, gdy ten gracz dotyka 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

Zaimplementuj tablicę wyników

Możesz wizualnie przedstawić dane zbierania monet za pomocą tablicy wyników na ekranie. Roblox zawiera wbudowany system, który automatycznie generuje tablicę wyników za pomocą domyślnego interfejsu użytkownika.

Utwórz Tablicę Wyników
W ServerStorage utwórz ModuleScript o nazwie Leaderboard z następującym kodem:
```lua
local Leaderboard = {}
-- Tworzenie nowej tablicy wyników
local function setupLeaderboard(player)
local leaderstats = Instance.new("Folder")
-- 'leaderstats' to zarezerwowana nazwa, którą Roblox rozpoznaje do tworzenia tablicy wyników
leaderstats.Name = "leaderstats"
leaderstats.Parent = player
return leaderstats
end
-- Tworzenie nowej wartości statystyki tablicy wynikó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 statystyki 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 działa tablica wyników w większych szczegółach.

Utwórz tablicę wyników

Funkcja setupLeaderboard() tworzy nową instancję folderu o nazwie leaderstats i ustawia ją jako dziecko określonego gracza. Roblox automatycznie rozpoznaje folder o nazwie leaderstats jako kontener statystyk i tworzy element interfejsu użytkownika do wyświetlania statystyk. Wymaga, aby wartości w leaderstats były przechowywane jako obiekty "value" (takie jak StringValue, IntValue lub NumberValue).

-- Tworzenie nowej tablicy wyników
local function setupLeaderboard(player)
local leaderstats = Instance.new("Folder")
-- 'leaderstats' to zarezerwowana nazwa, którą Roblox rozpoznaje do tworzenia tablicy wyników
leaderstats.Name = "leaderstats"
leaderstats.Parent = player
return leaderstats
end
-- Tworzenie nowej wartości statystyki tablicy wyników
local function setupStat(leaderstats, statName)
local stat = Instance.new("IntValue")
stat.Name = statName
stat.Value = 0
stat.Parent = leaderstats
return stat
end

Aktualizuj statystyki graczy

setStat() to jedyna publiczna funkcja w module Leaderboard. Tworzy wartości statystyk dla określonego gracza lub samej tablicy wyników, jeśli jeszcze nie istnieje.

FindFirstChild() przyjmuje nazwę obiektu i zwraca obiekt, jeśli istnieje, lub nil, jeśli nie. To powszechna, bezpieczna metoda sprawdzania, czy obiekt istnieje, zanim go użyjesz.

-- Aktualizacja wartości statystyki 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łowe

Gdy oba moduły są na miejscu, wymagaj ich w skrypcie CoinService, aby zarządzać i wyświetlać dane monet gracza.

Zaktualizuj CoinService
W ServerScriptService zastąp istniejący kod skryptu CoinService następującym:
```lua
-- 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 tablicy wyników monet
Leaderboard.setStat(player, COIN_KEY_NAME, newCoinAmount)
end
-- Definiowanie obsługi zdarzeń
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
-- Ustawianie nasłuchiwaczy zdarzeń
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 PlayerData i Leaderboard za pomocą funkcji require().
  • Deklarowanie COIN_AMOUNT_TO_ADD jako liczby monet do dodania, gdy gracz zbiera monetę, oraz COIN_KEY_NAME jako klucza zdefiniowanego w PlayerData.
  • Tworzenie funkcji pomocniczej updatePlayerCoins(), aby zaktualizować liczbę monet gracza i powiązaną statystykę tablicy wyników.
  • Zastąpienie zastępczego wywołania print() w onCoinTouched() wywołaniem updatePlayerCoins().

Testowanie

Wybierz Test z rozwijanego menu i kliknij Graj. Wejdź w monetę i potwierdź, że tablica wyników pojawia się w rogu oraz że liczba twoich monet wzrasta, gdy zbierasz więcej monet.

©2026 Roblox Corporation. Nazwa Roblox, logo Roblox oraz hasło „Powering Imagination” należą do naszych zarejestrowanych i niezarejestrowanych znaków towarowych na terenie Stanów Zjednoczonych oraz w innych krajach.