👻

【Roblox開発】データストアへのアクセスを最小限に抑えてみた

2024/07/04に公開

背景

ユーザーのデータの更新時に毎回 DataStoreService にアクセスしてませんか?頻繁に更新すると良くないイメージがあったので別の案を提案していきたいと思います。

実装案

実装すること

以下のような型のデータをユーザーIDをキーにして保存したい。

{
["FirstScore"] = 0
["SecondScore"] = 0
}

流れ

  1. メモリ上に置いておくためのテーブル配列作成
  2. プレイヤー入室時に DataStoreService にアクセスしデータを持ってくる
  3. メモリ上に保存
  4. ゲーム中に更新
  5. プレイヤー退出時にDataStoreService にアクセスしデータを保存する。

前準備

データストアモジュールからデータをロードする仕組みと保存する仕組みを作っておく。

DataStoreからデータを新規作成と更新するコードについてはこちらからを参考にしてください。
https://zenn.dev/landel_tech/articles/5190c8caa56949

ServerScriptService/PlayerEvents.lua

--ここにデータを保存しておく
local userDatas = {}

function LoadData(player)
	local data = DataStoreController.GetData(player)
	userDatas[player.UserId] = data
	return data
end

function SaveData(player)
	local data = userDatas[player.UserId]
	if data then
		DataStoreController.SetData(player,data)
	end
end

入室時にデータを持ってくる

ServerScriptService/PlayerEvents.lua

Players.PlayerAdded:Connect(function(player)
    local data = LoadData(player)
end)

ゲーム中にメモリ上にあるデータを保存する

ServerScriptService/PlayerEvents.lua

--リモートイベントなどで呼び出し更新する感じで
function IncrementFirstSocre(player)
   local myData = userDatas[player.UserId]
   myData.FirstScore += 1
   userDatas[player.UserId] = myData
end

退出時にデータストアに保存する

ServerScriptService/PlayerEvents.lua

Players.PlayerRemoving:Connect(function(player)
	SaveData(player)
end)
Landelテックブログ

Discussion