メインコンテンツへスキップ
RobuCraft
ゲーム開発

RobloxのDataStoreでプレイヤーデータを保存する方法

せっかく集めたコインが、ゲームを閉じたら消えちゃった——そんな経験ない?DataStoreを使えば、スコアやアイテムをサーバーに保存して、 次にログインしたときに復元できるようになるよ!

この記事でわかること

  1. DataStoreとは何か
  2. DataStoreを有効にする設定
  3. データの保存(セーブ)と読み込み(ロード)
  4. 自動セーブの実装方法
  5. エラー対策とpcallの使い方

1. DataStoreって何?

DataStoreは、Robloxが提供するクラウド上のデータベース。 プレイヤーごとにデータを保存できて、ゲームを閉じても消えない。

DataStoreで保存できるもの

スコア・コイン

数値データ

持ち物リスト

テーブルデータ

設定・レベル

混合データ

注意:DataStoreはサーバースクリプト(Script)からしか使えないよ。 LocalScriptからは直接アクセスできない。

2. DataStoreを有効にする

DataStoreを使うには、まずRoblox Studioで設定を有効にする必要がある。

  1. Roblox Studioでゲームを開く
  2. メニューから 「ホーム」→「ゲーム設定」 を選択
  3. 「セキュリティ」 タブを開く
  4. 「Enable Studio Access to API Services」 をオンにする
  5. 保存ボタンを押す

3. データの保存と読み込み

基本的なセーブ・ロードの流れを見てみよう。 プレイヤーがログインしたらデータを読み込み、ログアウトするときに保存する。

データの流れ

ログインGetAsync()プレイ中メモリで管理ログアウトSetAsync()
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でエラー対策もして」と伝えよう

データ保存付きのゲームを作ってみよう!

ロブ先生に「DataStoreでスコアを保存したい」と伝えるだけ。 コードはAIが書いてくれるよ。

無料で始める