Artık bir oyuncunun bir para topladığını tespit ettiğinizde, bu bölüm öğreticiyi saymak için oyuncuların topladığı para sayısını gösterir ve bu miktarı bir liderlik tablosugörünür hale getirir.
Para Koleksiyonunu Kaydetmek için Bir Modül Skripti Oluştur
Her oyuncunun para toplama verilerinin depolanmasını ve yönetimi için bir ModuleScript nesneyi oluşturmalısınız, böylece her oyuncu para toplama verilerine erişebilecek bir veri yapısı ve işlevleri içerebilir. Modül kodları, diğer kodların gerektiği yeniden kullan
Modül bir kod oluşturmak için:
In the Explorer window, hover over ServerStorage and click the ⊕ button. A context menu displays.
Konteks menüsünden ModuleScript seçin. ServerStorage altında yeni bir modül scripti görüntülenir. Modül bir scriptini ServerStorage içine yerleştiriyorsunuz çünkü sunucudaki para koleksiyonu mantığını yönetmek istiyorsunuz.
Modül kısmını PlayerData olarak yeniden adlandırın.
Aşağıdaki kodu varsayılan kodla değiştirin:
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 PlayerDataKod AçıklamasıModül kodu, bir oyuncu için para toplama verilerini temsil eden PlayerData tabelerini tanımlar, bunlar bir playerData tabelerinin içindeki sıfır veya birkaç PlayerData tabeleridir. Bu modül kodu gerektiren her kodun aynı kopyasını almasına izin verir, böylece birkaç kodun para toplama verilerini de
Veri Struktürlerini Bildirme
Modül kaynağı, PlayerData olarak başlar, bu da kaynağın sonunda iade edilir. Ayrıca kaynağın içinde değerleri alıp ayarlama yöntemleri bulunur.
playerData tabelasında, kodu anlamak için kullanıcının yapısını açıklayan yorumlar bulunur, böylece kodu daha kolay anlayabilirsiniz. Bu durumda, bir playerData tabelasında, oyuncutopladığı para miktarını temsil eden bir userId tabelası ve a
local PlayerData = {}PlayerData.COIN_KEY_NAME = "Coins"local playerData = {--[[[userId: string] = {["Coins"] = coinAmount: number}]]}...return PlayerDataYerel bir veri aksesörü tanımlanıyor
getData() is a local function that retrieves data for a specific playerData table. If a player hasn't collected a coin, it returns a DEFAULT_PLAYER_DATA table to ensure that every player has some data associating with them. A common convention is to create simple, public-facing functions that offload logic to locally-scoped functions that do the heavy lifting.
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 dataendHerkese Açık Veri Erişiminizi Tanımlama
getValue() ve updateValue() , bu modülün kullanımını gerektiren diğer yazılımların çağırabileceği kamu yüzü işlevleridir. Bizim durumumuzda, CoinService bu işlevleri kullanır ve bir oyuncu oyuncu oyunu yüzünden herhangi bir oyuncu oyunu oyunu güncellemez.
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
Bir Lider Listesi Oluştur
Görsel bir liderlik tablosukullanarak paraları güzel bir şekilde temsil edebilirsiniz. Roblox, varsayılan bir UI kullanarak lider tablosunu otomatik olarak oluşturan bir yerleşik sistem içerir.
liderlik tablosutablosunu oluşturmak için:
In the Explorer window, create a ModülScript in ServerStorage , then rename the module script to 1> LiderTablosu1> .
Aşağıdaki kodu varsayılan kodla değiştirin:
local Leaderboard = {}-- Yeni bir liderlik tablosuoluşturulmasılocal function setupLeaderboard(player)local leaderstats = Instance.new("Folder")-- liderlik tablosu'u oluşturmak için Roblox tarafından kabul edilen yanlış bir isimdirleaderstats.Name = "leaderstats"leaderstats.Parent = playerreturn leaderstatsend-- Yeni bir lider tablosu değeri oluşturuluyorlocal function setupStat(leaderstats, statName)local stat = Instance.new("IntValue")stat.Name = statNamestat.Value = 0stat.Parent = leaderstatsreturn statend-- Bir oyuncunun istatistik değerini güncellemefunction 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 LeaderboardKod AçıklamasıAşağıdaki bölümler, lider tablosunun nasıl daha ayrıntılı çalıştığını açıklar.
Bir Lider Listesi Oluşturulması
The setupLeaderboard() function creates a new folder instance named leaderstats and sets it as a child of the specified oyuncu. Roblox automatically recognizes a folder named leaderstats as a container of stats and
-- Yeni bir liderlik tablosuoluşturulmasılocal function setupLeaderboard(player)local leaderstats = Instance.new("Folder")-- liderlik tablosu'u oluşturmak için Roblox tarafından kabul edilen yanlış bir isimdirleaderstats.Name = "leaderstats"leaderstats.Parent = playerreturn leaderstatsend-- Yeni bir lider tablosu değeri oluşturuluyorlocal function setupStat(leaderstats, statName)local stat = Instance.new("IntValue")stat.Name = statNamestat.Value = 0stat.Parent = leaderstatsreturn statendOyuncu İstatistiklerini Güncelliyor
setStat() modülündeki tek halka açık işlevdir. Eğer mevcut değilse, belirli bir oyuncunun veya lider tablosu kendisi için stat değerleri oluşturur.
FindFirstChild() bir objeğin adını alır ve mevcutsa obje için iade eder veya nil değilse. Bu, yüklenmeden önce bir obje'yi öğrenmenin yaygın, güvenli bir yöntemidir.
-- Bir oyuncunun istatistik değerini güncellemefunction 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
Modül Kodlarını Entegre Et
Her ikisi de PlayerData ve Leaderboard modülü scriptleri tamamlandığında, onları CoinService scriptinde yönetmek ve göstermek için gerektirir. Güncelleme 1>CoinService1> :
In the Explorer window, open the CoinService script.
Mevcut kodu aşağıdaki kodla değiştirin:
-- Hizmetleri ve değişkenleri başlatıyorlocal Workspace = game:GetService("Workspace")local Players = game:GetService("Players")local ServerStorage = game:GetService("ServerStorage")-- Modüllerlocal 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)-- Para masasını güncellelocal newCoinAmount = PlayerData.updateValue(player, COIN_KEY_NAME, updateFunction)-- Madeni para liderlik tablosunu güncelleLeaderboard.setStat(player, COIN_KEY_NAME, newCoinAmount)end-- Etkinliğin oluşturucusunu tanımlamalocal function onCoinTouched(otherPart, coin)if coin:GetAttribute("Enabled") thenlocal character = otherPart.Parentlocal player = Players:GetPlayerFromCharacter(character)if player then-- Oyuncu bir para dokunulducoin.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-- Etkinlik dinleyicileri ayarlanıyorfor _, coin in coins docoin:SetAttribute("Enabled", true)coin.Touched:Connect(function(otherPart)onCoinTouched(otherPart, coin)end)endKod AçıklamasıOrijinal CoinService kriptinin değişiklikleri içerir:
- PlayerData ile Leaderboard modülünü 1> 4>Global.LuaGlobals.gerek()4> işleviyle İçe aktarılır.
- Bir oyuncu bir para topladığında eklenmesi gereken COIN_AMOUNT_TO_ADD sayısını tanımlar ve COIN_KEY_NAME PlayerData içinde tanımlanan anahtar ismiyi içerir.
- oyuncupara sayısını ve ilişkili lider tablosu statistiklerini güncellemeye yardımcı işlevi oluşturuldu updatePlayerCoins()
- Değiştirici print() ifadesini onCoinTouched() ile bir çağrı ile değiştirici updatePlayerCoins() .
Oyun testi
Madeni para koleksiyonunun işlediğini görmek zamanı. oyuniçinde bir madeni para topladığınızda, lider tablosu UI'sinde topladığınız madeni paraları görebilmelisiniz. Oyunuzu test etmek için:
Menü çubuğunda Oyna düğmesine tıklayın. Studio oyun testi moduna girer.
Karakterinizi bir paraye dokunmak için hareket ettirin. Eğer yazılımlarınız doğru şekilde çalışıyorsa, lider tablosu UI'si görüntülenir ve daha fazla para topladıkça para sayınızı artırır.