データをセーブする(DataStore)

NDPバナナ
NDPバナナ

リーダーボードに値を表示する方法は分かったけど、保存する方法が分からないなぁ。

データをセーブする方法を教えてください!

もっけ
もっけ

わかりました!
データのセーブとロードの方法について教えます。

出来るようになること

  • リーダーボードの値をセーブ、ロードすることが出来るようになる。

DataStoreとは?

データをセーブするためには、DataStoreを使います。DataStoreを使用することで、ユーザのプレイデータを保存したり、マルチプレイヤー用のゲーム状態を同期したりすることができます。DataStoreは、データの読み書きが高速であるため、ロブロックスのゲーム開発において重要な機能となっています。

DataStoreは、Key、Value型のデータベースです。キーと値によってデータが管理されています。

KeyとValueは、保存したいデータ(Value:値)に対応する(Key:キー)を設定し、ペアで格納する方式です。Keyには、一意となるユニークな値を指定します。Valueには、値や文字列を指定できます。

DataStore には、スクリプトを介してのみアクセスできます。ローカルスクリプトでアクセスすると、エラーが発生します。

DataStore のサービスを使うためには、DataStoreServiceを利用します。

local DataStoreService = game:GetService("DataStoreService")

DataStore を利用するデータベースの名前を決めます。ここでは、”GameData” としました。

local dataStore = DataStoreService:GetDataStore("GameData")

データをセーブする

データをセーブするには、dataStore:SetAsync(datakey, data)を使います。保存したい値と対応するキーを設定し、両者をセットでストレージなどに書き込みます。既存のキーを指定して書き込むと新たな値で上書きされます。

datakey には、一意となるユニークな値を指定します。コードの例では、datakey をユニークな値にするため、プレイヤーのユーザIDを指定し、プレフィックスとして”-win”を付けています。

data には、datakey の対となる値を指定します。コードの例では、プレイヤーの勝利数の値を指定しています。

-- データをセーブする
local function savePlayerData(player)

	local datakey = player.userId.."-win"
	local data = player.leaderstats["勝利数"].Value

	repeat
		local success, errormessage = pcall(function()                
			dataStore:SetAsync(datakey, data)
		end)

	until (success)
end

DataStoreにアクセスするSetAsync()は、失敗する場合があるネットワーク呼び出しです。上記のように、これらの呼び出しをpcall()でラップして、エラーをキャッチして処理してください。

データを読み出す

データをセーブするには、dataStore:GetAsync(datakey)を使います。キーを指定すると対応する値を取り出すことができます。

datakey を指定すると、datakey に対応した値が取れます。

	local winValue
	repeat
		local success, errorMessage = pcall(function()
			winValue = dataStore:GetAsync(datakey)
		end)
		wait(1)
	until(success)

DataStoreにアクセスするGetAsync() は、失敗する場合があるネットワーク呼び出しです。上記のように、これらの呼び出しをpcall()でラップして、エラーをキャッチして処理してください。

GetAsync() はデータを 4 秒間キャッシュするため、返される値が Roblox サーバーに保存されているものであるとは限りません。

実装する

スクリプトをServerScriptService に置きしました。ServerScriptService に置かれたスクリプトは、プレイヤーがログインすると読み込まれます。

local Players = game:GetService("Players")

local DataStoreService = game:GetService("DataStoreService")
local dataStore = DataStoreService:GetDataStore("GameData")

-- プレイヤーの設定
local function onPlayerJoin(player)

	local leaderstats = Instance.new("Folder")
	leaderstats.Name = "leaderstats"
	leaderstats.Parent = player

	local datakey = player.userId.."-win"

	local winValue
	repeat
		local success, errorMessage = pcall(function()
			winValue = dataStore:GetAsync(datakey)
		end)
		wait(1)
	until(success)

	local winCnt = Instance.new('IntValue')
	winCnt.Name = "勝利数"
	winCnt.Value = winValue
	winCnt.Parent = leaderstats
end

-- データをセーブする
local function savePlayerData(player)

	local datakey = player.userId.."-win"
	local data = player.leaderstats["勝利数"].Value

	repeat
		local success, errormessage = pcall(function()                
			dataStore:SetAsync(datakey, data)
		end)

	until (success)
end

Players.PlayerAdded:Connect(onPlayerJoin) -- プレイヤーがゲームに参加した時に呼ばれます
Players.PlayerRemoving:Connect(savePlayerData) -- プレイヤーがゲームから離れた時に呼ばれます

コメント

タイトルとURLをコピーしました