ゲーム内設定をゲームレコードに保存する
注釈:本資料はAI技術を用いて翻訳されています。
概要
Cloud Save サービスを使用すると、ゲームのユースケースに応じて、ゲームデータを JSON 形式で保存できます。保存したゲームレコードはタイトル全体で共有され、すべてのプレイヤーが取得でき、場合によっては編集も可能です。例えば、以下のようなデータを保存できます:
- ゲームのシーズン UI テーマ設定
- ゲームイベントやニュース情報
- クラン、エリア、マップなど、プレイヤー間で共有されるゲームデータ
このガイドでは、ゲームレコードを利用してゲームデータを保存し、ゲームクライアント内で表示し、ユースケースに応じて変更する方法を学びます。
目標
- ゲームレコードの概要を理解する
- ゲームレコードにゲームデータを保存する方法を理解する
- ゲームレコードを表示する方法を理解する
- ゲームレコードを変更する方法を理解する
- ゲームレコードを削除する方法を理解する
- AccelByte SDK を使用してゲームレコードを活用する方法を学ぶ
前提条件
以下へのアクセスが必要です:
- Admin Portal
- AccelByte Unreal または Unity SDK(以下の認証情報を含む):
- Client ID
- Client Secret
- AccelByte Cloud Save API ドキュメント
新しいゲームレコードにデータを保存する
Admin Portal 経由で新しいゲームレコードにデータを保存する
Admin Portal 経由でゲームレコードを作成する方法は、ゲームクライアント側で変更する必要がなく、取得するだけのデータを保存する場合に適しています。例えば、シーズンの UI テーマ設定やイベント/ニュース情報などです。
ゲームレコードを作成するには、以下の手順に従ってください:
-
Admin Portal のサイドバーで、Progression & Inventory > Cloud Save メニューに移動し、Game Records を選択します。
-
Cloud Save ページで、Game Records タブを開き、Create Game Record ボタンをクリックします。Add Record フォームが表示されます。
-
必要な情報を入力します:

