作成したコイン拾いゲームにセーブ機能を追加する

もととなるゲーム

APIの利用を許可する

HomeタブのGameSettingsを選択、SecurityタブのEnable Studio Access to API Servicesを有効にしてSaveを選択する

プレイヤーが追加されたときにデータをロードする

CoinAmountLeaderBoardスクリプトを開き、リーダーボード初期化前にデータをロードする

local Players = game:GetService("Players")

-- DataStoreを利用するためのサービスクラスを取得
local DataStoreService = game:GetService("DataStoreService")
-- Dummyという名前のDataStoreを取得/生成する
local coinStore = DataStoreService:GetDataStore("Coin")

local function leaderboardSetup(player)
	local leaderstats = Instance.new("Folder")
	leaderstats.Name = "leaderstats"
	leaderstats.Parent = player
	
	-- userIdからData用のキーを生成する
	local datakey = player.userId.."-coin"
	
	-- 成功するまでデータのロードを試みる
	local coinValue
	repeat
		print("try load data")
		local success, errorMessage = pcall(function()
			coinValue = coinStore:GetAsync(datakey)
		end)
		wait(1)
	until(success)
	
	-- ロードしたデータを反映させる
	local stage = Instance.new("IntValue")
	stage.Name = "Coin"
	stage.Value = coinValue
	stage.Parent = leaderstats
end

-- プレイヤーが追加されたときにリーダーボードを初期化する
Players.PlayerAdded:Connect(leaderboardSetup)

プレイヤーがゲームから出るときにデータを保存する

プレイヤーがゲームから出るときにデータを保存する関数を呼び出す

local function savePlayerData(player)
	-- userIdからData用のキーを生成する
	local datakey = player.userId.."-coin"

	-- データを保存する
	local data = tonumber(player.leaderstats.Coin.Value)
	repeat
		local success, errormessage = pcall(function()                
			coinStore:SetAsync(datakey, data)
		end)
	until (success)
end

-- プレイヤーがゲームから出ようとしたときのイベントを登録する
Players.PlayerRemoving:Connect(savePlayerData)

出力

ゲームを開始してコインを集めゲームを終了したあと、再度ゲームを再開するとデータが保存されていることを確認できる

コード全文

local Players = game:GetService("Players")

local DataStoreService = game:GetService("DataStoreService")
local coinStore = DataStoreService:GetDataStore("Coin")

local function leaderboardSetup(player)
	local leaderstats = Instance.new("Folder")
	leaderstats.Name = "leaderstats"
	leaderstats.Parent = player
	
	local datakey = player.userId.."-coin"
	
	local coinValue
	repeat
		print("try load data")
		local success, errorMessage = pcall(function()
			coinValue = coinStore:GetAsync(datakey)
		end)
		wait(1)
	until(success)
	
	local stage = Instance.new("IntValue")
	stage.Name = "Coin"
	stage.Value = coinValue
	stage.Parent = leaderstats
end

local function savePlayerData(player)
	local datakey = player.userId.."-coin"

	local data = tonumber(player.leaderstats.Coin.Value)
	repeat
		local success, errormessage = pcall(function()                
			coinStore:SetAsync(datakey, data)
		end)
	until (success)
end

Players.PlayerAdded:Connect(leaderboardSetup)
Players.PlayerRemoving:Connect(savePlayerData)

関連