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()で呼び出すのが重要ですね。実際にはエラーで情報が取得できなかった時の処理も考える必要がありますね。