- 適切な形式で Game Record Key を入力します。このキーはレコードのタイトルとして使用でき、後で SDK からレコードを取得する際の識別子にもなります。
- Write Permission セクションを設定すると、ゲームサーバーまたはゲームクライアントのみがレコードを更新できるように、追加の検証を加えることもできます。利用可能なオプションの一覧については、Write Permission を参照してください。
- JSON 形式で保存したいデータを追加します。
-
Add をクリックします。新しいレコードがレコードリストに追加されます。
SDK を使用して新しいゲームレコードにデータを保存する
この方法は、ゲームクライアントで何らかのアクションが実行された後に動的に作成するゲームレコードが必要な場合に適しています。例えば、カスタマイズ可能な公開マップデータを保存する場合などです。以下の関数を使用して新しいゲームレコードを作成し、データを保存します。
クライアント経由でゲームレコードを作成する
- Unreal
- Unity
FApiClientPtr ApiClient = AccelByteOnlineSubsystemPtr->GetApiClient();
FString Key = FString("map-data");
TSharedPtr<FJsonObject> RecordRequest = MakeShareable(new FJsonObject);
RecordRequest->SetStringField(FString("npc1"), FString("X=125;Y=256;Z=125"));
RecordRequest->SetStringField(FString("npc2"), FString("X=115,Y=225,Z=120"));
ApiClient->CloudSave.SaveGameRecord(Key
, *RecordRequest
, FVoidHandler::CreateLambda([]()
{
// Do something if SaveGameRecord succeeds
})
, FErrorHandler::CreateLambda([](int32 ErrorCode, const FString& ErrorMessage)
{
// Do something if SaveGameRecord fails
}));
CloudSave cloudSave = AccelByteSDK.GetClientRegistry().GetApi().GetCloudSave();
string key = "map-data";
Dictionary<string, object> recordRequest = new Dictionary<string, object>
{
{"NPC1", "x:125,y:256,z:125"},
{"NPC2", "x:115,y:225,z:120"}
};
cloudSave.SaveGameRecord(key, recordRequest, result =>
{
if (result.IsError)
{
// Do something if SaveGameRecord fails
Debug.Log($"Error SaveGameRecord, Error Code: {result.Error.Code} Error Message: {result.Error.Message}");
return;
}
// Do something if SaveGameRecord succeeds
});
サーバー経由でゲームレコードを作成する
- Unreal
- Unity
FServerApiClientPtr ServerApiClient = AccelByteOnlineSubsystemPtr->GetServerApiClient();
FString Key = FString("map-data");
TSharedPtr<FJsonObject> RecordRequest = MakeShareable(new FJsonObject);
RecordRequest->SetStringField(FString("npc1"), FString("X=125;Y=256;Z=125"));
RecordRequest->SetStringField(FString("npc2"), FString("X=115,Y=225,Z=120"));
ServerApiClient->ServerCloudSave.SaveGameRecord(Key
, *RecordRequest
, FVoidHandler::CreateLambda([]()
{
// Do something if SaveGameRecord succeeds
})
, FErrorHandler::CreateLambda([](int32 ErrorCode, const FString& ErrorMessage)
{
// Do something if SaveGameRecord fails
}));
ServerCloudSave serverCloudSave = AccelByteSDK.GetServerRegistry().GetApi().GetCloudSave();
string key = "map-data";
Dictionary<string, object> recordRequest = new Dictionary<string, object>
{
{"NPC1", "x:125,y:256,z:125"},
{"NPC2", "x:115,y:225,z:120"}
};
var optionalParams = new GameRecordMetadataOptionalParams()
{
SetBy = RecordSetBy.CLIENT
};
serverCloudSave.SaveGameRecord(key, recordRequest, optionalParams, result =>
{
if (result.IsError)
{
// Do something if SaveGameRecord fails
Debug.Log($"Error SaveGameRecord, Error Code: {result.Error.Code} Error Message: {result.Error.Message}");
return;
}
// Do something if SaveGameRecord succeeds
});
サーバー経由で一時的なゲームレコードを作成する
- Unreal
- Unity
FServerApiClientPtr ServerApiClient = AccelByteOnlineSubsystemPtr->GetServerApiClient();
FString Key = FString("map-data");
TSharedPtr<FJsonObject> RecordRequest = MakeShareable(new FJsonObject);
RecordRequest->SetStringField(FString("npc1"), FString("X=125;Y=256;Z=125"));
RecordRequest->SetStringField(FString("npc2"), FString("X=115,Y=225,Z=120"));
FTTLConfig TTLConfig{};
TTLConfig.Action = EAccelByteTTLConfigAction::DELETE_RECORD;
TTLConfig.Expires_At = FDateTime::UtcNow() + FTimespan(0, 0, 5); // Will delete this record in the next five seconds
ServerApiClient->ServerCloudSave.SaveGameRecord(Key
, *RecordRequest
, FVoidHandler::CreateLambda([]()
{
// Do something if SaveGameRecord succeeds
})
, FErrorHandler::CreateLambda([](int32 ErrorCode, const FString& ErrorMessage)
{
// Do something if SaveGameRecord fails
})
, TTLConfig);
ServerCloudSave serverCloudSave = AccelByteSDK.GetServerRegistry().GetApi().GetCloudSave();
string key = "map-data";
Dictionary<string, object> recordRequest = new Dictionary<string, object>
{
{"NPC1", "x:125,y:256,z:125"},
{"NPC2", "x:115,y:225,z:120"}
};
var ttlConfig = new TTLConfig()
{
Action = TTLConfigAction.Delete,
ExpiresAt = DateTime.Now.AddSeconds(5) // Will delete this record in the next five sceonds
};
var optionalParams = new GameRecordMetadataOptionalParams()
{
SetBy = RecordSetBy.CLIENT,
TTLConfig = ttlConfig
};
serverCloudSave.SaveGameRecord(key, recordRequest, optionalParams, result =>
{
if (result.IsError)
{
// Do something if SaveGameRecord fails
Debug.Log($"Error SaveGameRecord, Error Code: {result.Error.Code} Error Message: {result.Error.Message}");
return;
}
// Do something if SaveGameRecord succeeds
});
サーバー経由でゲームレコードの有効期限設定を削除する
- Unreal
- Unity
FServerApiClientPtr ServerApiClient = AccelByteOnlineSubsystemPtr->GetServerApiClient();
FString Key = FString("map-data");
ServerApiClient->ServerCloudSave.DeleteGameRecordTTLConfig(Key, FVoidHandler::CreateLambda([]()
{
// Do something if DeleteGameRecordTTLConfig was successful
}), FErrorHandler::CreateLambda([](int32 ErrorCode, const FString& ErrorMessage)
{
// Do something if DeleteGameRecordTTLConfig fails
}));
ServerCloudSave serverCloudSave = AccelByteSDK.GetServerRegistry().GetApi().GetCloudSave();
string key = "map-data";
serverCloudSave.DeleteGameRecordTTLConfig(key, result =>
{
if (result.IsError)
{
// Do something if DeleteGameRecordTTLConfig fails
Debug.Log($"Error DeleteGameRecordTTLConfig, Error Code: {result.Error.Code} Error Message: {result.Error.Message}");
return;
}
// Do something if DeleteGameRecordTTLConfig succeeds
});
ゲームレコードデータを表示する
Admin Portal またはゲームクライアントから保存・作成されたゲームレコードは、すべてのプレイヤーが取得できます。取得したデータは、ゲームのさまざまなユースケースに活用できます。例えば、シーズンテーマの UI を切り替えたり、更新されたニュースやイベントを表示したりできます。
以下の関数を使用してゲームレコードを取得できます:
クライアント経由でゲームレコードを取得する
- Unreal
- Unity
FApiClientPtr ApiClient = AccelByteOnlineSubsystemPtr->GetApiClient();
FString Key = FString("inGameNews");
ApiClient->CloudSave.GetGameRecord(Key
, THandler<FAccelByteModelsGameRecord>::CreateLambda([](const FAccelByteModelsGameRecord& Result)
{
// Do something if GetGameRecord succeeds
})
, FErrorHandler::CreateLambda([](int32 ErrorCode, const FString& ErrorMessage)
{
// Do something if GetGameRecord fails
}));
CloudSave cloudSave = AccelByteSDK.GetClientRegistry().GetApi().GetCloudSave();
string key = "inGameNews";
cloudSave.GetGameRecord(key, result =>
{
if (result.IsError)
{
// Do something if GetGameRecord fails
Debug.Log($"Error GetGameRecord, Error Code: {result.Error.Code} Error Message: {result.Error.Message}");
return;
}
// Do something if GetGameRecord succeeds
});
サーバー経由でゲームレコードを取得する
- Unreal
- Unity
FServerApiClientPtr ServerApiClient = AccelByteOnlineSubsystemPtr->GetServerApiClient();
FString Key = FString("inGameNews");
ServerApiClient->ServerCloudSave.GetGameRecord(Key
, THandler<FAccelByteModelsGameRecord>::CreateLambda([](const FAccelByteModelsGameRecord& Result)
{
// Do something if GetGameRecord succeeds
})
, FErrorHandler::CreateLambda([](int32 ErrorCode, const FString& ErrorMessage)
{
// Do something if GetGameRecord fails
}));
ServerCloudSave serverCloudSave = AccelByteSDK.GetServerRegistry().GetApi().GetCloudSave();
string key = "inGameNews";
serverCloudSave.GetGameRecords(key, result =>
{
if (result.IsError)
{
// Do something if DeleteUserRecord fails
Debug.Log($"Error DeleteUserRecord, Error Code: {result.Error.Code} Error Message: {result.Error.Message}");
return;
}
// Do something if DeleteUserRecord succeeds
});
ゲームレコードデータを変更する
Admin Portal 経由でゲームレコードを変更する
Admin Portal からゲームレコードを変更する方法は、データを調整するために手動で操作したい場合に適しています。例えば、データの修正や監査などです。ゲームレコードを更新するには、以下の手順に従ってください:
-
Admin Portal のサイドバーで、Progression & Inventory > Cloud Save > Game Records に移動します。
-
Game Records ページで、レコードタイプに応じて、JSON または Binary タブを開きます。リストから、更新したいレコードを見つけて表示します。
-
レコードの詳細ページで、フィールドまたはセクションの鉛筆または編集アイコンをクリックして、コンテンツを更新します。

