Storing Player Attributes in Private Records
概要
クラウドセーブサービスでは、プレイヤーのデータを非公開保存できます。 非公開保存とは、プレイヤーが他のプレイヤーの特定のデータを読み取れないことを意味します。
保存されるデータは、通常、他のプレイヤーには関係のない情報、または機密情報の場合があり、JSON 形式で保存されます。たとえば、次のようなデータの保存が考えられます。
プレイヤーの個人設定 (キーバインド、グラフィック品質、オーディオ設定など)
特定のユースケースに対するプレイヤー固有の情報 (RPG タイトルにおけるキャラクターの最終位置など)
このガイドでは、プレイヤーデータの非公開保存を活用し、そのデータをゲームクライアント内で表示し、ゲームのユースケースに従って変更する方法を説明します。
目標
- 非公開プレイヤーレコードについての説明と概要を示す。
- 非公開プレイヤーレコードに非公開プレイヤーデータを保存する方法を説明する。
- 非公開プレイヤーレコードを表示する方法を説明する。
- 非公開プレイヤーレコードを変更する方法を説明する。
- 非公開プレイヤーレコードを削除する方法を説明する。
- AccelByte SDK を使用して公開プレイヤーレコードを活用する方法を説明する。
前提条件
以下へのアクセスが必要になります。
- 管理者ポータル
- AccelByte UnrealまたはUnity SDK (次の権限を含む)
- クライアント ID
- クライアントの秘密
- AccelByte クラウドセーブ API ドキュメント
非公開プレイヤーレコードへのユーザーデータの保存
ゲームではユーザーデータを保存することが重要です。なぜなら、データを保存することで、 プレイヤーはプレイするたびに最初から始める必要がなくなり、ゲーム体験をより楽しいものにできるからです。
クラウドセーブの非公開プレイヤーレコードを保存するには、2 つの方法があります。
- ゲームクライアントを介して保存する。保存されたデータは、ゲームクライアントとゲームサーバーの両方から変更できる。
- ゲームサーバーを介して保存する。ゲームサーバーを介して保存されたデータは、ゲームサーバーからしか変更できない。
上記 2 つの手法における唯一の違いは、レコードに割り当てることができる書き込み権限です。レコードの書き込み権限の詳細については、こちらのセクション を確認してください。
ゲームクライアントを介した非公開プレイヤーレコードへのユーザーデータの保存
この方法は、他のプレイヤーに関係しないプレイヤーデータを保存する場合かつ、 レコード所有者がデータを変更できる場合に適しています。たとえば、プレイヤーのグラフィック品質設定、キーバインドなどの 保存が挙げられます。
次の例では、ゲームクライアントを介して graphicQuality キー内にユーザーデータを 保存する方法を示しています。キーが既に存在する場合、 新しいレコードは既存のレコードに追加されることに注意してください。
- Unreal
- Unity
FApiClientPtr ApiClient = FMultiRegistry::GetApiClient();
FString Key = "graphicQuality";
TSharedPtr<FJsonObject> RecordRequest = MakeShareable(new FJsonObject);
// 0 Low Quality, 1 Medium Quality, 2 High Quality
RecordRequest->SetNumberField(FString("textures"), 2);
RecordRequest->SetNumberField(FString("shadow"), 1);
RecordRequest->SetNumberField(FString("lighting"), 0);
RecordRequest->SetNumberField(FString("post-processing"), 2);
ApiClient->CloudSave.SaveUserRecord(Key
, *RecordRequest
, false
, FVoidHandler::CreateLambda([]()
{
// Do something if SaveUserRecord been successful
})
, FErrorHandler::CreateLambda([](int32 ErrorCode, FString ErrorMessage)
{
// Do something if SaveUserRecord has an error
}));
CloudSave cloudSave = MultiRegistry.GetApiClient().GetCloudSave();
string key = " grapicQuality";
Dictionary<string, object> recordRequest = new Dictionary<string, object>
{
// 0 Low Quality, 1 Medium Quality, 2 High Quality
{ "textures", 0 },
{ "shadow", 2 },
{ "lighting", 1 },
{ "post-processing", 2 }
};
cloudSave.SaveUserRecord(key
, recordRequest
, result =>
{
if (result.IsError)
{
// Do something if SaveUserRecord an error
Debug.Log($"Error SaveUserRecord, Error Code: {result.Error.Code} Error Message: {result.Error.Message}");
}
else
{
// Do something if SaveUserRecord been successful
}
}
, false);
ゲームサーバーを介した非公開プレイヤーレコードへのユーザーデータの保存
この方法は、他のプレイヤーに関係しないプレイヤーデータを保存する場合かつ、 レコード所有者がデータを変更できない場合に適しています。たとえば、プレイヤーがゲームを終了する前のキャラクターの 最終位置を保存する場合などです。これにより、プレイヤーがゲームを起動するときに 最終位置が読み込まれます。
次の例は、ゲームサーバーを介して characterLocation キー内にユーザーデータを保存する方法を示しています。
- Unreal
- Unity
FServerApiClientPtr ApiServer = FMultiRegistry::GetServerApiClient();
FString Key = "characterLocation";
FString UserId = "Player User Id";
ESetByMetadataRecord SetBy = ESetByMetadataRecord::SERVER;
TSharedPtr<FJsonObject> RecordRequest = MakeShareable(new FJsonObject);
RecordRequest->SetStringField("LastLocation", "x:120,y:200");
ApiServer->ServerCloudSave.SaveUserRecord(Key
, UserId
, SetBy
, false
, *RecordRequest
, FVoidHandler::CreateLambda([]()
{
// Do something if SaveUserRecord been successful
})
, FErrorHandler::CreateLambda([](int32 ErrorCode, FString ErrorMessage)
{
// Do something if SaveUserRecord has an error
}));
ServerCloudSave serverCloudSave = MultiRegistry.GetServerApiClient().GetCloudSave();
string key = "characterLocation";
string userId = "Player User Id";
RecordSetBy setBy = RecordSetBy.SERVER;
Dictionary<string, object> recordRequest = new Dictionary<string, object>
{
{"LastLocation", "x:120,y:200"}
};
serverCloudSave.SaveUserRecord(userId
, key
, recordRequest
, setBy
, false
, result =>
{
if (result.IsError)
{
// Do something if SaveUserRecord an error
Debug.Log($"Error SaveUserRecord, Error Code: {result.Error.Code} Error Message: {result.Error.Message}");
}
else
{
// Do something if SaveUserRecord been successful
}
});
非公開プレイヤーレコードのデータの表示
保存されている非公開プレイヤーレコードは、レコード所有者しか取得できません。 データを取得した後は、ゲームのユースケースをサポートするためのあらゆることができます。 例として、グラフィック品質設定のインポートや、キーバインド設定のインポートなどができます。
- Unreal
- Unity
FApiClientPtr ApiClient = FMultiRegistry::GetApiClient();
FString Key = "graphicQuality";
ApiClient->CloudSave.GetUserRecord(Key
, THandler<FAccelByteModelsUserRecord>::CreateLambda([](FAccelByteModelsUserRecord Result)
{
// Do something if GetUserRecord been successful
})
, FErrorHandler::CreateLambda([](int32 ErrorCode, FString ErrorMessage)
{
// Do something if GetUserRecord has an error
}));
CloudSave cloudSave = MultiRegistry.GetApiClient().GetCloudSave();
string key = "graphicQuality";
cloudSave.GetUserRecord(key
, result =>
{
if (result.IsError)
{
// Do something if GetUserRecord an error
Debug.Log($"Error GetUserRecord, Error Code: {result.Error.Code} Error Message: {result.Error.Message}");
}
else
{
// Do something if GetUserRecord been successful
}
});
非公開プレイヤーレコードのデータの変更
プレイヤーレコードのデータは、ゲームのユースケースに基づいて変更できます。 クラウドセーブの非公開プレイヤーレコードを変更するには、2 つの手法があります。
1.ゲームクライアントを介した変更 1.ゲームサーバーを介した変更
ゲームクライアントを介した非公開プレイヤーレコードの変更
これは、プレイヤーが自分のプレイヤーレコードを変更できるようにする場合に適しています。 たとえば、ユーザーがグラフィック設定を更新する場合などです。
非公開プレイヤーレコードを変更するには、2 つの手法があります
- 置換:データ全体を新しい内容に置き換えたい場合に適しています。レコードが存在しない場合は、その新しいデータに基づいて作成されます。レコードが既に存在する場合は、レコード全体を置き換えます。
- 追加:プレイヤーレコードに新しいキーと値のみを追加したい場合に適しています。置換に比べて軽いプロセスで実行できます。
ユーザーの非公開プレイヤーレコードの置換
次の例は、graphicQuality キー内のユーザーデータを置き換える方法を示しています。
- Unreal
- Unity
FApiClientPtr ApiClient = FMultiRegistry::GetApiClient();
FString Key = "graphicQuality";
TSharedPtr<FJsonObject> RecordRequest = MakeShareable(new FJsonObject);
// 0 Low Quality, 1 Medium Quality, 2 High Quality
RecordRequest->SetNumberField(FString("textures"), 2);
RecordRequest->SetNumberField(FString("shadow"), 2);
RecordRequest->SetNumberField(FString("lighting"), 2);
RecordRequest->SetNumberField(FString("post-processing"), 2);
ApiClient->CloudSave.ReplaceUserRecord(Key
, false
, *RecordRequest
, FVoidHandler::CreateLambda([]()
{
// Do something if ReplaceUserRecord been successful
})
, FErrorHandler::CreateLambda([](int32 ErrorCode, FString ErrorMessage)
{
// Do something if ReplaceUserRecord has an error
}));
CloudSave cloudSave = MultiRegistry.GetApiClient().GetCloudSave();
string key = "Your cloud save key";
Dictionary<string, object> recordRequest = new Dictionary<string, object>
{
// 0 Low Quality, 1 Medium Quality, 2 High Quality
{ "textures", 2 },
{ "shadow", 2 },
{ "lighting", 2 },
{ "post-processing", 2 }
};
cloudSave.ReplaceUserRecord(key
, false
, recordRequest
, result =>
{
if (result.IsError)
{
// Do something if ReplaceUserRecord an error
Debug.Log($"Error ReplaceUserRecord, Error Code: {result.Error.Code} Error Message: {result.Error.Message}");
}
else
{
// Do something if ReplaceUserRecord been successful
}
});
ユーザーの非公開プレイヤーレコードの追加
次の例は、graphicQuality キー内にユーザーデータを追加する方法を示しています。
- Unreal
- Unity
FApiClientPtr ApiClient = FMultiRegistry::GetApiClient();
FString Key = "graphicQuality";
TSharedPtr<FJsonObject> RecordRequest = MakeShareable(new FJsonObject);
RecordRequest->SetStringField("blur", "2");
ApiClient->CloudSave.SaveUserRecord(Key
, *RecordRequest
, false
, FVoidHandler::CreateLambda([]()
{
// Do something if SaveUserRecord been successful
})
, FErrorHandler::CreateLambda([](int32 ErrorCode, FString ErrorMessage)
{
// Do something if SaveUserRecord has an error
}));
CloudSave cloudSave = MultiRegistry.GetApiClient().GetCloudSave();
string key = " grapicQuality";
Dictionary<string, object> recordRequest = new Dictionary<string, object>
{
{"LastName", "Doe" }
};
cloudSave.SaveUserRecord(key
, recordRequest
, result =>
{
if (result.IsError)
{
// Do something if SaveUserRecord an error
Debug.Log($"Error SaveUserRecord, Error Code: {result.Error.Code} Error Message: {result.Error.Message}");
}
else
{
// Do something if SaveUserRecord been successful
}
}
, true);
ゲームサーバーを介した非公開プレイヤーレコードの変更
ゲームサーバーは、非公開プレイヤーレコードのデータを変更するための権限を、最も多く有しています。レコードの書き込み権限の詳細については、 こちらのセクション を確認してください。 これは、ゲームサーバーしかプレイヤーレコードを変更できないようにする場合に適しています。たとえば、ゲームサーバーでキャラクターの最終位置を保存する場合などです。
次の例では、ゲームサーバーを介して characterLocation キー内にあるプレイヤーレコードのデータを変更する方法を示しています。
- Unreal
- Unity
FServerApiClientPtr ApiServer = FMultiRegistry::GetServerApiClient();
FString Key = "characterLocation";
FString UserId = "Player User Id";
ESetByMetadataRecord SetBy = ESetByMetadataRecord::SERVER;
TSharedPtr<FJsonObject> RecordRequest = MakeShareable(new FJsonObject);
RecordRequest->SetStringField("LastLocation", "x:2330,y:8710");
ApiServer->ServerCloudSave.ReplaceUserRecord(Key
, SetBy
, false
, UserId
, *RecordRequest
, FVoidHandler::CreateLambda([]()
{
// Do something if ReplaceUserRecord been successful
})
, FErrorHandler::CreateLambda([](int32 ErrorCode, FString ErrorMessage)
{
// Do something if ReplaceUserRecord has an error
}));
ServerCloudSave serverCloudsave = MultiRegistry.GetServerApiClient().GetCloudSave();
string key = "characterLocation";
string userId = "Player User Id";
RecordSetBy setBy = RecordSetBy.SERVER;
Dictionary<string, object> recordRequest = new Dictionary<string, object>
{
{"LastLocation", "x:2330,y:8710"}
};
serverCloudsave.ReplaceUserRecord(userId
, key
, recordRequest
, setBy
, false
, result =>
{
if (result.IsError)
{
// Do something if ReplaceUserRecord an error
Debug.Log($"Error ReplaceUserRecord, Error Code: {result.Error.Code} Error Message: {result.Error.Message}");
}
else
{
// Do something if ReplaceUserRecord been successful
}
});
特定のユーザーが所有する非公開プレイヤーレコードの削除
非公開プレイヤーレコードのデータは削除することもできます。プレイヤーレコードのデータの削除は、ゲームクライアントまたはゲームサーバーから行えます。
ゲームクライアントを介したユーザーの非公開プレイヤーレコードの削除
次の例は、ゲームクライアントを介して graphicQuality キーでユーザーレコードデータを削除する方法を示しています。
- Unreal
- Unity
FApiClientPtr ApiClient = FMultiRegistry::GetApiClient();
FString Key = "graphicQuality";
ApiClient->CloudSave.DeleteUserRecord(Key
, FVoidHandler::CreateLambda([]()
{
// Do something if DeleteUserRecord been successful
})
, FErrorHandler::CreateLambda([](int32 ErrorCode, FString ErrorMessage)
{
// Do something if DeleteUserRecord has an error
}));
CloudSave cloudSave = MultiRegistry.GetApiClient().GetCloudSave();
string key = "graphicQuality";
cloudSave.DeleteUserRecord(key
, result =>
{
if (result.IsError)
{
// Do something if DeleteUserRecord an error
Debug.Log($"Error DeleteUserRecord, Error Code: {result.Error.Code} Error Message: {result.Error.Message}");
}
else
{
// Do something if DeleteUserRecord been successful
}
});
ゲームサーバーを介したユーザーの非公開プレイヤーレコードの削除
次の例では、ゲームサーバーを介して、characterLocation キーでユーザーレコードのデータを削除する方法を示しています。
- Unreal
- Unity
FServerApiClientPtr ApiServer = FMultiRegistry::GetServerApiClient();
FString Key = "characterLocation";
FString UserId = "Player User Id";
ApiServer->ServerCloudSave.DeleteUserRecord(Key
, UserId
, false
, FVoidHandler::CreateLambda([]()
{
// Do something if DeleteUserRecord been successful
})
, FErrorHandler::CreateLambda([](int32 ErrorCode, FString ErrorMessage)
{
// Do something if DeleteUserRecord has an error
}));
ServerCloudSave serverCloudsave = MultiRegistry.GetServerApiClient().GetCloudSave();
string key = "characterLocation";
string userId = "Player User Id";
serverCloudsave.DeleteUserRecord(userId
, key
, result =>
{
if (result.IsError)
{
// Do something if DeleteUserRecord an error
Debug.Log($"Error DeleteUserRecord, Error Code: {result.Error.Code} Error Message: {result.Error.Message}");
}
else
{
// Do something if DeleteUserRecord been successful
}
});