ゲームは、プレイヤーのレベル、経験ポイント、マネー、在庫アイテム、場所など、セッション間で永続的なデータを保存する必要があることが多いです。
このチュートリアルでは、基本の データストア を作成し、プレイヤーデータを保存し、ゲームセッションにデータを再読み込む方法を示します。
スタジオアクセスを有効にする
デフォルトでは、Studio でテストされたゲームはデータストアにアクセスできませんので、最初に有効にする必要があります:
ファイル と ゲーム設定 を選択します。
[セキュリティ] セクション で、 スタジオアクセスをAPIサービスに有効にする をオンにし、 保存 をクリックします。
データストアを作成する
データストアには、ユニークな 名 が必要です。この例では、各プレイヤーのゴールドを永続的なストレージに保存するデータストア PlayerGold を作成します:
Create a Script 内の ServerScriptService が呼ばれた GoldManager を作成します。
データストアは DataStoreService によって管理されているので、サービスを取得します:
local DataStoreService = game:GetService("DataStoreService")ストリング DataStoreService:GetDataStore() を使って呼び出す "PlayerGold" .このメソッドは、既に存在する場合 PlayerGold データストアにアクセスします。それが存在しない場合、メソッドは新しいデータストアを作成し、名前を PlayerGold とします。
local DataStoreService = game:GetService("DataStoreService")local goldStore = DataStoreService:GetDataStore("PlayerGold")
保存データ
データストアは、Luau テーブルのように、本質的には辞書です。データストアの各値は、ユニークな キー によってインデックス化され、プレイヤーのユニークな UserId またはゲームプロモーションの名前付きストリングである可能性があります。
Key | Value |
---|---|
31250608 | 50 |
351675979 | 20 |
505306092 | 78000 |
データストアにプレイヤーデータを保存するには:
データストアのキーに名前を付けた変数 playerUserID を作成し、次に playerGold を使用してプレイヤーの開始ゴールド量を保存する
local DataStoreService = game:GetService("DataStoreService")local goldStore = DataStoreService:GetDataStore("PlayerGold")-- データストアのキーと値local playerUserID = 505306092local playerGold = 250データを PlayerGold データストアに保存するには、以前に作成したキーと値変数をパスして、保護された呼び出し内で SetAsync を呼び出します。
local DataStoreService = game:GetService("DataStoreService")local goldStore = DataStoreService:GetDataStore("PlayerGold")-- データストアのキーと値local playerUserID = 505306092local playerGold = 250-- データストアキーを設定local success, error = pcall(function()goldStore:SetAsync(playerUserID, playerGold)end)if not success thenwarn(error)end
SetAsync() のような機能は、時折失敗するネットワーク呼び出しです。上記のように、pcall() は、このような失敗が発生したときに検出して処理するために使用されます。
最も基本的な形では、pcall() は機能を受け入れ、2つの値を返します:
- 状態は、エラーなしで機能が実行された場合は true 、そうでない場合は false。
- 関数またはエラーメッセージの返却値。
上のサンプルは、ライン 13 でステータスをチェックします。如果 SetAsync() が何らかの理由で失敗すると、サンプルは 出力 ウィンドウにエラーを表示します。
データを読み込む
データストアからデータを読み込むには、必要なキー名で GetAsync() を呼び出します。
local DataStoreService = game:GetService("DataStoreService")
local goldStore = DataStoreService:GetDataStore("PlayerGold")
-- データストアのキーと値
local playerUserID = 505306092
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
スクリプトをテストするには、 実行 をクリックし、currentGold 値が 出力 ウィンドウに印刷されることに注意してください。注: 機能がデータストアサーバーに接続する必要があるため、数秒かかる可能性があります。
自動的に読み込み、保存
前のスクリプトは機能しますが、根本的な問題があります: playerUserID と playerGold にハードコードされた値が含まれているため、異なる量のゴールドを持つ複数のプレイヤーをサポートしません。より現実的な解決策は、プレイヤーがエクスペリエンスに接続したときにゴールド値を読み、プレイヤーが退出したときに保存します。このアプローチは、データストア呼び出しを イベント から Players へ接続することを意味します。
local DataStoreService = game:GetService("DataStoreService")
local Players = game:GetService("Players")
local goldStore = DataStoreService:GetDataStore("PlayerGold")
-- 各プレイヤーにゴールド値をローカルテーブルに追加して、データにヒットしないようにする
-- 繰り返し保存。
local playerGold = {}
local function incrementGold(player, amount)
playerGold[player.UserId] += amount
end
local function onPlayerAdded(player)
-- データストアのキーを読み取る
local success, storedGold = pcall(function()
return goldStore:GetAsync(player.UserId)
end)
if success then
local currentGold
if storedGold then
currentGold = storedGold
else
currentGold = 0
end
playerGold[player.UserId] = currentGold
print(currentGold)
end
-- テストで増加ゴールドを
incrementGold(player, 5)
end
local function onPlayerRemoving(player)
-- データストアキーを設定
local success, err = pcall(function()
goldStore:SetAsync(player.UserId, playerGold[player.UserId])
end)
if not success then
warn(err)
end
-- エントリをクリーンアップして、サーバーの寿命でテーブルが拡大しないようにする
playerGold[player.UserId] = nil
end
Players.PlayerAdded:Connect(onPlayerAdded)
Players.PlayerRemoving:Connect(onPlayerRemoving)
キャラクターの位置を読み込み保存する
プレイヤーの位置を保存するには、Character ではなく Player で作業しますが、原則は同じです。今回は、ServerScriptService 内で Script を作成し、呼び出される 位置管理者 :
local Players = game:GetService("Players")
local DataStoreService = game:GetService("DataStoreService")
local Workspace = game:GetService("Workspace")
local playerPositionStore = DataStoreService:GetDataStore("PlayerPositionStore")
local function positionHandler(player)
-- キャラクター追加で位置を読み込む
player.CharacterAdded:Connect(function(character)
local success, coords = pcall(function()
return playerPositionStore:GetAsync(player.UserId)
end)
local position = Vector3.new(coords[1], coords[2], coords[3])
if success and position then
character:PivotTo(CFrame.new(position))
print("Loaded player position!")
else
warn("Failed to load position for player " .. player.Name .. ". Placing in default position.")
end
-- 死亡時にプレイヤーのリスポーンを処理する
local humanoid = character:FindFirstChildOfClass("Humanoid")
humanoid.Died:Connect(function()
local spawnLocation = Workspace:FindFirstChild("SpawnLocation")
character:PivotTo(spawnLocation.CFrame)
end)
end)
-- キャラクター削除時の位置保存
player.CharacterRemoving:Connect(function(character)
local position = character:GetPivot().Position
local success, err = pcall(function()
playerPositionStore:SetAsync(player.UserId, {position.X, position.Y, position.Z})
print("Saved player position!")
end)
if not success then
warn("Failed to save position for player " .. player.Name .. ": " .. err)
end
end)
end
Players.PlayerAdded:Connect(positionHandler)
このスクリプトは、新しいデータストアを追加します、playerPositionStore。データストアはオブジェクトではなく基本タイプのみを保存するため、X、Y、および Z の座標を単一の Vector3 または CFrame 値ではなく個別の数字として保存する必要があります。エクスペリエンスをテストするとき、キャラクターを移動します。次回、エクスペリエンスをテストするときに、キャラクターが同じ位置に戻る方法を観察してください
サンプルプロジェクト
基本的なデータストア使用を理解したので、ゴールドラッシュ サンプルゲームでテストしてください。Studio でゲームを編集し、UI の一部としてゴールドを表示し、自動保存を含む拡張 GoldManager スクリプトを探索できます。