プレイヤーがコインを収集したときを検出できるようになったので、このチュートリアルのセクションでは、プレイヤーが収集したコインの数をカウントし、リーダーボースコアボードに表示する方法を教えます。
コインコレクションを記録するモジュールスクリプトを作成
各プレイヤーのコインコレクションデータの保存と管理を処理するには、すべてのプレイヤーにアクセスするデータ構造と機能を含む ModuleScript オブジェクトを作成する必要があります。モジュールスクリプトは、他のスクリプトが必必須とする再利用可能なコードです。この場合、CoinService は、プレイヤーがコインに触れたときにコインコレクションデータを更新できるように、このモジュールスクリプトを必要とします。
モジュールスクリプトを作成するには:
エクスプローラー ウィンドウ で ServerStorage をホバーし、 ⊕ ボタンをクリックします。コンテキストメニューが表示されます。
コンテキストメニューから、 ModuleScript を選択します。新しいモジュールスクリプトが ServerStorage の下に表示されます。サーバー上のコインコレクションロジックを管理したいため、 ServerStorage にモジュールスクリプトを配置しています。
モジュールスクリプトを PlayerData にリネームします。
デフォルトコードを次のコードで置き換えます:
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 PlayerDataコード説明モジュールスクリプトは、プレイヤーのコインコレクションデータを表示する PlayerData テーブルをゼロまたは多数の playerData テーブルで定義します。このモジュールスクリプトが必要なすべてのスクリプトは、PlayerData テーブルの同じコピーを受け取り、複数のスクリプトがコインコレクションデータを修正して共有できるようにします。
データ構造を宣言する
モジュールスクリプトは、スクリプトの終わりに返される空のテーブルの宣言で始まり、 PlayerData です。また、テーブルで値を取得して設定するアクセサリメソッドも含まれています。
playerData テーブルには、コードを理解しやすくするために、テーブルの構造を説明するコメントが含まれています。この場合、playerData テーブルには、userId と、それに対応する名前のフィールド Coins が含まれ、そのプレイヤーの収集されたコイン量を表しています。
local PlayerData = {}PlayerData.COIN_KEY_NAME = "Coins"local playerData = {--[[[userId: string] = {["Coins"] = coinAmount: number}]]}...return PlayerDataローカルデータアクセサーを定義する
getData() は、特定の playerData テーブルのデータを取得するローカル関数です。プレイヤーがコインを回収していない場合、すべてのプレイヤーに関連付けられたデータがあることを保証するために DEFAULT_PLAYER_DATA テーブルを返します。一般的な方法は、ロジックをローカルスコープの機能に転嫁する、シンプルな公開向け機能を作成することです。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 dataend公開データアクセサーを定義する
getValue() と updateValue() は、このモジュールスクリプトが必要な他のスクリプトが呼び出すことができる公開向けの機能です。私たちの場合、 コインサービス は、プレイヤーがコインをタッチするたびにこれらの機能を使用して、プレイヤーのコインコレクションデータを更新します。
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
リーダーボースコアボードを実装
画面上のリーダーボードでコインコレクションデータを視覚的に表示できます。Roblox には、デフォルトの UI を使用してリーダーボードを自動生成する内蔵システムが含まれています。
リーダーボードを作成するには:
エクスプローラー ウィンドウで、 サーバーストレージ に ModuleScript を作成し、モジュールスクリプトの名前を リーダーボード に変更します。
デフォルトコードを次のコードで置き換えます:
local Leaderboard = {}-- 新しスコアボードランキングを作成するlocal function setupLeaderboard(player)local leaderstats = Instance.new("Folder")-- 「leaderstats」は、リーダーボードを作成するために Roblox が認識している予約名ですleaderstats.Name = "leaderstats"leaderstats.Parent = playerreturn leaderstatsend-- 新しいリーダーボード統計値を作成するlocal function setupStat(leaderstats, statName)local stat = Instance.new("IntValue")stat.Name = statNamestat.Value = 0stat.Parent = leaderstatsreturn statend-- プレイヤーのステータス値の更新function 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 Leaderboardコード説明次のセクションでは、リーダーボードの機能がより詳細に説明されています。
リーダーボードを作成する
関数は、新しいフォルダインスタンスを作成し、指定されたプレイヤーの子として設定します。Roblox は、フォルダの名前が leaderstats というものを自動的に統計のコンテナとして認識し、統計を表示するための UI 要素を作成します。それには、leaderstats の値が「値」オブジェクトとして保存される必要があります(例: StringValue、IntValue または NumberValue )。
-- 新しスコアボードランキングを作成するlocal function setupLeaderboard(player)local leaderstats = Instance.new("Folder")-- 「leaderstats」は、リーダーボードを作成するために Roblox が認識している予約名ですleaderstats.Name = "leaderstats"leaderstats.Parent = playerreturn leaderstatsend-- 新しいリーダーボード統計値を作成するlocal function setupStat(leaderstats, statName)local stat = Instance.new("IntValue")stat.Name = statNamestat.Value = 0stat.Parent = leaderstatsreturn statendプレイヤーの統計を更新する
setStat() は リーダーボード モジュールの唯一の公開機能です。既に存在しない場合は、指定されたプレイヤーまたはリーダーボード自体のステータス値を作成します。
FindFirstChild() はオブジェクトの名前を取り、存在する場合はオブジェクトを返し、存在しない場合は nil です。使用する前にオブジェクトが存在するかどうかを確認する一般的で安全な方法です。
-- プレイヤーのステータス値の更新function 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
モジュールスクリプトを統合する
両方の プレイヤーデータ と リーダーボード モジュールスクリプトが完了したので、 コインサービス スクリプトで管理し、プレイヤーコインデータを表示する必要があります。 コインサービス を更新するには:
エクスプローラ ウィンドウで、 CoinService スクリプトを開きます。
既存のコードを次のコードで置き換えます:
-- サービスと変数の初期化local Workspace = game:GetService("Workspace")local Players = game:GetService("Players")local ServerStorage = game:GetService("ServerStorage")-- モジュールlocal 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)-- コインテーブルを更新するlocal newCoinAmount = PlayerData.updateValue(player, COIN_KEY_NAME, updateFunction)-- コインリーダーボードを更新すスコアボードLeaderboard.setStat(player, COIN_KEY_NAME, newCoinAmount)end-- イベントハンドラを定義するlocal function onCoinTouched(otherPart, coin)if coin:GetAttribute("Enabled") thenlocal character = otherPart.Parentlocal player = Players:GetPlayerFromCharacter(character)if player then-- プレイヤーがコインに触れたcoin.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-- イベント受信機を設定するfor _, coin in coins docoin:SetAttribute("Enabled", true)coin.Touched:Connect(function(otherPart)onCoinTouched(otherPart, coin)end)endコード説明オリジナルの CoinService スクリプトの変更には以下が含まれます:
- プレイヤーがコインを回収するときに追加するコイン数を宣言する COIN_AMOUNT_TO_ADD 、および COIN_KEY_NAME で定義されたキー名を **** 。
- ヘルパー関数 updatePlayerCoins() を作成して、プレイヤーのコイン数と関連するリーダーボードステータスを更新する
- プレースホルダーの print() 文を onCoinTouched() で updatePlayerCoins() に呼び出して置換する
プレイテスト
コインコレクションが意図通りに機能しているかを見る時が来ました。ゲームでコインをタッチして集めると、リーダーボードの UI で収集したコインの量が見えるべきです。エクスペリエンスをプレイテストするには:
ツールバーで プレイ ボタンをクリックします。Studio がプレイテストモードに入ります。
キャラクターを動かしてコインに触れます。スクリプトが正しく機能している場合、リーダーボードの UI が表示され、コインを増やすにつれてコイン数が増加します。