Robloxのリーダーボード

Robloxではリーダーボードというシステムを利用することで、スコアや通貨、レースの最速タイムなどのデータを表示することができる

リーダーボードのセットアップ

  1. ServerScriptService配下に新しいスクリプトを作成、名前をLeaderBoardとする

2. スクリプトでleaderboardSetup関数を作成、PlayerAddedのコールバックに登録する

local Players = game:GetService("Players")

-- プレイヤーがゲームに入ったときに呼び出される
local function leaderboardSetup(player)
end

-- プレイヤーが追加されたときに呼び出す関数を登録する
Players.PlayerAdded:Connect(leaderboardSetup)

3. leaderboadSetup関数内で新しいフォルダを作成し、名前をleaderstasに変更し、その親オブジェクトにplayerを登録する

local function leaderboardSetup(player)
	local leaderstats = Instance.new("Folder")
	leaderstats.Name = "leaderstats"
	leaderstats.Parent = player
end

この時点でゲームをプレイするとPlayer配下にleaderstasフォルダが作成されていることが確認できる

※フォルダの名前は必ずleaderstatsにする。他の名前を使用するとleaderboardに登録できない。

4.Intのインスタンスを作成し、名前をStageに変更する。そしてそのインスタンスの親に作成したleaderstatsフォルダを指定する。

local function leaderboardSetup(player)
	local leaderstats = Instance.new("Folder")
	leaderstats.Name = "leaderstats"
	leaderstats.Parent = player
	
	local stage = Instance.new("IntValue")
	stage.Name = "Stage"
	stage.Value = 1
	stage.Parent = leaderstats
end

ゲームをプレイすると名前とステージの情報が表示される

コード全文

local Players = game:GetService("Players")

-- プレイヤーがゲームに入ったときに呼び出される
local function leaderboardSetup(player)
	local leaderstats = Instance.new("Folder")
	leaderstats.Name = "leaderstats"
	leaderstats.Parent = player

	local stage = Instance.new("IntValue")
	stage.Name = "Stage"
	stage.Value = 1
	stage.Parent = leaderstats
end

-- プレイヤーが呼び出されたときに呼び出す関数を登録する
Players.PlayerAdded:Connect(leaderboardSetup)

リーダーボードの更新

リーダーボードの更新を行うために、触ったらステージの値を増やすオブジェクトを作成する

あたらしいパーツを作成し、AddProgressPartと名前をつける

作成したパーツの配下にスクリプトを新規作成、名前をAddProgressOnTouchにする

以下このスクリプトを編集する

  1. パーツに触れたときに実行するイベントを作成、登録する
-- スクリプトがアタッチされているパーツを取得
local part = script.Parent

-- パーツに触れたときのイベント
local function onPartTouch(otherPart)
	print("detect touch part")	
end

-- パーツが触られたときに登録した関数を実行する
part.Touched:Connect(onPartTouch)

出力

2. 先程作成したonPartTouchのprint文を削除、代わりにパーツに触れた対象がプレイヤーだった場合、Stageの値を増やす処理を実装する

-- プレイヤーのサービスクラスを取得
local Players = game:GetService("Players")

local part = script.Parent

local function onPartTouch(otherPart)
	-- 触れたパーツの親パーツを取得
	local partParent = otherPart.Parent
	-- 親パーツの子供からHumanoidクラスをもっているパーツを見つける
	local humanoid = partParent:FindFirstChildWhichIsA("Humanoid")
	
	-- Humanoidが見つかったら更新処理に入る
	if humanoid then
		-- Playerサービスクラスからパーツを触ったプレイヤーを取得
		local player = Players:GetPlayerFromCharacter(partParent)
		
		-- プレイヤーからleaderstasを取得し、更新する
		local leaderstats = player.leaderstats
		local stage = leaderstats and leaderstats:FindFirstChild("Stage")
		if stage then
			stage.Value += 1
		end
	end
end


part.Touched:Connect(onPartTouch)

出力

パーツに触れるたびにStageの値が増える