プレイヤー属性を公開レコードに保存する
注釈:本資料はAI技術を用いて翻訳されています。
概要
Cloud Save サービスを使用すると、プレイヤーのデータを公開して保存できます。公開保存とは、他のプレイヤーが特定のプレイヤーのデータを読み取れるようにすることを意味します。保存したデータは JSON 形式で、取得、変更、削除が可能です。
保存されるデータは通常、他のプレイヤーに公開表示しても問題のない機密性のないデータであり、データに関するプライバシールールはありません。例えば、以下のようなデータを保存します。
- プレイヤーのステータス、プレイヤー情報、職業、役割、ティア、レベルなどのプレイヤープロフィールデータ
- プレイヤーがカスタマイズした武器のロードアウトなど
このガイドでは、プレイヤーレコードを利用してプレイヤーデータを公開保存し、ゲームクライアント内で表示し、ゲームのユースケースに応じて変更する方法を学びます。
目標
このセクションの目標は以下のとおりです。
- 公開プレイヤーレコードの概要を理解する
- 公開プレイヤーレコードにプレイヤーデータを保存する方法を理解する
- 公開プレイヤーレコードを表示する方法を理解する
- 公開プレイヤーレコードを変更する方法を理解する
- 公開プレイヤーレコードを削除する方法を理解する
- AccelByte SDK を使用して公開プレイヤーレコードを活用する方法を学ぶ
前提条件
以下へのアクセスが必要です。
- 管理ポータル
- AGS Unreal、Unity、または Extend SDK(必要な権限を含む)
- クライアント ID
- クライアントシークレット
- AGS Cloud Save API ドキュメント
公開プレイヤーレコードにユーザーデータを保存する
ユーザーデータの保存はゲームにとって重要です。これにより、プレイヤーは毎回最初からやり直す必要がなくなり、ゲーム体験がより楽しくなります。
ゲームのユースケースに基づいて選択できる、Cloud Save 公開プレイヤーレコードを保存する 2 つの方法があります。
- ゲームクライアント経由で保存:保存されたデータは、ゲームクライアントまたはゲームサーバーの両方から変更できます。
- ゲームサーバー経由で保存:ゲームサーバー経由で保存されたデータは、ゲームサーバーのみが変更できます。
上記の 2 つの方法の唯一の違いは、レコードに割り当てることができる書き込み権限です。レコードの書き込み権限の詳細については、このセクションを確認してください。
ゲームクライアント経由で公開プレイヤーレコードにユーザーデータを保存する
これは、プレイヤーの武器ロードアウトなどのプレイヤー情報などのデータを保存するのに適しています。
この例では、ゲームクライアント経由で playerInformation キー内にユーザーデータを保存する方法を示します。
キーが既に存在する場合、新しいデータは既存のレコードに追加されます。
- Unreal Engine
- Unity
- C# Extend SDK
- Go Extend SDK
- Java Extend SDK
- Python Extend SDK
FApiClientPtr ApiClient = AccelByteOnlineSubsystemPtr->GetApiClient();
FString Key = "playerInformation";
TSharedPtr<FJsonObject> RecordRequest = MakeShareable(new FJsonObject);
RecordRequest->SetStringField("FirstName", "John");
ApiClient->CloudSave.SaveUserRecord(Key
, *RecordRequest
, true
, FVoidHandler::CreateLambda([]()
{
// Do something if SaveUserRecord is successful
})
, FErrorHandler::CreateLambda([](int32 ErrorCode, FString ErrorMessage)
{
// Do something if SaveUserRecord has an error
}));
CloudSave cloudSave = AccelByteSDK.GetClientRegistry().GetApi().GetCloudSave();
bool isPublic = true;
string key = "playerInformation";
Dictionary<string, object> recordRequest = new Dictionary<string, object>
{
{"FirstName", "John" }
};
cloudSave.SaveUserRecord(key, recordRequest, result =>
{
if (result.IsError)
{
// Do something if SaveUserRecord has an error
Debug.Log($"Error SaveUserRecord, Error Code: {result.Error.Code} Error Message: {result.Error.Message}");
return;
}
// Do something if SaveUserRecord is successful
}
, isPublic);
public class MyRecordRequest : ModelsPlayerRecordRequest
{
[JsonPropertyName("firstName")]
public string FirstName { get; set; } = "";
}
string key = "playerInformation";
string userId = "<user-id>";
var record = new MyRecordRequest()
{
FirstName = "John"
};
var response = sdk.Cloudsave.PublicPlayerRecord.PostPlayerPublicRecordHandlerV1Op
.Execute(record, key, sdk.Namespace, userId);
if (response != null)
{
//do something with response when success
}
publicPlayerRecordService := &cloudsave.PublicPlayerRecordService{
Client: factory.NewCloudsaveClient(&repository.ConfigRepositoryImpl{}),
TokenRepository: &repository.TokenRepositoryImpl{},
}
key := "playerInformation"
body := map[string]interface{}{"FirstName": "John"}
namespace := "mygame"
userId := "myuserid"
input := &public_player_record.PostPlayerPublicRecordHandlerV1Params{
Body: body,
Key: key,
Namespace: namespace,
UserID: userId,
}
result, err := publicPlayerRecordService.PostPlayerPublicRecordHandlerV1Short(input)
@Builder
public class MyRecordRequest extends ModelsPlayerRecordRequest {
@JsonProperty("firstName")
private String firstName;
}
...
final PublicPlayerRecord publicPlayerRecordWrapper = new PublicPlayerRecord(sdk);
String key = "playerInformation";
String userId = "<user-id>";
String firstName = "John";
ModelsPlayerRecordResponse response;
try {
var record = MyRecordRequest.builder().firstName(firstName).build();
response = publicPlayerRecordWrapper.postPlayerPublicRecordHandlerV1(PostPlayerPublicRecordHandlerV1.builder()
.namespace("<namespace>")
.userId(userId)
.key(key)
.body(record)
.build());
} catch (Exception e) {
// Do something when failed
return;
}
if (response == null) {
// Null response from server
} else {
// Do something with response when success
}
import accelbyte_py_sdk.api.cloudsave as cloudsave_service
import accelbyte_py_sdk.api.cloudsave.models as cloudsave_models
result, error = cloudsave_service.post_player_record_handler_v1(
body=cloudsave_models.ModelsPlayerRecordRequest.create(
{
"FirstName": "John",
"__META": {
"is_public": True,
}
}
),
key="playerInformation",
namespace=namespace, # optional, gets the value from the global instance if unspecified
sdk=sdk, # optional, gets the global instance if unspecified
)
if error:
exit(error)
ゲームサーバー経由で公開プレイヤーレコードにユーザーデータを保存する
これは、特定のゲームロジックによって更新され、プレイヤーが手動でトリガーしないプレイヤーのランクやティアなどのデータを保存するのに適しています。
以下の例では、ゲームサーバー経由で playerTier キー内にユーザーデータを保存する方法を示します。
- Unreal Engine
- Unity
- C# Extend SDK
- Go Extend SDK
- Java Extend SDK
- Python Extend SDK
FServerApiClientPtr ApiServer = AccelByteOnlineSubsystemPtr->GetServerApiClient();
FString Key = "playerTier";
FString UserId = "Player User Id";
ESetByMetadataRecord SetBy = ESetByMetadataRecord::SERVER;
TSharedPtr<FJsonObject> RecordRequest = MakeShareable(new FJsonObject);
RecordRequest->SetStringField("Rank", "Legend");
ApiServer->ServerCloudSave.SaveUserRecord(Key
, UserId
, SetBy
, true
, *RecordRequest
, FVoidHandler::CreateLambda([]()
{
// Do something if SaveUserRecord is successful
})
, FErrorHandler::CreateLambda([](int32 ErrorCode, FString ErrorMessage)
{
// Do something if SaveUserRecord has an error
}));
ServerCloudSave serverCloudSave = AccelByteSDK.GetServerRegistry().GetApi().GetCloudSave();
string key = "playerTier";
string userId = "Player User Id";
RecordSetBy setBy = RecordSetBy.SERVER;
bool isPublic = true;
Dictionary<string, object> recordRequest = new Dictionary<string, object>
{
{"Rank", "Legend" }
};
serverCloudSave.SaveUserRecord(userId, key, recordRequest, setBy, isPublic, result =>
{
if (result.IsError)
{
// Do something if SaveUserRecord has an error
Debug.Log($"Error SaveUserRecord, Error Code: {result.Error.Code} Error Message: {result.Error.Message}");
return;
}
// Do something if SaveUserRecord is successful
});
public class MyRecordRequestWithMeta : ModelsPlayerRecordRequest
{
public class Meta
{
[JsonPropertyName("set_by")]
public string SetBy { get; set; } = "";
[JsonPropertyName("is_public")]
public bool IsPublic { get; set; } = false;
}
[JsonPropertyName("__META")]
public Meta RecordMeta { get; set; } = new Meta();
[JsonPropertyName("firstName")]
public string FirstName { get; set; } = "";
}
string key = "playerInformation";
string userId = "<user-id>";
var serverRecord = new MyRecordRequestWithMeta()
{
RecordMeta = new MyRecordRequestWithMeta.Meta()
{
SetBy = "SERVER",
IsPublic = true
},
FirstName = "John"
};
var response = sdk.Cloudsave.AdminPlayerRecord.AdminPostPlayerPublicRecordHandlerV1Op
.Execute(serverRecord, key, sdk.Namespace, userId);
if (response != null)
{
//do something with response when success
}
publicPlayerRecordService := &cloudsave.PublicPlayerRecordService{
Client: factory.NewCloudsaveClient(&repository.ConfigRepositoryImpl{}),
TokenRepository: &repository.TokenRepositoryImpl{},
}
key := "playerTier"
body := map[string]interface{}{
"Rank": "Legend",
"__META": map[string]interface{}{
"set_by":"SERVER",
"is_public": true,
},
}
namespace := "mygame"
userId := "myuserid"
input := &public_player_record.PostPlayerPublicRecordHandlerV1Params{
Body: body,
Key: key,
Namespace: namespace,
UserID: userId,
}
result, err := publicPlayerRecordService.PostPlayerPublicRecordHandlerV1Short(input)
@Builder
public class MyRecordRequestWithMeta extends ModelsPlayerRecordRequest {
@Builder
public class Meta
{
@JsonProperty("set_by")
public String setBy;
@JsonProperty("is_public")
public boolean isPublic;
}
@JsonProperty("__META")
public Meta RecordMeta;
@JsonProperty("firstName")
public String firstName;
}
...
AdminPlayerRecord adminPlayerRecordWrapper = new AdminPlayerRecord(sdk);
String key = "playerInformation";
String userId = "<user-id>";
String firstName = "John";
ModelsPlayerRecordResponse response;
try {
var serverRecord = MyRecordRequestWithMeta
.builder()
.firstName(firstName)
.RecordMeta(MyRecordRequestWithMeta.Meta.builder()
.setBy("SERVER")
.isPublic(true)
.build())
.build();
response = adminPlayerRecordWrapper.adminPostPlayerPublicRecordHandlerV1(AdminPostPlayerPublicRecordHandlerV1.builder()
.namespace("<namespace>")
.userId(userId)
.key(key)
.body(serverRecord)
.build());
} catch (Exception e) {
// Do something when failed
return;
}
if (response == null) {
// Null response from server
} else {
// Do something with response when success
}
import accelbyte_py_sdk.api.cloudsave as cloudsave_service
import accelbyte_py_sdk.api.cloudsave.models as cloudsave_models
result, error = cloudsave_service.admin_post_player_record_handler_v1(
body=cloudsave_models.ModelsPlayerRecordRequest.create(
{
"Rank": "Legend",
"__META": {
"set_by": "SERVER",
"is_public": True,
}
}
),
key="playerTier",
user_id="********************************",
namespace=namespace, # optional, gets the value from the global instance if unspecified
sdk=sdk, # optional, gets the global instance if unspecified
)
if error:
exit(error)
公開プレイヤーレコードデータを表示する
保存したレコードは、ゲームのユースケースに応じて取得して表示できます。レコードの所有者に基づいて、プレイヤーレコードを表示する 2 つの一般的なアプローチがあります。
- 自分の公開プレイヤーレコード。例:マイプレイヤー情報ページ
- 他のユーザーの公開プレイヤーレコード。例:他のユーザーのプレイヤー情報ページ
自分の公開プレイヤーレコードを表示する
以下の例では、playerInfo キー内のユーザーデータを取得する方法を示します。
- Unreal Engine
- Unity
- C# Extend SDK
- Go Extend SDK
- Java Extend SDK
- Python Extend SDK
FApiClientPtr ApiClient = AccelByteOnlineSubsystemPtr->GetApiClient();
FString Key = "playerInfo";
ApiClient->CloudSave.GetUserRecord(Key
, THandler<FAccelByteModelsUserRecord>::CreateLambda([](FAccelByteModelsUserRecord Result)
{
// Do something if GetUserRecord is successful
})
, FErrorHandler::CreateLambda([](int32 ErrorCode, FString ErrorMessage)
{
// Do something if GetUserRecord has an error
}));
CloudSave cloudSave = AccelByteSDK.GetClientRegistry().GetApi().GetCloudSave();
string key = "playerInfo";
cloudSave.GetUserRecord(key, result =>
{
if (result.IsError)
{
// Do something if GetUserRecord has an error
Debug.Log($"Error GetUserRecord, Error Code: {result.Error.Code} Error Message: {result.Error.Message}");
return;
}
// Do something if GetUserRecord is successful
});
string key = "playerInformation";
string userId = "<user-id>";
var response = sdk.Cloudsave.PublicPlayerRecord.GetPlayerPublicRecordHandlerV1Op
.Execute(key, sdk.Namespace, userId);
if (response != null)
{
//do something with the data
}
publicPlayerRecordService := &cloudsave.PublicPlayerRecordService{
Client: factory.NewCloudsaveClient(&repository.ConfigRepositoryImpl{}),
TokenRepository: &repository.TokenRepositoryImpl{},
}
key := "playerInfo"
namespace := "mygame"
userId := "myuserid"
input := &public_player_record.GetPlayerPublicRecordHandlerV1Params{
Key: key,
Namespace: namespace,
UserID: userId,
}
result, err := publicPlayerRecordService.GetPlayerPublicRecordHandlerV1Short(input)
PublicPlayerRecord publicPlayerRecordWrapper = new PublicPlayerRecord(sdk);
String key = "playerInformation";
String userId = "<user-id>";
ModelsPlayerRecordResponse response;
try {
response = publicPlayerRecordWrapper.getPlayerPublicRecordHandlerV1(GetPlayerPublicRecordHandlerV1.builder()
.namespace("<namespace>")
.userId(userId)
.key(key)
.build());
} catch (Exception e) {
// Do something when failed
return;
}
if (response == null) {
// Null response from server
} else {
// Do something with the data
}
import accelbyte_py_sdk.api.cloudsave as cloudsave_service
import accelbyte_py_sdk.api.cloudsave.models as cloudsave_models
result, error = cloudsave_service.get_player_record_handler_v1(
key="playerInfo",
user_id="********************************",
namespace=namespace, # optional, gets the value from the global instance if unspecified
sdk=sdk, # optional, gets the global instance if unspecified
)
if error:
exit(error)
他のユーザーの公開プレイヤーレコードを表示する
公開ユーザーレコードは、他のユーザーが取得できます。以下の例では、playerInfo キー内の他のユーザーのプレイヤーレコードデータを取得する方法を示します。
- Unreal Engine
- Unity
- C# Extend SDK
- Go Extend SDK
- Java Extend SDK
- Python Extend SDK
FApiClientPtr ApiClient = AccelByteOnlineSubsystemPtr->GetApiClient();
FString Key = "playerInfo";
FString UserId = "Player User Id";
ApiClient->CloudSave.GetPublicUserRecord(Key
, UserId
, THandler<FAccelByteModelsUserRecord>::CreateLambda([](FAccelByteModelsUserRecord Result)
{
// Do something if GetPublicUserRecord is successful
})
, FErrorHandler::CreateLambda([](int32 ErrorCode, FString ErrorMessage)
{
// Do something if GetPublicUserRecord has an error
}));
CloudSave cloudSave = AccelByteSDK.GetClientRegistry().GetApi().GetCloudSave();
string key = "playerInfo";
string userId = "Player User Id";
cloudSave.GetPublicUserRecord(key, userId, result =>
{
if (result.IsError)
{
// Do something if GetPublicUserRecord has an error
Debug.Log($"Error GetPublicUserRecord, Error Code: {result.Error.Code} Error Message: {result.Error.Message}");
return;
}
// Do something if GetPublicUserRecord is successful
});
string key = "playerInformation";
string userId = "<user-id>";
var response = sdk.Cloudsave.PublicPlayerRecord.GetPlayerPublicRecordHandlerV1Op
.Execute(key, sdk.Namespace, userId);
if (response != null)
{
//do something with the data
}
publicPlayerRecordService := &cloudsave.PublicPlayerRecordService{
Client: factory.NewCloudsaveClient(&repository.ConfigRepositoryImpl{}),
TokenRepository: &repository.TokenRepositoryImpl{},
}
key := "playerInfo"
namespace := "mygame"
userId := "myuserid"
input := &public_player_record.GetPlayerPublicRecordHandlerV1Params{
Key: key,
Namespace: namespace,
UserID: userId,
}
result, err := publicPlayerRecordService.GetPlayerPublicRecordHandlerV1Short(input)
PublicPlayerRecord publicPlayerRecordWrapper = new PublicPlayerRecord(sdk);
String key = "playerInformation";
String userId = "<user-id>";
ModelsPlayerRecordResponse response;
try {
response = publicPlayerRecordWrapper.getPlayerPublicRecordHandlerV1(GetPlayerPublicRecordHandlerV1.builder()
.namespace("<namespace>")
.userId(userId)
.key(key)
.build());
} catch (Exception e) {
// Do something when failed
return;
}
if (response == null) {
// Null response from server
} else {
// Do something with the data
}
import accelbyte_py_sdk.api.cloudsave as cloudsave_service
import accelbyte_py_sdk.api.cloudsave.models as cloudsave_models
result, error = cloudsave_service.get_player_record_handler_v1(
key="playerInfo",
user_id="********************************",
namespace=namespace, # optional, gets the value from the global instance if unspecified
sdk=sdk, # optional, gets the global instance if unspecified
)
if error:
exit(error)
公開プレイヤーレコードデータを変更する
プレイヤーレコードデータは、ゲームのユースケースに基づいて変更できます。ユースケースに基づいて選択できる、Cloud Save 公開プレイヤーレコードを変更する 2 つの方法があります。
- ゲームクライアント経由で変更。これは、プレイヤーが自分のプレイヤーレコードを変更できるようにしたい場合に適しています。例:ユーザーがプレイヤー情報を更新する
- ゲームサーバー経由で変更。これは、ゲームサーバーのみがプレイヤーレコードを変更できるようにしたい場合に適しています。例:ゲームサーバーがプレイヤーに新しいランクまたはティアを割り当てる
ゲームクライアント経由で公開プレイヤーレコードを変更する
公開プレイヤーレコードを変更するために使用できる 2 つの方法があります。
- 置換:データ全体を新しいコンテンツに置き換えたい場合に適しています。レコードが存在しない場合は、新しいデータに基づいて作成され、レコードが既に存在する場合は、すべてを置き換えます。
- 追加:プレイヤーレコードに新しいキーと値のみを追加したい場合に適しています。このプロセスは、置換と比較して軽量です。
ユーザーの公開プレイヤーレコードを置換する
以下の例では、playerInfo キー内のユーザーデータを置換する方法を示します。
- Unreal Engine
- Unity
- C# Extend SDK
- Go Extend SDK
- Java Extend SDK
- Python Extend SDK
FApiClientPtr ApiClient = AccelByteOnlineSubsystemPtr->GetApiClient();
FString Key = "playerInfo";
TSharedPtr<FJsonObject> RecordRequest = MakeShareable(new FJsonObject);
RecordRequest->SetStringField("FirstName", "Doe");
ApiClient->CloudSave.ReplaceUserRecord(Key
, true
, *RecordRequest
, FVoidHandler::CreateLambda([]()
{
// Do something if ReplaceUserRecord is successful
})
, FErrorHandler::CreateLambda([](int32 ErrorCode, FString ErrorMessage)
{
// Do something if ReplaceUserRecord has an error
}));
CloudSave cloudSave = AccelByteSDK.GetClientRegistry().GetApi().GetCloudSave();
string key = "playerInfo";
bool isPublic = true;
Dictionary<string, object> recordRequest = new Dictionary<string, object>
{
{"FirstName", "Doe" }
};
cloudSave.ReplaceUserRecord(key, isPublic, recordRequest, result =>
{
if (result.IsError)
{
// Do something if ReplaceUserRecord has an error
Debug.Log($"Error ReplaceUserRecord, Error Code: {result.Error.Code} Error Message: {result.Error.Message}");
return;
}
// Do something if ReplaceUserRecord is successful
});
string key = "playerInformation";
string userId = "<user-id>";
var record = new MyRecordRequest()
{
FirstName = "Jack"
};
var response = sdk.Cloudsave.PublicPlayerRecord.PutPlayerPublicRecordHandlerV1Op
.Execute(record, key, sdk.Namespace, userId);
if (response != null)
{
//do something with response when success
}
publicPlayerRecordService := &cloudsave.PublicPlayerRecordService{
Client: factory.NewCloudsaveClient(&repository.ConfigRepositoryImpl{}),
TokenRepository: &repository.TokenRepositoryImpl{},
}
key := "playerInfo"
body := map[string]interface{}{"FirstName": "Doe"}
namespace := "mygame"
userId := "myuserid"
input := &public_player_record.PutPlayerPublicRecordHandlerV1Params{
Body: body,
Key: key,
Namespace: namespace,
UserID: userId,
}
result, err := publicPlayerRecordService.PutPlayerPublicRecordHandlerV1Short(input)
final PublicPlayerRecord publicPlayerRecordWrapper = new PublicPlayerRecord(sdk);
String key = "playerInformation";
String userId = "<user-id>";
String firstName = "Jack";
ModelsPlayerRecordResponse response;
try {
var record = MyRecordRequest.builder().firstName(firstName).build();
response = publicPlayerRecordWrapper.putPlayerPublicRecordHandlerV1(PutPlayerPublicRecordHandlerV1.builder()
.namespace("<namespace>")
.userId(userId)
.key(key)
.body(record)
.build());
} catch (Exception e) {
// Do something when failed
return;
}
if (response == null) {
// Null response from server
} else {
// Do something with response when success
}
import accelbyte_py_sdk.api.cloudsave as cloudsave_service
import accelbyte_py_sdk.api.cloudsave.models as cloudsave_models
result, error = cloudsave_service.put_player_record_handler_v1(
body=cloudsave_models.ModelsPlayerRecordRequest.create(
{
"FirstName": "Doe",
"__META": {
"is_public": True,
}
}
),
key="playerInfo",
user_id="********************************",
namespace=namespace, # optional, gets the value from the global instance if unspecified
sdk=sdk, # optional, gets the global instance if unspecified
)
if error:
exit(error)
ユーザーの公開プレイヤーレコードに追加する
以下の例では、playerInfo キー内のユーザーデータに追加する方法を示します。
- Unreal Engine
- Unity
- C# Extend SDK
- Go Extend SDK
- Java Extend SDK
- Python Extend SDK
FApiClientPtr ApiClient = AccelByteOnlineSubsystemPtr->GetApiClient();
FString Key = "playerInfo";
TSharedPtr<FJsonObject> RecordRequest = MakeShareable(new FJsonObject);
RecordRequest->SetStringField("LastName", "Doe");
ApiClient->CloudSave.SaveUserRecord(Key
, *RecordRequest
, true
, FVoidHandler::CreateLambda([]()
{
// Do something if SaveUserRecord is successful
})
, FErrorHandler::CreateLambda([](int32 ErrorCode, FString ErrorMessage)
{
// Do something if SaveUserRecord has an error
}));
CloudSave cloudSave = AccelByteSDK.GetClientRegistry().GetApi().GetCloudSave();
bool isPublic = true;
string key = " playerInfo";
Dictionary<string, object> recordRequest = new Dictionary<string, object>
{
{"LastName", "Doe" }
};
cloudSave.SaveUserRecord(key, recordRequest, result =>
{
if (result.IsError)
{
// Do something if SaveUserRecord has an error
Debug.Log($"Error SaveUserRecord, Error Code: {result.Error.Code} Error Message: {result.Error.Message}");
return;
}
// Do something if SaveUserRecord is successful
}
, isPublic);
public class MyRecordRequest : ModelsPlayerRecordRequest
{
[JsonPropertyName("firstName")]
public string FirstName { get; set; } = "";
[JsonPropertyName("lastName")]
public string LastName { get; set; } = "";
}
string key = "playerInformation";
string userId = "<user-id>";
var record = new MyRecordRequest()
{
LastName = "Doe"
};
var response = sdk.Cloudsave.PublicPlayerRecord.PostPlayerPublicRecordHandlerV1Op
.Execute(record, key, sdk.Namespace, userId);
if (response != null)
{
//do something with response when success
}
publicPlayerRecordService := &cloudsave.PublicPlayerRecordService{
Client: factory.NewCloudsaveClient(&repository.ConfigRepositoryImpl{}),
TokenRepository: &repository.TokenRepositoryImpl{},
}
key := "playerInformation"
body := map[string]interface{}{
"LastName": "Doe",
}
namespace := "mygame"
userId := "myuserid"
input := &public_player_record.PostPlayerPublicRecordHandlerV1Params{
Body: body,
Key: key,
Namespace: namespace,
UserID: userId,
}
result, err := publicPlayerRecordService.PostPlayerPublicRecordHandlerV1Short(input)
@Builder
public class MyRecordRequest extends ModelsPlayerRecordRequest {
@JsonProperty("firstName")
private String firstName;
@JsonProperty("lastName")
private String lastName;
}
...
PublicPlayerRecord publicPlayerRecordWrapper = new PublicPlayerRecord(sdk);
String key = "playerInformation";
String userId = "<user-id>";
String lastName = "Doe";
ModelsPlayerRecordResponse response;
try {
var record = MyRecordRequest.builder().lastName(lastName).build();
response = publicPlayerRecordWrapper.postPlayerPublicRecordHandlerV1(PostPlayerPublicRecordHandlerV1.builder()
.namespace("<namespace>")
.userId(userId)
.key(key)
.body(record)
.build());
} catch (Exception e) {
// Do something when failed
return;
}
if (response == null) {
// Null response from server
} else {
// Do something with response when success
}
import accelbyte_py_sdk.api.cloudsave as cloudsave_service
import accelbyte_py_sdk.api.cloudsave.models as cloudsave_models
result, error = cloudsave_service.post_player_record_handler_v1(
body=cloudsave_models.ModelsPlayerRecordRequest.create(
{
"LastName": "Doe",
"__META": {
"is_public": True,
}
}
),
key="playerInformation",
namespace=namespace, # optional, gets the value from the global instance if unspecified
sdk=sdk, # optional, gets the global instance if unspecified
)
if error:
exit(error)
ゲームサーバー経由で公開プレイヤーレコードを変更する
ゲームサーバーは、公開プレイヤーレコードデータを変更するための最も多くの権限を持っています。レコードの書き込み権限の詳細については、このセクションを確認してください。
以下の例では、ゲームサーバー経由で playerTier キー内のプレイヤーレコードデータを変更する方法を示します。
- Unreal Engine
- Unity
- C# Extend SDK
- Go Extend SDK
- Java Extend SDK
- Python Extend SDK
FServerApiClientPtr ApiServer = AccelByteOnlineSubsystemPtr->GetServerApiClient();
FString Key = "playerTier";
FString UserId = "Player User Id";
ESetByMetadataRecord SetBy = ESetByMetadataRecord::SERVER;
TSharedPtr<FJsonObject> RecordRequest = MakeShareable(new FJsonObject);
RecordRequest->SetStringField("Rank", "Diamond");
ApiServer->ServerCloudSave.ReplaceUserRecord(Key
, SetBy
, true
, UserId
, *RecordRequest
, FVoidHandler::CreateLambda([]()
{
// Do something if ReplaceUserRecord is successful
})
, FErrorHandler::CreateLambda([](int32 ErrorCode, FString ErrorMessage)
{
// Do something if ReplaceUserRecord has an error
}));
ServerCloudSave serverCloudSave = AccelByteSDK.GetServerRegistry().GetApi().GetCloudSave();
bool isPublic = true;
string key = "playerTier";
string userId = "Player User Id";
RecordSetBy setBy = RecordSetBy.SERVER;
Dictionary<string, object> recordRequest = new Dictionary<string, object>
{
{"Rank", "Diamond"}
};
serverCloudSave.ReplaceUserRecord(userId, key, recordRequest, setBy, isPublic, result =>
{
if (result.IsError)
{
// Do something if ReplaceUserRecord has an error
Debug.Log($"Error ReplaceUserRecord, Error Code: {result.Error.Code} Error Message: {result.Error.Message}");
return;
}
// Do something if ReplaceUserRecord is successful
});
string key = "playerInformation";
string userId = "<user-id>";
var serverRecord = new MyRecordRequestWithMeta()
{
RecordMeta = new MyRecordRequestWithMeta.Meta()
{
SetBy = "SERVER",
IsPublic = true
},
FirstName = "Jack"
};
var response = sdk.Cloudsave.AdminPlayerRecord.AdminPutPlayerRecordHandlerV1Op
.Execute(serverRecord, key, sdk.Namespace, userId);
if (response != null)
{
//do something with response when success
}
adminPlayerRecordService := &cloudsave.AdminPlayerRecordService{
Client: factory.NewCloudsaveClient(&repository.ConfigRepositoryImpl{}),
TokenRepository: &repository.TokenRepositoryImpl{},
}
key := "playerTier"
body := map[string]interface{}{
"Rank": "Diamond",
"__META": map[string]interface{}{
"set_by":"SERVER",
"is_public": true,
},
}
namespace := "mygame"
userId := "myuserid"
input := &admin_player_record.AdminPutPlayerRecordHandlerV1Params{
Body: body,
Key: key,
Namespace: namespace,
UserID: userId,
}
result, err := adminPlayerRecordService.AdminPutPlayerRecordHandlerV1Short(input)
AdminPlayerRecord adminPlayerRecordWrapper = new AdminPlayerRecord(sdk);
String key = "playerInformation";
String userId = "<user-id>";
String firstName = "Jack";
ModelsPlayerRecordResponse response;
try {
var serverRecord = MyRecordRequestWithMeta
.builder()
.firstName(firstName)
.RecordMeta(MyRecordRequestWithMeta.Meta.builder()
.setBy("SERVER")
.isPublic(true)
.build())
.build();
response = adminPlayerRecordWrapper.adminPutPlayerRecordHandlerV1(AdminPutPlayerRecordHandlerV1.builder()
.namespace("<namespace>")
.userId(userId)
.key(key)
.body(serverRecord)
.build());
} catch (Exception e) {
// Do something when failed
return;
}
if (response == null) {
// Null response from server
} else {
// Do something with response when success
}
import accelbyte_py_sdk.api.cloudsave as cloudsave_service
import accelbyte_py_sdk.api.cloudsave.models as cloudsave_models
result, error = cloudsave_service.admin_put_player_record_handler_v1(
body=cloudsave_models.ModelsPlayerRecordRequest.create(
{
"Rank": "Diamond",
"__META": {
"set_by": "SERVER",
"is_public": True,
}
}
),
key="playerTier",
user_id="********************************",
namespace=namespace, # optional, gets the value from the global instance if unspecified
sdk=sdk, # optional, gets the global instance if unspecified
)
if error:
exit(error)
特定のユーザーの公開プレイヤーレコードを削除する
公開プレイヤーレコードデータを削除することもできます。プレイヤーレコードデータの削除は、ゲームクライアントまたはゲームサーバーから実行できます。
ゲームクライアント経由でユーザーの公開プレイヤーレコードを削除する
以下の例では、ゲームクライアント経由で playerInfo キーを持つユーザーレコードデータを削除する方法を示します。
- Unreal Engine
- Unity
- C# Extend SDK
- Go Extend SDK
- Java Extend SDK
- Python Extend SDK
FApiClientPtr ApiClient = AccelByteOnlineSubsystemPtr->GetApiClient();
FString Key = "playerInfo";
ApiClient->CloudSave.DeleteUserRecord(Key
, FVoidHandler::CreateLambda([]()
{
// Do something if DeleteUserRecord is successful
})
, FErrorHandler::CreateLambda([](int32 ErrorCode, FString ErrorMessage)
{
// Do something if DeleteUserRecord has an error
}));
CloudSave cloudSave = AccelByteSDK.GetClientRegistry().GetApi().GetCloudSave();
string key = "playerInfo";
cloudSave.DeleteUserRecord(key, result =>
{
if (result.IsError)
{
// Do something if DeleteUserRecord has an error
Debug.Log($"Error DeleteUserRecord, Error Code: {result.Error.Code} Error Message: {result.Error.Message}");
return;
}
// Do something if DeleteUserRecord is successful
});
string key = "playerInformation";
sdk.Cloudsave.PublicPlayerRecord.PublicDeletePlayerPublicRecordHandlerV1Op
.Execute(key, sdk.Namespace);
publicPlayerRecordService := &cloudsave.PublicPlayerRecordService{
Client: factory.NewCloudsaveClient(&repository.ConfigRepositoryImpl{}),
TokenRepository: &repository.TokenRepositoryImpl{},
}
key := "playerInformation"
namespace := "mygame"
input := &public_player_record.PublicDeletePlayerPublicRecordHandlerV1Params{
Key: key,
Namespace: namespace,
}
err := publicPlayerRecordService.PublicDeletePlayerPublicRecordHandlerV1Short(input)
final PublicPlayerRecord publicPlayerRecordWrapper = new PublicPlayerRecord(sdk);
String key = "playerInformation";
try {
publicPlayerRecordWrapper.publicDeletePlayerPublicRecordHandlerV1(PublicDeletePlayerPublicRecordHandlerV1.builder()
.namespace("<namespace>")
.key(key)
.build());
} catch (Exception e) {
// Do something when failed
return;
}
import accelbyte_py_sdk.api.cloudsave as cloudsave_service
import accelbyte_py_sdk.api.cloudsave.models as cloudsave_models
result, error = cloudsave_service.delete_player_record_handler_v1(
key="playerInfo",
user_id="********************************",
namespace=namespace, # optional, gets the value from the global instance if unspecified
sdk=sdk, # optional, gets the global instance if unspecified
)
if error:
exit(error)
ゲームサーバー経由でユーザーの公開プレイヤーレコードを削除する
以下の例では、ゲームサーバー経由で playerTier キーを持つユーザーレコードデータを削除する方法を示します。
- Unreal Engine
- Unity
- C# Extend SDK
- Go Extend SDK
- Java Extend SDK
- Python Extend SDK
FServerApiClientPtr ApiServer = AccelByteOnlineSubsystemPtr->GetServerApiClient();
FString Key = "playerTier";
FString UserId = "Player User Id";
ApiServer->ServerCloudSave.DeleteUserRecord(Key
, UserId
, true
, FVoidHandler::CreateLambda([]()
{
// Do something if DeleteUserRecord is successful
})
, FErrorHandler::CreateLambda([](int32 ErrorCode, FString ErrorMessage)
{
// Do something if DeleteUserRecord has an error
}));
ServerCloudSave serverCloudSave = AccelByteSDK.GetServerRegistry().GetApi().GetCloudSave();
string key = "playerTier";
string userId = "Player User Id";
serverCloudSave.DeleteUserRecord(userId, key, result =>
{
if (result.IsError)
{
// Do something if DeleteUserRecord has an error
Debug.Log($"Error DeleteUserRecord, Error Code: {result.Error.Code} Error Message: {result.Error.Message}");
return;
}
// Do something if DeleteUserRecord is successful
});
string key = "playerInformation";
string userId = "<user-id>";
sdk.Cloudsave.AdminPlayerRecord.AdminDeletePlayerPublicRecordHandlerV1Op
.Execute(key, sdk.Namespace, userId);
adminPlayerRecordService := &cloudsave.AdminPlayerRecordService{
Client: factory.NewCloudsaveClient(&repository.ConfigRepositoryImpl{}),
TokenRepository: &repository.TokenRepositoryImpl{},
}
key := "playerInformation"
namespace := "mygame"
userId := "myuserid"
input := &admin_player_record.AdminDeletePlayerPublicRecordHandlerV1Params{
Key: key,
Namespace: namespace,
UserID: userId,
}
err := adminPlayerRecordService.AdminDeletePlayerPublicRecordHandlerV1Short(input)
AdminPlayerRecord adminPlayerRecordWrapper = new AdminPlayerRecord(sdk);
String key = "playerInformation";
String userId = "<user-id>";
try {
adminPlayerRecordWrapper.adminDeletePlayerPublicRecordHandlerV1(AdminDeletePlayerPublicRecordHandlerV1.builder()
.namespace("<namespace>")
.userId(userId)
.key(key)
.build());
} catch (Exception e) {
// Do something when failed
return;
}
import accelbyte_py_sdk.api.cloudsave as cloudsave_service
import accelbyte_py_sdk.api.cloudsave.models as cloudsave_models
result, error = cloudsave_service.admin_delete_player_record_handler_v1(
key="playerTier",
user_id="********************************",
namespace=namespace, # optional, gets the value from the global instance if unspecified
sdk=sdk, # optional, gets the global instance if unspecified
)
if error:
exit(error)