リーダーボードは、ゲーム内にいるプレイヤーのスコアや通貨などの情報を表示するロブロックスの機能です。
プレイヤーが取得したコインを保存して表示するリーダーボードを作成してみます。
リーダーボードの初期設定
- Explorerで、ServerScriptService の下に、PlayerSetup という名前の新しいスクリプトを作成します。
- onPlayerJoin() という関数を作成します。ゲームに入ってきたプレイヤー(player)がパラメーターになります。
- フォルダーを作成します。
- フォルダーの名称を”leaderstats“にします。この名称でないとリーダーボードに表示されません。
- リーダーボード(leaderstats)の親をプレーヤー(player)に設定します。
local function onPlayerJoin(player)
local leaderstats = Instance.new("Folder") -- フォルダーを作成
leaderstats.Name = "leaderstats" -- フォルダ名を「leaderstats」にする
leaderstats.Parent = player -- リーダーボードの親は player
表示する項目の追加
- コインは整数値で保存しますので、IntValue 型のインスタンスを作成します。それ以外のデータ型を使用したい場合は下記をご覧ください。
- Coin の項目名(リーダーボードのタイトル部に表示)を “Coin” にします。日本語も使用できます。
- コインの初期値は0にします。(スタートの所持金が1000なら、1000にする)
- coin は、leaderstats に属しますので、親は leaderstats になります。
- さらに表示したい項目がある場合は、上記の1から繰り返すだけです。
local coin = Instance.new("IntValue") -- コインは整数値
coin.Name = "Coin" -- 表示は「Coin」にする
coin.Value = 0 -- コインの初期値は0にする
coin.Parent = leaderstats -- coin の親は leaderstats
end
リーダーボードで扱えるデータ型
リーダーボードでは、下記の4種類のデータ型が使用できます。
IntValue
整数(小数点は使用できない)を扱いたいときに使用します。
単一の符号付き64ビット整数です。整数には小数点は含まれません。プラス、マイナス約9.2兆まで扱うことができます。
BoolValue
真(true) か 偽(false) の2つ値を扱うことができます。
NumberValue
小数点付きの数字を扱いたいときに使用します。
実数(倍精度浮動小数点)を扱うことができます。C言語でいうdouble型です。
IEEE 754表現(1符号ビット、11指数ビット、52小数ビット)を使用して、64ビット(8バイト)で数値を格納します。格納できる最大数値は、9,007,199,254,740,992で、最小値は-9,007,199,254,740,992になります。
StringValue
文字列を扱いたいときに使用します。
最大文字数は、200,000文字までとなります。リーダーボード以外でも使用できるため、長い文字列が扱えるようになっています。
PlayerAddedイベントに紐づけ
プレイヤーがゲームに入ってきたときに発生するイベントがあります。最後にそのイベントに先ほど作成した関数を紐づけします。
- Players の PlayerAddedイベントに、先ほど作成した onPlayerJoin に紐づけします。これでプレイヤーがゲームに入ってくるタイミングで、onPlayerJoin() 関数が実行されるようになります。
local function onPlayerJoin(player)
local leaderstats = Instance.new("Folder") -- フォルダーを作成
leaderstats.Name = "leaderstats" -- フォルダ名を「leaderstats」にする
leaderstats.Parent = player -- リーダーボードの親は player
local coin = Instance.new("IntValue") -- コインは整数値
coin.Name = "Coin" -- 表示は「Coin」にする
coin.Value = 0 -- コインの初期値は0にする
coin.Parent = leaderstats -- coin の親は leaderstats
end
game.Players.PlayerAdded:Connect(onPlayerJoin) -- PlayerAdded イベントに紐づけする
リーダーボードの値の更新
先ほど、作成したリーダーボードの「Coin」という値を更新して見ようと思います。下記の例では、パーツに触れると、1コイン獲得できるというものです。触れた後はパーツを消去します。
- Wrokspace パーツを1つ追加し、それにスクリプトを追加します。
- パーツに触れると1コイン獲得するということで、Touched イベントを使用します。
- まず、パーツに触れたのがプレイヤーかどうかを確認します。
- プレイヤーだった場合は、プレイヤー名からリーダーボード(leaderstats)を辿ります。
- リーダーボードから Coin の値を取得し、1を加算しその結果を代入します。
- 最後に、Touched イベントに紐づけすれば完了です。
local Players = game:GetService("Players")
local coin = script.Parent
local function onTouched(part)
local character = otherPart.Parent
local humanoid = character:FindFirstChildWhichIsA("Humanoid")
if humanoid then -- パーツに触れたのはプレイヤー?
local player = Players:GetPlayerFromCharacter(character) -- -- プレイヤー名を取得
player.leaderstats.Coin.Value += 1 -- リーダーボードのCoinの値に1を加算
coin:Destroy() -- パーツを消去
end
end
coin.Touched:Connect(onTouched) -- Touched イベントに紐づけ
リーダーボードはデータを保存しない
プレイヤーがゲームから出ると、リーダーボードの情報を失うことになります。これらの情報を保持したい場合は、サーバーに保存しなくてはならず特別な処理が必要となります。
プレイヤーデータを保存する方法はこちらに解説しましたのでご覧ください。
度々コメントしてすみませんm(_ _)m
点数表ってどうやってしたら作成できますか?
点数表とはユーザーランキングのことでしょうか?
どの辺りまでご理解されているのかが分かりませんが、
まず、データのセーブは、DataStoreServiceのGetOrderedDataStoreを使用します。
https://developer.roblox.com/en-us/api-reference/function/DataStoreService/GetOrderedDataStore
ランキングの表示は、SurfaceGuiを使用します。
https://developer.roblox.com/en-us/api-reference/class/SurfaceGui
コメント失礼します。今、「赤のボタンを押したらコインが1増える」というプログラムを作っているのですが、赤ボタンにスクリプトを追加して上記の「リーダーボードの値の更新」にあったプログラムをそのまま貼り付けてみたところ、コインの値に変化はありませんでした。これはパーツの名前によって書き換えないといけない箇所でもあるのでしょうか?それともなにかの不具合でしょうか…?自分はまだ初心者なのであたりまえの質問でしたらすみません。何卒ご教授願います。
申し訳ありませんが、プログラムを拝見してみないと原因は分かりませんね。
YouTubeで公開している「動画で学ぶプログラム」をご視聴いただき、理解していけば問題点が把握できると思います。
只今、第20回目を制作中で、21回目でリーダーボードを取り扱おうと思っていますので、それまでお待ちください。
そうなんですね…
ではそちらの動画の投稿を待つこととしたします。
ご丁寧にありがとうございました。
先ほどお勧めしていただいた動画を拝見いたしましたところ、第18回の「タッチイベント」で私のプログラムに間違いがあったことがわかり、修正できました。解説ありがとうございました。
そうですか。動画が役に立ったわけですね。嬉しいことです。
ロブロックスの仕組みを理解していくとバグの原因が掴みやすくなります。
ゲーム制作は楽しいのでこれからも続けてください。