あなたはコインを集めたプレイヤーがいるかを見つけることができるようになりました。このチュートリアルのセクションでは、プレイヤーがコインをいくつ集めたかをカウントする方法を教えています。その金額はリーダーボードに表示されます。
コインコレクションを記録するモジュールスクリプトを作成
各プレイヤーのコインコレクションデータのストレージと管理を処理するには、ModuleScriptオブジェクトを作成して、コインコレクションデータにアクセスするデータ構造と関数を含む必要があります。モジュールスクリプトは、他のスクリプトが要求するコードを再使用できます
モジュールスクリプトを作成するには:
In the Explorer ウィンドウ, 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 という名前のフィールドが含まれており、そのプレイヤーのコインを表示します。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_DATAplayerData[tostring(player.UserId)] = datareturn dataend公開データアクセサーを定義する
getValue() および updateValue() は、このモジュールスクリプトを呼び出す他のスクリプトに公開されている機能です。我々の場合、 CoinService は、これらの機能を使用して、プレイヤーがコインをタッチするたびにコインのコレクションデータを更新します。
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 を使用してリーダーボードを自動で生成するための組み込み機能が含まれています。
リーダーボードを作成するには:
In the エクスプローラー ウィンドウ, create a ModuleScript in ServerStorage , then rename the module script to 1>リーダーボード1> .
次のコードをデフォルトコードと交換します:
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コード説明次のセクションでは、リーダーボードの作動方法を説明します。
リーダーボードを作成する
The setupLeaderboard() 関数は、leaderstats という名前の新しいフォルダインスタンスを作成し、指定されたプレイヤーの子と
-- 新しいリーダーボードスコアボード作成する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 スクリプトの PlayerData と Leaderboard を必要とします。2>CoinService2> を更新するには:
In the エクスプローラ window, open the CoinService script.
以下のコードで既存のコードを置き換えます:
-- サービスと変数の初期化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 スクリプトの変更には以下が含まれます:
- Global.LuaGlobals.requir必須() 関数で、 PlayerData と require() モジュールをインポートしています。
- プレイヤーがコインを集めるときに追加するコインの数を COIN_AMOUNT_TO_ADD とし、 COIN_KEY_NAME は PlayerData で定義されたキー名により定義されます。
- ヘルパー関数を作成して、updatePlayerCoins() を更新して、プレイヤーのコイン数と関連するリーダーボードの統計を更新します。
- Replace the placeholder print() ステートステートメント in onCoinTouched() with a call to updatePlayerCoins() .
プレイテスト
コインコレクションが予定通りに機能しているかどうかを確認する時が来ました。ゲームでコインをタッチして集めると、リーダーボード UI でコインの数を見ることができるでしょう。あなたのエクスペリエンスをテストするには:
メニューバーで プレイ ボタンをクリックします。Studio はプレイテストモードに入ります。
キャラクターをコインにタッチさせます。スクリプトが正しく動作すると、ランキング UI が表示され、コインの数を増やすにつれて、ランキングが表示されます。