-
変更を保存します。

SDK を使用してゲームレコードを変更する
この方法は、ゲームがゲームクライアントからゲームレコードデータを更新する必要がある場合に適しています。保存済みのデータは、以下の関数を使用して新しいデータに置き換えられます:
クライアント経由でゲームレコードを変更する
- Unreal
- Unity
FApiClientPtr ApiClient = AccelByteOnlineSubsystemPtr->GetApiClient();
FString Key = "map-data";
TSharedPtr<FJsonObject> RecordRequest = MakeShareable(new FJsonObject);
RecordRequest->SetStringField(FString("npc1"), FString("X=100;Y=256;Z=125"));
RecordRequest->SetStringField(FString("npc2"), FString("X=100,Y=225,Z=120"));
ApiClient->CloudSave.ReplaceGameRecord(Key
, *RecordRequest
, FVoidHandler::CreateLambda([]()
{
// Do something if ReplaceGameRecord succeeds
})
, FErrorHandler::CreateLambda([](int32 ErrorCode, FString ErrorMessage)
{
// Do something if ReplaceGameRecord fails
}));
CloudSave cloudSave = AccelByteSDK.GetClientRegistry().GetApi().GetCloudSave();
string key = "map-data";
Dictionary<string, object> recordRequest = new Dictionary<string, object>
{
{"NPC1", "x:100,y:256,z:125"},
{"NPC2", "x:100,y:225,z:120"}
};
cloudSave.ReplaceGameRecord(key, recordRequest, result =>
{
if (result.IsError)
{
// Do something if ReplaceGameRecord fails
Debug.Log($"Error ReplaceGameRecord, Error Code: {result.Error.Code} Error Message: {result.Error.Message}");
return;
}
// Do something if ReplaceGameRecord succeeds
});
サーバー経由でゲームレコードを変更する
- Unreal
- Unity
FServerApiClientPtr ServerApiClient = AccelByteOnlineSubsystemPtr->GetServerApiClient();
FString Key = "map-data";
TSharedPtr<FJsonObject> RecordRequest = MakeShareable(new FJsonObject);
RecordRequest->SetStringField(FString("npc1"), FString("X=100;Y=256;Z=125"));
RecordRequest->SetStringField(FString("npc2"), FString("X=100,Y=225,Z=120"));
ServerApiClient->ServerCloudSave.ReplaceGameRecord(Key
, *RecordRequest
, FVoidHandler::CreateLambda([]()
{
// Do something if ReplaceGameRecord succeeds
})
, FErrorHandler::CreateLambda([](int32 ErrorCode, FString ErrorMessage)
{
// Do something if ReplaceGameRecord fails
}));
ServerCloudSave serverCloudSave = AccelByteSDK.GetServerRegistry().GetApi().GetCloudSave();
string key = "map-data";
Dictionary<string, object> recordRequest = new Dictionary<string, object>
{
{"NPC1", "x:100,y:256,z:125"},
{"NPC2", "x:100,y:225,z:120"}
};
var optionalParams = new GameRecordMetadataOptionalParams()
{
SetBy = RecordSetBy.CLIENT
};
serverCloudSave.ReplaceGameRecord(key, recordRequest, optionalParams, result =>
{
if (result.IsError)
{
// Do something if ReplaceGameRecord fails
Debug.Log($"Error ReplaceGameRecord, Error Code: {result.Error.Code} Error Message: {result.Error.Message}");
return;
}
// Do something if ReplaceGameRecord succeeds
});
サーバー経由でゲームレコードを一時的なものに変更する
- Unreal
- Unity
FServerApiClientPtr ServerApiClient = AccelByteOnlineSubsystemPtr->GetServerApiClient();
FString Key = "map-data";
TSharedPtr<FJsonObject> RecordRequest = MakeShareable(new FJsonObject);
RecordRequest->SetStringField(FString("npc1"), FString("X=100;Y=256;Z=125"));
RecordRequest->SetStringField(FString("npc2"), FString("X=100,Y=225,Z=120"));
FTTLConfig TTLConfig{};
TTLConfig.Action = EAccelByteTTLConfigAction::DELETE_RECORD;
TTLConfig.Expires_At = FDateTime::UtcNow() + FTimespan(0, 0, 5); // Will delete this record in the next five seconds
ServerApiClient->ServerCloudSave.ReplaceGameRecord(Key
, *RecordRequest
, FVoidHandler::CreateLambda([]()
{
// Do something if ReplaceGameRecord succeeds
})
, FErrorHandler::CreateLambda([](int32 ErrorCode, FString ErrorMessage)
{
// Do something if ReplaceGameRecord fails
})
, TTLConfig);
ServerCloudSave serverCloudSave = AccelByteSDK.GetServerRegistry().GetApi().GetCloudSave();
string key = "map-data";
Dictionary<string, object> recordRequest = new Dictionary<string, object>
{
{"NPC1", "x:100,y:256,z:125"},
{"NPC2", "x:100,y:225,z:120"}
};
var ttlConfig = new TTLConfig()
{
Action = TTLConfigAction.Delete,
ExpiresAt = DateTime.Now.AddSeconds(5) // Will delete this record in the next five sceonds
};
var optionalParams = new GameRecordMetadataOptionalParams()
{
SetBy = RecordSetBy.CLIENT,
TTLConfig = ttlConfig
};
serverCloudSave.ReplaceGameRecord(key, recordRequest, optionalParams, result =>
{
if (result.IsError)
{
// Do something if ReplaceGameRecord fails
Debug.Log($"Error ReplaceGameRecord, Error Code: {result.Error.Code} Error Message: {result.Error.Message}");
return;
}
// Do something if ReplaceGameRecord succeeds
});
ゲームレコードデータを削除する
Admin Portal 経由でゲームレコードを削除する
ゲームレコードを削除するには、以下の手順に従ってください:
-
Admin Portal のサイドバーで、Progression & Inventory > Cloud Save > Game Records に移動します。
-
Game Records ページで、レコードタイプに応じて、JSON または Binary タブを開きます。リストから、削除したいレコードを見つけて、Action メニューの下にある Delete ボタンをクリックします。
-
確認メッセージで Delete をクリックします。
SDK 経由でゲームレコードを削除する
ゲームが SDK 側からゲームレコードを削除する必要がある場合は、以下の関数を使用して削除できます。
クライアント経由でゲームレコードを削除する
- Unreal
- Unity
FApiClientPtr ApiClient = AccelByteOnlineSubsystemPtr->GetApiClient();
FString Key = FString("map-data");
ApiClient->CloudSave.DeleteGameRecord(Key
, FVoidHandler::CreateLambda([]()
{
// Do something if DeleteGameRecord succeeds
})
, FErrorHandler::CreateLambda([](int32 ErrorCode, const FString& ErrorMessage)
{
// Do something if DeleteGameRecord fails
}));
CloudSave cloudSave = AccelByteSDK.GetClientRegistry().GetApi().GetCloudSave();
string key = "map-data";
cloudSave.DeleteGameRecord(key, result =>
{
if (result.IsError)
{
// Do something if DeleteGameRecord fails
Debug.Log($"Error DeleteGameRecord, Error Code: {result.Error.Code} Error Message: {result.Error.Message}");
}
// Do something if DeleteGameRecord succeeds
});
サーバー経由でゲームレコードを削除する
- Unreal
- Unity
FServerApiClientPtr ServerApiClient = AccelByteOnlineSubsystemPtr->GetServerApiClient();
FString Key = FString("map-data");
ServerApiClient->ServerCloudSave.DeleteGameRecord(Key
, FVoidHandler::CreateLambda([]()
{
// Do something if DeleteGameRecord succeeds
})
, FErrorHandler::CreateLambda([](int32 ErrorCode, const FString& ErrorMessage)
{
// Do something if DeleteGameRecord fails
}));
ServerCloudSave serverCloudSave = AccelByteSDK.GetServerRegistry().GetApi().GetCloudSave();
string key = "map-data";
serverCloudSave.DeleteGameRecord(key, result =>
{
if (result.IsError)
{
// Do something if DeleteGameRecord fails
Debug.Log($"Error DeleteGameRecord, Error Code: {result.Error.Code} Error Message: {result.Error.Message}");
return;
}
// Do something if DeleteGameRecord succeeds
});