Robloxでプレイヤーデータをセーブするには

ロブロックスの仕様

Robloxではデフォルトでユーザーのセーブ機能を搭載していないため、ゲームを一度出てしまうと再度入ってきたときにははじめからのプレイになってしまう

そこでゲーム内マネーやステージ進捗などゲームを再開したときに保持しておきたいデータがある場合は、プレイヤーデータを保存するための機能を実装する必要がある

Data Store

RobloxではDataStoreを作成し、そこにプレイヤーデータを保存することでゲームから抜けてもデータを失わないようにすることができる

Data Store : データを永続的に保存する機能や、主体のこと

事前準備

RobloxStudioではデフォルトでDataStoreにアクセスできない。そのため、まずはアクセスできるように設定を変更する必要がある

Homeタブを選択し、GameSettingsを選択する

表示された設定画面のSecurity項目を選択肢、Enable Studio Access to API Servicesを有効にする

有効になったらSaveを押下して設定を保存する

Data Storeの作成

DataStoreはユニークな名前で識別される。今回は PlayerGold というDataStoreを作成し、そこにプレイヤーの所持金を保存する。

  1. スクリプトの作成

ServerScriptService配下にスクリプトを作成し、GoldManagerに名前を変更する

2. DataStoreを利用するためのサービスクラスDataStoreServiceを取得する

local DataStoreService = game:GetService("DataStoreService")

3. DataStoreService:GetDataStoreを呼び出すことでDataStoreを取得する。このとき引数にPlayerGoldを指定する。この時点でPlayerGoldのDataStoreがある場合はそれを返し、ない場合は新しく生成して返される。

local goldStore = DataStoreService:GetDataStore("PlayerGold")

データを保存する

DataStoreにデータを保存する場合、辞書形式で保存する必要がある。また、それぞれのデータはユニークなキーで保存する必要がある。例えばユーザー関連のデータを保存する場合は、ユーザーidをキーにし、ゲーム全体に関するデータの場合(イベント時など)はその名前の文字列を利用するとよいだろう。

プレイヤーデータの保存例

キー
3125060830
35167597945
50530609260

ゲーム全体に関するデータの保存例

キー
ActiveSpecialEventSummerParty2
ActivePromoCodeBONUS123
CanAccessPartyPlacetrue
  1. 仮のプレイヤーidと所持金を用意する

※注意! このコードは手元の動作環境にのみ使用し、そのまま自分のゲームでは使用してはいけない、今回はセーブの流れをシンプルに説明するため、プレイヤーのidを固定で指定している。プレイヤーごとに保存する方法は後述。

local playerUserID = 5050306092
local playerGold = 250

2. PlayerGoldを保存するためにSetAsync関数をprotected callで呼び出す。そのときに手前で作成したユーザidと所持金額を受け渡す。

local setSuccess, errorMessage = pcall(function()
	goldStore:SetAsync(playerUserID, playerGold)
end)

if not setSuccess then
	warn(errorMessage)
end

呼び出し時の注意点

上記のようなデータ保存のリクエストを頻繁に呼び出しては行けない。DataStoreに対するデータ保存リクエストはキューに確保され実行されるが、頻繁な呼び出しによりそのキューが満杯になってしまった場合、追加の保存リクエストは破棄されてしまう。

よくあるミスとしてはステージに落ちているアイテムを拾い集めるゲームなどで、アイテムを拾うたびに保存リクエストを送ってしまった結果キューが満杯になってしまい、データが保存できていなかった場合などがある。セーブのタイミングはゲームの開始、終了などの区切りや数十秒間隔のオートセーブ等で行うのが良いだろう。

データを読み込む

DataStoreからデータを読み込むために、GetAsyncを呼び出す。このときデータを保存するときに指定したユーザーidを指定する

local getSuccess, currentGold = pcall(function()
	return goldStore:GetAsync(playerUserID)
end)
if getSuccess then
	print(currentGold)
end

出力

250

コメント付きコード全文

-- DataStoreを利用するためのサービスクラスを取得
local DataStoreService = game:GetService("DataStoreService")
-- PlayerGoldという名前のDataStoreを取得/生成する
local goldStore = DataStoreService:GetDataStore("PlayerGold")

-- 仮のユーザidと所持金を定義する
local playerUserID = 5050306092
local playerGold = 250

-- データの保存
local setSuccess, errorMessage = pcall(function()
	goldStore:SetAsync(playerUserID, playerGold)
end)

-- データの保存の結果、エラーが有った場合、エラーメッセージを表示する
if not setSuccess then
	warn(errorMessage)
end

-- データの取得
local getSuccess, currentGold = pcall(function()
	return goldStore:GetAsync(playerUserID)
end)

-- データの取得が成功した場合、その値を出力する
if getSuccess then
	print(currentGold)
end

最後に

前述したとおり、この記事はデータのセーブ/ロードの方法をシンプルに説明するため、プレイヤーごとのデータのセーブ/ロードには対応していない。プレイヤーごとにデータの保存わけをしたい場合は以下の記事を参照すると良い