プレイヤーデータの記録と表示

*このコンテンツは、ベータ版のAI(人工知能)を使用して翻訳されており、エラーが含まれている可能性があります。このページを英語で表示するには、 こちら をクリックしてください。


プレイヤーがコインを収集したときを検出できるようになったので、このチュートリアルのセクションでは、プレイヤーが収集したコインの数をカウントし、リーダーボースコアボードに表示する方法を教えます。

コインコレクションを記録するモジュールスクリプトを作成

各プレイヤーのコインコレクションデータの保存と管理を処理するには、すべてのプレイヤーにアクセスするデータ構造と機能を含む ModuleScript オブジェクトを作成する必要があります。モジュールスクリプトは、他のスクリプトが必必須とする再利用可能なコードです。この場合、CoinService は、プレイヤーがコインに触れたときにコインコレクションデータを更新できるように、このモジュールスクリプトを必要とします。

モジュールスクリプトを作成するには:

  1. エクスプローラー ウィンドウServerStorage をホバーし、 ボタンをクリックします。コンテキストメニューが表示されます。

  2. コンテキストメニューから、 ModuleScript を選択します。新しいモジュールスクリプトが ServerStorage の下に表示されます。サーバー上のコインコレクションロジックを管理したいため、 ServerStorage にモジュールスクリプトを配置しています。

    Studio's Explorer window with both the ServerScriptService's plus icon and ModuleScript object highlighted.
  3. モジュールスクリプトを PlayerData にリネームします。

    Studio's Explorer window with the PlayerData script highlighted under ServerStorage.
  4. デフォルトコードを次のコードで置き換えます:


    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

    モジュールスクリプトは、プレイヤーのコインコレクションデータを表示する 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_DATA
    playerData[tostring(player.UserId)] = data
    return data
    end

    公開データアクセサーを定義する

    getValue()updateValue() は、このモジュールスクリプトが必要な他のスクリプトが呼び出すことができる公開向けの機能です。私たちの場合、 コインサービス は、プレイヤーがコインをタッチするたびにこれらの機能を使用して、プレイヤーのコインコレクションデータを更新します。


    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

リーダーボースコアボードを実装

画面上のリーダーボードでコインコレクションデータを視覚的に表示できます。Roblox には、デフォルトの UI を使用してリーダーボードを自動生成する内蔵システムが含まれています。

リーダーボードを作成するには:

  1. エクスプローラー ウィンドウで、 サーバーストレージ に ModuleScript を作成し、モジュールスクリプトの名前を リーダーボード に変更します。

    Studio's Explorer window with the Leaderboard script highlighted under ServerStorage.
  2. デフォルトコードを次のコードで置き換えます:


    local Leaderboard = {}
    -- 新しスコアボードランキングを作成する
    local function setupLeaderboard(player)
    local leaderstats = Instance.new("Folder")
    -- 「leaderstats」は、リーダーボードを作成するために Roblox が認識している予約名です
    leaderstats.Name = "leaderstats"
    leaderstats.Parent = player
    return leaderstats
    end
    -- 新しいリーダーボード統計値を作成する
    local function setupStat(leaderstats, statName)
    local stat = Instance.new("IntValue")
    stat.Name = statName
    stat.Value = 0
    stat.Parent = leaderstats
    return stat
    end
    -- プレイヤーのステータス値の更新
    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

    次のセクションでは、リーダーボードの機能がより詳細に説明されています。

    リーダーボードを作成する

    関数は、新しいフォルダインスタンスを作成し、指定されたプレイヤーの子として設定します。Roblox は、フォルダの名前が leaderstats というものを自動的に統計のコンテナとして認識し、統計を表示するための UI 要素を作成します。それには、leaderstats の値が「値」オブジェクトとして保存される必要があります(例: StringValueIntValue または NumberValue )。


    -- 新しスコアボードランキングを作成する
    local function setupLeaderboard(player)
    local leaderstats = Instance.new("Folder")
    -- 「leaderstats」は、リーダーボードを作成するために Roblox が認識している予約名です
    leaderstats.Name = "leaderstats"
    leaderstats.Parent = player
    return leaderstats
    end
    -- 新しいリーダーボード統計値を作成する
    local function setupStat(leaderstats, statName)
    local stat = Instance.new("IntValue")
    stat.Name = statName
    stat.Value = 0
    stat.Parent = leaderstats
    return stat
    end

    プレイヤーの統計を更新する

    setStat()リーダーボード モジュールの唯一の公開機能です。既に存在しない場合は、指定されたプレイヤーまたはリーダーボード自体のステータス値を作成します。

    FindFirstChild() はオブジェクトの名前を取り、存在する場合はオブジェクトを返し、存在しない場合は nil です。使用する前にオブジェクトが存在するかどうかを確認する一般的で安全な方法です。


    -- プレイヤーのステータス値の更新
    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

モジュールスクリプトを統合する

両方の プレイヤーデータリーダーボード モジュールスクリプトが完了したので、 コインサービス スクリプトで管理し、プレイヤーコインデータを表示する必要があります。 コインサービス を更新するには:

  1. エクスプローラ ウィンドウで、 CoinService スクリプトを開きます。

  2. 既存のコードを次のコードで置き換えます:


    -- サービスと変数の初期化
    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.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)
    -- コインテーブルを更新する
    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") then
    local character = otherPart.Parent
    local player = Players:GetPlayerFromCharacter(character)
    if player then
    -- プレイヤーがコインに触れた
    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
    -- イベント受信機を設定する
    for _, coin in coins do
    coin:SetAttribute("Enabled", true)
    coin.Touched:Connect(function(otherPart)
    onCoinTouched(otherPart, coin)
    end)
    end

    オリジナルの CoinService スクリプトの変更には以下が含まれます:

    • プレイヤーデータ および リーダーボード モジュールを require() 関数でインポートする。
    • プレイヤーがコインを回収するときに追加するコイン数を宣言する COIN_AMOUNT_TO_ADD 、および COIN_KEY_NAME で定義されたキー名を **** 。
    • ヘルパー関数 updatePlayerCoins() を作成して、プレイヤーのコイン数と関連するリーダーボードステータスを更新する
    • プレースホルダーの print() 文を onCoinTouched()updatePlayerCoins() に呼び出して置換する

プレイテスト

コインコレクションが意図通りに機能しているかを見る時が来ました。ゲームでコインをタッチして集めると、リーダーボードの UI で収集したコインの量が見えるべきです。エクスペリエンスをプレイテストするには:

  1. ツールバーで プレイ ボタンをクリックします。Studio がプレイテストモードに入ります。

    Play button highlighted in Studio's playtesting options.
  2. キャラクターを動かしてコインに触れます。スクリプトが正しく機能している場合、リーダーボードの UI が表示され、コインを増やすにつれてコイン数が増加します。