ゲーム開発
RobloxのDataStoreでプレイヤーデータを保存する方法
せっかく集めたコインが、ゲームを閉じたら消えちゃった——そんな経験ない?DataStoreを使えば、スコアやアイテムをサーバーに保存して、 次にログインしたときに復元できるようになるよ!
この記事でわかること
- DataStoreとは何か
- DataStoreを有効にする設定
- データの保存(セーブ)と読み込み(ロード)
- 自動セーブの実装方法
- エラー対策とpcallの使い方
1. DataStoreって何?
DataStoreは、Robloxが提供するクラウド上のデータベース。 プレイヤーごとにデータを保存できて、ゲームを閉じても消えない。
DataStoreで保存できるもの
スコア・コイン
数値データ
持ち物リスト
テーブルデータ
設定・レベル
混合データ
注意:DataStoreはサーバースクリプト(Script)からしか使えないよ。 LocalScriptからは直接アクセスできない。
2. DataStoreを有効にする
DataStoreを使うには、まずRoblox Studioで設定を有効にする必要がある。
- Roblox Studioでゲームを開く
- メニューから 「ホーム」→「ゲーム設定」 を選択
- 「セキュリティ」 タブを開く
- 「Enable Studio Access to API Services」 をオンにする
- 保存ボタンを押す
3. データの保存と読み込み
基本的なセーブ・ロードの流れを見てみよう。 プレイヤーがログインしたらデータを読み込み、ログアウトするときに保存する。
データの流れ
Luau — ServerScriptService に配置
local DataStoreService = game:GetService("DataStoreService")
local playerData = DataStoreService:GetDataStore("PlayerSaveData")
-- プレイヤーがログインしたとき: データを読み込む
game.Players.PlayerAdded:Connect(function(player)
local leaderstats = Instance.new("Folder")
leaderstats.Name = "leaderstats"
leaderstats.Parent = player
local score = Instance.new("IntValue")
score.Name = "Score"
score.Parent = leaderstats
-- DataStoreからデータを読み込む
local success, savedScore = pcall(function()
return playerData:GetAsync("Player_" .. player.UserId)
end)
if success and savedScore then
score.Value = savedScore
print(player.Name .. " のデータを読み込んだ: " .. savedScore)
else
score.Value = 0
print(player.Name .. " は新規プレイヤー")
end
end)
-- プレイヤーがログアウトしたとき: データを保存する
game.Players.PlayerRemoving:Connect(function(player)
local stats = player:FindFirstChild("leaderstats")
if stats then
local success, err = pcall(function()
playerData:SetAsync("Player_" .. player.UserId, stats.Score.Value)
end)
if success then
print(player.Name .. " のデータを保存した")
else
warn("データ保存に失敗: " .. err)
end
end
end)4. 自動セーブを実装しよう
ログアウト時だけだと、サーバーがクラッシュしたときにデータが消えてしまう。 定期的に自動セーブする仕組みも追加しよう。
Luau — 上のスクリプトに追加
-- 5分ごとに自動セーブ
local AUTO_SAVE_INTERVAL = 300 -- 秒
while true do
task.wait(AUTO_SAVE_INTERVAL)
for _, player in game.Players:GetPlayers() do
local stats = player:FindFirstChild("leaderstats")
if stats then
pcall(function()
playerData:SetAsync("Player_" .. player.UserId, stats.Score.Value)
end)
end
end
print("全プレイヤーのデータを自動保存した")
end注意:DataStoreにはリクエスト制限がある(1分あたり60回+プレイヤー数×10回)。 セーブ間隔は短すぎないようにしよう。5分ごとがおすすめだよ。
5. pcallでエラーに備えよう
DataStoreはネットワーク通信を使うから、たまにエラーが起きる。 そのときにゲーム全体がクラッシュしないように、pcall(Protected Call)で包むのが鉄則!
❌ pcallなし(危険)
-- エラーが起きるとゲームが止まる
local data = playerData:GetAsync(key)✅ pcallあり(安全)
-- エラーが起きても処理を続行
local ok, data = pcall(function()
return playerData:GetAsync(key)
end)pcall は「エラーが起きてもゲームを止めない」ための関数。 最初の戻り値が true なら成功、false ならエラー。エラー時は2番目の戻り値にエラーメッセージが入るよ。
まとめ
- ✓DataStoreはRobloxのクラウドデータベース。プレイヤーデータを永続保存できる
- ✓GetAsync で読み込み、SetAsync で保存
- ✓ログアウト時 + 定期的な自動セーブでデータを守る
- ✓DataStoreの操作は必ず pcall で包んでエラーに備える
- ✓AIに頼むときは「DataStoreでスコアを保存して、pcallでエラー対策もして」と伝えよう