RobloxStudioでデータセーブを実装(DataStores)|Robloxゲーム作成メモ

RobloxStudioで「DataStoreService」を使用してプレイヤーのデータ(スコア、持ち物など)を保存する方法のメモになります。

はじめに

プレイヤーが保有しているアイテムやコインなどの情報を保存しておきたい場合(ゲームを終了したときに保管)、「DataStoreService」を使用して、サーバーに保存することが出来ます。

下記が公式リファレンスになります。今回は公式リファレンスを参照しながら作成して、動作を確認してみます。

作成前に、まずは公式リファレンスにある通り、「ExperienceSettings」の「Security」からAPIサービスへのアクセスを有効にします。

制作開始

「ServerScriptService」内に「Script」を追加します。

「Script」の中身を下記に変更します。

local DataStoreService = game:GetService("DataStoreService")
local experienceStore = DataStoreService:GetDataStore("PlayerExperience")

experienceStore:SetAsync("User_1", 50)

print(experienceStore:GetAsync("User_1"))

「PlayerExperience」という名前のデータストア(データを保存しておく場所)を作成。「SetAsync」でデータをセット(User_1が50というデータを保管)、「GetAsync」でデータを取得します。

実行すると下記のようになります。User_1が保管しているデータを表示しています。

実際の利用例

下記にてコインを集めるゲームを作成しました。下記ではゲームを起動するたびにコインの数がリセットされます。

コインが累積されるようにコインの数をデータストアに保管してみます。

まずは下記のようにスクリプトを変更します。プレイヤーが追加されたときに、データストアからコインの数を取得しています。

local Players = game:GetService("Players")

local DataStoreService = game:GetService("DataStoreService")
local experienceStore = DataStoreService:GetDataStore("PlayerExperience")

local function onPlayerAdded(player)
	
	local leaderstats = Instance.new("Folder")
	leaderstats.Name = "leaderstats"
	leaderstats.Parent = player
	
	local coins = Instance.new("IntValue")
	coins.Name = "Coins"
	coins.Parent = leaderstats
	
	local success, currentExperience = pcall(function()
		return experienceStore:GetAsync(player.UserId)
	end)
	
	if success and currentExperience then
		coins.Value = currentExperience
	end
	
end

Players.PlayerAdded:Connect(onPlayerAdded)

次に、コインの数を保管するのを追加したスクリプトが下記になります。

local Players = game:GetService("Players")

local DataStoreService = game:GetService("DataStoreService")
local experienceStore = DataStoreService:GetDataStore("PlayerExperience")

local function saveData(player)
	
	local savedata = player.leaderstats.Coins.Value
	
	local success, err = pcall(function()
		experienceStore:SetAsync(player.UserId, savedata)
	end)

	if success then
		print("save")
	else
		print("not save")
		warn(err)		
	end
end

local function onPlayerAdded(player)
--省略
end

Players.PlayerAdded:Connect(onPlayerAdded)

Players.PlayerRemoving:Connect(saveData)

game:BindToClose(function()
	for _, player in pairs(Players:GetChildren()) do
		saveData(player)
	end
end)

公式リファレンスにもありますが、失敗することもあるのでpcall()で呼び出すのが重要ですね。実際にはエラーで情報が取得できなかった時の処理も考える必要がありますね。

タイトルとURLをコピーしました