Storing in-game configurations in game records
概要
クラウドセーブサービスでは、ゲームデータを、ゲームのユースケースに合わせて、JSON 形式で保存できます。保存されたゲームレコードはグローバルタイトルでの使用に向けたものであり、プレイヤーによるアクセスが可能で、場合によっては編集も可能です。たとえば、次のようなデータを保存します。
- ゲームの季節的な UI テーマ設定
- ゲームのイベントやニュースの情報
- プレイヤー全体のゲームデータ(例:クランのエリアやマップ)など
このガイドでは、ゲームレコードを活用してゲームデータを保存し、それをゲームクライアント内で表示し、ゲームのユースケースに従って変更する方法を説明します。
目標
- ゲームレコードについての説明と概要を提供する。
- ゲームレコードにゲームデータを保存する方法を説明する。
- ゲームレコードを表示する方法を説明する。
- ゲームレコードを変更する方法を説明する。
- ゲームレコードを削除する方法を説明する。
- AccelByte SDK を使用してゲームレコードを活用する方法を説明する。
前提条件
以下へのアクセスが必要になります。
- 管理者ポータル
- AccelByte UnrealまたはUnity SDK (次の権限を含む)
- クライアント ID
- クライアントの秘密
- AccelByte クラウドセーブ API ドキュメント
新しいゲームレコードへのデータの保存
管理者ポータルを介した新しいゲームレコードへのデータの保存
管理者ポータルを介したゲームレコードの作成は、ゲームクライアントが変更する必要がなく、ゲームクライアントにしか取得できないデータを保存したい場合に適しています。たとえば、季節的な UI テーマ設定、イベントやニュースの情報などです。
ゲームレコードを作成するには、以下の手順に従います。
管理者ポータルの[Game Management (ゲーム管理)]セクションで、[Cloud Save (クラウドセーブ)]メニューに移動し、[Game Records (ゲームレコード)]を選択します。
[Cloud Save (クラウドセーブ)]ページで、[Create Game Record (ゲームレコードを作成)]ボタンをクリックします。
[Add Record (レコードを追加)]フォームが表示されます。必須フィールドに入力してください。
- 適切な形式で[Game Record Key (ゲームレコードキー)]を入力します。これはレコードのタイトルとして使用でき、また、後で SDK からレコードを取得するための識別子として利用可能です。
- [Write Permission (書き込み権限)]セクションで選択することにより、別途検証を追加して、確実にゲームサーバーだけが、またはゲームクライアントがレコードを更新できるようにすることも可能です。利用可能なオプションの一覧については、書き込み権限 を参照してください。
- 保存したいデータを JSON 形式で、[JSON Configuration (JSON 設定)]に入力します。
完了後、[Add (追加)]ボタンをクリックすると、新しいレコードがリストに追加されます。
SDK を使用した新しいゲームレコードへのデータの保存
この方法が適しているのは、ゲームクライアントからアクションがトリガーされた後に動的に作成されるゲームレコードが必要な場合です。例として、カスタマイズ可能な公開マップのデータの保存が挙げられます。次の関数を使用して新しいゲームレコードを作成して、データを保存します。
クライアントを介したゲームレコードの作成
- Unreal
- Unity
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"));
FMultiRegistry::GetApiClient()->CloudSave.SaveGameRecord(Key, *RecordRequest, FVoidHandler::CreateLambda([]()
{
// Do something if SaveGameRecord has been successful
}), FErrorHandler::CreateLambda([](int32 ErrorCode, const FString& ErrorMessage)
{
// Do something if SaveGameRecord has an error
UE_LOG(LogTemp, Log, TEXT("Error SaveGameRecord, Error Code: %d Error Message: %s"), ErrorCode, *ErrorMessage);
}));
CloudSave cloudSave = MultiRegistry.GetApiClient().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 an error
Debug.Log($"Error SaveGameRecord, Error Code: {result.Error.Code} Error Message: {result.Error.Message}");
}
else
{
// Do something if SaveGameRecord been successful
}
});
サーバーを介したゲームレコードの作成
- Unreal
- Unity
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"));
FMultiRegistry::GetServerApiClient()->ServerCloudSave.SaveGameRecord(Key, *RecordRequest, FVoidHandler::CreateLambda([]()
{
// Do something if SaveGameRecord has been successful
}), FErrorHandler::CreateLambda([](int32 ErrorCode, const FString& ErrorMessage)
{
// Do something if SaveGameRecord has an error
UE_LOG(LogTemp, Log, TEXT("Error SaveGameRecord, Error Code: %d Error Message: %s"), ErrorCode, *ErrorMessage);
}));
ServerCloudSave serverCloudSave = MultiRegistry.GetServerApiClient().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"}
};
RecordSetBy setBy = RecordSetBy.CLIENT;
serverCloudSave.SaveGameRecord(key
, recordRequest
, setBy
, result =>
{
if (result.IsError)
{
// Do something if SaveGameRecord an error
Debug.Log($"Error SaveGameRecord, Error Code: {result.Error.Code} Error Message: {result.Error.Message}");
}
else
{
// Do something if SaveGameRecord been successful
}
});
ゲームレコードのデータの表示
作成元および保存元が管理者ポータルの場合でもゲームクライアントの場合でも、ゲームレコードはすべてのプレイヤーが取得できます。このデータを活用すると、ゲームのユースケースをサポートするためのあらゆることができます。たとえば、データを使用して季節的なテーマのUIを置き換えたり、データを表示してニュースやイベントの更新を見せたりできます。
次の関数を使用してゲームレコードを取得できます。
クライアントを介したゲームレコードの取得
- Unreal
- Unity
FString Key = FString("inGameNews");
FMultiRegistry::GetApiClient()->CloudSave.GetGameRecord(Key, THandler<FAccelByteModelsGameRecord>::CreateLambda([](const FAccelByteModelsGameRecord& Result)
{
// Do something if GetGameRecord has been successful
}), FErrorHandler::CreateLambda([](int32 ErrorCode, const FString& ErrorMessage)
{
// Do something if GetGameRecord has an error
UE_LOG(LogTemp, Log, TEXT("Error GetGameRecord, Error Code: %d Error Message: %s"), ErrorCode, *ErrorMessage);
}));
CloudSave cloudSave = MultiRegistry.GetApiClient().GetCloudSave();
string key = "inGameNews";
cloudSave.GetGameRecord(key
, result =>
{
if (result.IsError)
{
// Do something if GetGameRecord an error
Debug.Log($"Error GetGameRecord, Error Code: {result.Error.Code} Error Message: {result.Error.Message}");
}
else
{
// Do something if GetGameRecord been successful
}
});
サーバーを介したゲームレコードの取得
- Unreal
FString Key = FString("inGameNews");
FMultiRegistry::GetServerApiClient()->ServerCloudSave.GetGameRecord(Key, THandler<FAccelByteModelsGameRecord>::CreateLambda([](const FAccelByteModelsGameRecord& Result)
{
// Do something if GetGameRecord has been successful
}), FErrorHandler::CreateLambda([](int32 ErrorCode, const FString& ErrorMessage)
{
// Do something if GetGameRecord has an error
UE_LOG(LogTemp, Log, TEXT("Error GetGameRecord, Error Code: %d Error Message: %s"), ErrorCode, *ErrorMessage);
}));
ゲームレコードのデータの変更
管理者ポータルを介したゲームレコードの変更
管理者ポータルからのゲームレコードの変更は、手動で データを調整したい場合に適しています。たとえば、データの修正や、監査などです。 ゲームレコードを更新するには、以下の手順に従います。
管理者ポータルの[Game Management (ゲーム管理)]セクションで、[Cloud Save (クラウドセーブ)]メニューに移動し、[Game Records (ゲームレコード)]を選択します。
[Cloud Save (クラウドセーブ)]ページで、更新したいレコードを選択し、[Action (アクション)]メニューで[View (表示)]を選択します。
[Record Detail (レコードの詳細)]で、[JSON Configuration (JSON 設定)]セクションに移動し、[Edit (編集)]をクリックします。
更新された情報を入力し、[Save (保存)]をクリックして完了します。
SDK を使用した新しいゲームレコードの変更
これは、ゲームが、ゲームクライアントからゲームレコードのデータを更新する必要がある場合に適しています。次の関数を使用すると、保存するデータが新しいデータに置き換えられます。
クライアントを介したゲームレコードの変更
- Unreal
- Unity
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"));
FMultiRegistry::GetApiClient()->CloudSave.ReplaceGameRecord(Key, *RecordRequest, FVoidHandler::CreateLambda([]()
{
// Do something if ReplaceGameRecord been successful
})
, FErrorHandler::CreateLambda([](int32 ErrorCode, FString ErrorMessage)
{
// Do something if ReplaceGameRecord has an error
}));
CloudSave cloudSave = MultiRegistry.GetApiClient().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 an error
Debug.Log($"Error ReplaceGameRecord, Error Code: {result.Error.Code} Error Message: {result.Error.Message}");
}
else
{
// Do something if ReplaceGameRecord been successful
}
});
サーバーを介したゲームレコードの変更
- Unreal
- Unity
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"));
FMultiRegistry::GetServerApiClient()->ServerCloudSave.ReplaceGameRecord(Key, *RecordRequest, FVoidHandler::CreateLambda([]()
{
// Do something if ReplaceGameRecord been successful
})
, FErrorHandler::CreateLambda([](int32 ErrorCode, FString ErrorMessage)
{
// Do something if ReplaceGameRecord has an error
}));
ServerCloudSave serverCloudSave = MultiRegistry.GetServerApiClient().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"}
};
RecordSetBy setBy = RecordSetBy.CLIENT;
serverCloudSave.ReplaceGameRecord(key
, recordRequest
, setBy
, result =>
{
if (result.IsError)
{
// Do something if ReplaceGameRecord an error
Debug.Log($"Error ReplaceGameRecord, Error Code: {result.Error.Code} Error Message: {result.Error.Message}");
}
else
{
// Do something if ReplaceGameRecord been successful
}
});
ゲームレコードのデータの削除
管理者ポータルを介した新しいゲームレコードの削除
ゲームレコードを削除するには、次の手順に従います。
管理者ポータルの[Game Management (ゲーム管理)]セクションで、[Cloud Save (クラウドセーブ)]メニューに移動し、[Game Records (ゲームレコード)]を選択します。
[Cloud Save (クラウドセーブ)]ページで、リストから削除したいレコードを選択し、[Action (アクション)]メニューの[Delete (削除)]ボタンをクリックします。
[Delete Game Record (ゲームレコードを削除)]確認モーダルが表示されます。続行するには[Delete (削除)]をクリックします。
SDK を介した新しいゲームレコードの削除
ゲームで、SDK 側からゲームレコードを削除する必要がある場合は、次の関数を使用して削除できます。
クライアントを介したゲームレコードの削除
- Unreal
- Unity
FString Key = FString("map-data");
FMultiRegistry::GetApiClient()->CloudSave.DeleteGameRecord(Key, FVoidHandler::CreateLambda([]()
{
// Do something if DeleteGameRecord has been successful
}), FErrorHandler::CreateLambda([](int32 ErrorCode, const FString& ErrorMessage)
{
// Do something if DeleteGameRecord has an error
UE_LOG(LogTemp, Log, TEXT("Error DeleteGameRecord, Error Code: %d Error Message: %s"), ErrorMessage, *ErrorMessage);
}));
CloudSave cloudSave = MultiRegistry.GetApiClient().GetCloudSave();
string key = "map-data";
cloudSave.DeleteGameRecord(key
, result =>
{
if (result.IsError)
{
// Do something if DeleteGameRecord an error
Debug.Log($"Error DeleteGameRecord, Error Code: {result.Error.Code} Error Message: {result.Error.Message}");
}
else
{
// Do something if DeleteGameRecord been successful
}
});
サーバーを介したゲームレコードの削除
- Unreal
- Unity
FString Key = FString("map-data");
FMultiRegistry::GetServerApiClient()->ServerCloudSave.DeleteGameRecord(Key, FVoidHandler::CreateLambda([]()
{
// Do something if DeleteGameRecord has been successful
}), FErrorHandler::CreateLambda([](int32 ErrorCode, const FString& ErrorMessage)
{
// Do something if DeleteGameRecord has an error
UE_LOG(LogTemp, Log, TEXT("Error DeleteGameRecord, Error Code: %d Error Message: %s"), ErrorMessage, *ErrorMessage);
}));
ServerCloudSave serverCloudSave = MultiRegistry.GetServerApiClient().GetCloudSave();
string key = "map-data";
serverCloudSave.DeleteGameRecord(key
, result =>
{
if (result.IsError)
{
// Do something if DeleteGameRecord an error
Debug.Log($"Error DeleteGameRecord, Error Code: {result.Error.Code} Error Message: {result.Error.Message}");
}
else
{
// Do something if DeleteGameRecord been successful
}
});