👻
【Roblox開発】データストアへのアクセスを最小限に抑えてみた
背景
ユーザーのデータの更新時に毎回 DataStoreService
にアクセスしてませんか?頻繁に更新すると良くないイメージがあったので別の案を提案していきたいと思います。
実装案
実装すること
以下のような型のデータをユーザーIDをキーにして保存したい。
{
["FirstScore"] = 0
["SecondScore"] = 0
}
流れ
- メモリ上に置いておくためのテーブル配列作成
- プレイヤー入室時に
DataStoreService
にアクセスしデータを持ってくる - メモリ上に保存
- ゲーム中に更新
- プレイヤー退出時に
DataStoreService
にアクセスしデータを保存する。
前準備
データストアモジュールからデータをロードする仕組みと保存する仕組みを作っておく。
DataStoreからデータを新規作成と更新するコードについてはこちらからを参考にしてください。
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)
Discussion