プレイヤーデータを記録および表示

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


あなたはコインを集めたプレイヤーがいるかを見つけることができるようになりました。このチュートリアルのセクションでは、プレイヤーがコインをいくつ集めたかをカウントする方法を教えています。その金額はリーダーボードに表示されます。

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

各プレイヤーのコインコレクションデータのストレージと管理を処理するには、ModuleScriptオブジェクトを作成して、コインコレクションデータにアクセスするデータ構造と関数を含む必要があります。モジュールスクリプトは、他のスクリプトが要求するコードを再使用できます

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

  1. In the Explorer ウィンドウ, 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 という名前のフィールドが含まれており、そのプレイヤーのコインを表示します。1> Coins1> は、そのプレイヤーの


    local PlayerData = {}
    PlayerData.COIN_KEY_NAME = "Coins"
    local playerData = {
    --]]
    [userId: string] = {
    ["Coins"] = coinAmount: number
    }
    ]]
    }
    ...
    return PlayerData

    ローカルデータアクセサリーを定義する

    getData() は、特定の playerData テーブルのデータを取得するローカル関数です。プレイヤーがコインを集めていない場合は、DEFAULT_PLAYER_DATA テーブルを返し、すべてのプレイヤーがデータに関連付けられるようにします。一般的なコンベン


    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() は、このモジュールスクリプトを呼び出す他のスクリプトに公開されている機能です。我々の場合、 CoinService は、これらの機能を使用して、プレイヤーがコインをタッチするたびにコインのコレクションデータを更新します。


    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. In the エクスプローラー ウィンドウ, create a ModuleScript in ServerStorage , then rename the module script to 1>リーダーボード1> .

    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

    次のセクションでは、リーダーボードの作動方法を説明します。

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

    The setupLeaderboard() 関数は、leaderstats という名前の新しいフォルダインスタンスを作成し、指定されたプレイヤーの子と


    -- 新しいリーダーボードスコアボード作成する
    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

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

プレイヤーデータ と リーダーボード モジュールスクリプトの両方が完了したとき、CoinService スクリプトの PlayerData と Leaderboard を必要とします。2>CoinService2> を更新するには:

  1. In the エクスプローラ window, open the CoinService script.

  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 スクリプトの変更には以下が含まれます:

    • Global.LuaGlobals.requir必須() 関数で、 PlayerDatarequire() モジュールをインポートしています。
    • プレイヤーがコインを集めるときに追加するコインの数を COIN_AMOUNT_TO_ADD とし、 COIN_KEY_NAMEPlayerData で定義されたキー名により定義されます。
    • ヘルパー関数を作成して、updatePlayerCoins() を更新して、プレイヤーのコイン数と関連するリーダーボードの統計を更新します。
    • Replace the placeholder print() ステートステートメント in onCoinTouched() with a call to updatePlayerCoins() .

プレイテスト

コインコレクションが予定通りに機能しているかどうかを確認する時が来ました。ゲームでコインをタッチして集めると、リーダーボード UI でコインの数を見ることができるでしょう。あなたのエクスペリエンスをテストするには:

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

    Studio's Home tab with the Play button highlighted in the menu bar.
  2. キャラクターをコインにタッチさせます。スクリプトが正しく動作すると、ランキング UI が表示され、コインの数を増やすにつれて、ランキングが表示されます。