プレイヤー属性を非公開レコードに保存する
注釈:本資料はAI技術を用いて翻訳されています。
概要
Cloud Save サービスを使用すると、プレイヤーのデータを非公開で保存できます。非公開保存とは、プレイヤーが他のプレイヤーの特定のデータを読み取ることができないことを意味します。
保存されるデータは通常、他のプレイヤーに関連しない情報、または機密情報である可能性があり、JSON 形式で保存されます。例えば、以下のようなデータを保存します。
- キーバインディング、グラフィック品質、オーディオ設定などのプレイヤーの個人設定
- RPG ゲームのキャラクターの最後の位置など、特定のユースケースのためのプレイヤー固有の情報
このガイドでは、プレイヤーのデータを非公開で保存し、ゲームクライアント内で表示し、ゲームのユースケースに応じて変更する方法を学びます。
目標
- 非公開プレイヤーレコードの概要を理解する
- 非公開プレイヤーレコードにプレイヤーデータを保存する方法を理解する
- 非公開プレイヤーレコードを表示する方法を理解する
- 非公開プレイヤーレコードを変更する方法を理解する
- 非公開プレイヤーレコードを削除する方法を理解する
- AccelByte SDK を使用して非公開プレイヤーレコードを活用する方法を学ぶ
前提条件
以下へのアクセスが必要です。
- 管理ポータル
- AccelByte Unreal、Unity、または Extend SDK(必要な権限を含む)
- クライアント ID
- クライアントシークレット
- AccelByte Cloud Save API ドキュメント
非公開プレイヤーレコードにユーザーデータを保存する
ユーザーデータの保存はゲームにとって重要です。これにより、プレイヤーは毎回最初からやり直す必要がなくなり、ゲーム体験がより楽しくなります。
Cloud Save 非公開プレイヤーレコードを保存する 2 つの方法があります。
- ゲームクライアント経由で保存。保存されたデータは、ゲームクライアントまたはゲームサーバーの両方から変更できます。
- ゲームサーバー経由で保存。ゲームサーバー経由で保存されたデータは、ゲームサーバーのみが変更できます。
上記の 2 つの方法の唯一の違いは、レコードに割り当てることができる書き込み権限です。レコードの書き込み権限の詳細については、このセクションを確認してください。
ゲームクライアント経由で非公開プレイヤーレコードにユーザーデータを保存する
これは、他のプレイヤーに関連しないプレイヤーデータを保存するのに適しており、レコードの所有者がデータを変更できます。例えば、プレイヤーのグラフィック品質設定、キーバインディングなどを保存します。
この例では、ゲームクライアント経由で graphicQuality キー内にユーザーデータを保存する方法を示します。キーが既に存在する場合、新しいレコードは既存のレコードに追加されることに注意してください。
- Unreal
- Unity
- C# Extend SDK
- Go Extend SDK
- Java Extend SDK
- Python Extend SDK
FApiClientPtr ApiClient = AccelByteOnlineSubsystemPtr->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 is successful
})
, FErrorHandler::CreateLambda([](int32 ErrorCode, FString ErrorMessage)
{
// Do something if SaveUserRecord has an error
}));
CloudSave cloudSave = AccelByteSDK.GetClientRegistry().GetApi().GetCloudSave();
bool isPublic = false;
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 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);
// 0 Low Quality, 1 Medium Quality, 2 High Quality
public class MyGraphicQuality : ModelsPlayerRecordRequest
{
[JsonPropertyName("textures")]
public int Textures { get; set; } = 0;
[JsonPropertyName("shadow")]
public int Shadow { get; set; } = 0;
[JsonPropertyName("lighting")]
public int Lighting { get; set; } = 0;
[JsonPropertyName("post-processing")]
public int PostProcessing { get; set; } = 0;
}
string key = "graphicQuality";
string userId = "<user-id>";
var record = new MyGraphicQuality()
{
Textures = 0,
Shadow = 2,
Lighting = 1,
PostProcessing = 2
};
var response = sdk.Cloudsave.PublicPlayerRecord.PostPlayerRecordHandlerV1Op
.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 := "graphicQuality"
body := map[string]interface{}{
"textures": 0,
"shadow": 2,
"lighting": 1,
"post-precessing": 2,
}
namespace := "mygame"
userId := "myuserid"
input := &public_player_record.PostPlayerRecordHandlerV1Params{
Body: body,
Key: key,
Namespace: namespace,
UserID: userId,
}
result, err := publicPlayerRecordService.PostPlayerRecordHandlerV1Short(input)
@Builder
public class MyGraphicQuality extends ModelsPlayerRecordRequest {
@JsonProperty("textures")
public int textures;
@JsonProperty("shadow")
public int shadow;
@JsonProperty("lighting")
public int lighting;
@JsonProperty("post-processing")
public int postProcessing;
}
...
final PublicPlayerRecord publicPlayerRecordWrapper = new PublicPlayerRecord(sdk);
String key = "graphicQuality";
String userId = "<user-id>";
var record = MyGraphicQuality.builder()
.textures(0)
.shadow(2)
.lighting(1)
.postProcessing(2)
.build();
ModelsPlayerRecordResponse response;
try {
response = publicPlayerRecordWrapper.postPlayerRecordHandlerV1(PostPlayerRecordHandlerV1.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(
{
# 0 Low Quality, 1 Medium Quality, 2 High Quality
"textures": 0,
"shadow": 2,
"lighting": 1,
"post-processing": 2,
"__META": {
"is_public": False,
}
}
),
key="graphicQuality",
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)
ゲームサーバー経由で非公開プレイヤーレコードにユーザーデータを保存する
これは、他のプレイヤーに関連しないプレイヤーデータを保存するのに適しており、データはレコードの所有者が編集できません。例えば、プレイヤーがゲームを終了する前のキャラクターの最後の位置を保存し、プレイヤーがゲームを起動したときに最後の位置を読み込むようにします。
以下の例では、ゲームサーバー経由で characterLocation キー内にユーザーデータを保存する方法を示します。
- Unreal
- Unity
- C# Extend SDK
- Go Extend SDK
- Java Extend SDK
- Python Extend SDK
FServerApiClientPtr ApiServer = AccelByteOnlineSubsystemPtr->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 is successful
})
, FErrorHandler::CreateLambda([](int32 ErrorCode, FString ErrorMessage)
{
// Do something if SaveUserRecord has an error
}));
ServerCloudSave serverCloudSave = AccelByteSDK.GetServerRegistry().GetApi().GetCloudSave();
bool isPublic = false;
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, 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}");
}
else
{
// Do something if SaveUserRecord is successful
}
});
public class MyCharacterLocation : 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("lastLocation")]
public string LastLocation { get; set; } = "";
}
string key = "characterLocation";
string userId = "<user-id>";
var serverRecord = new MyCharacterLocation()
{
RecordMeta = new MyCharacterLocation.Meta()
{
SetBy = "SERVER",
IsPublic = false
},
LastLocation = "x:120,y:200"
};
var response = sdk.Cloudsave.AdminPlayerRecord.AdminPostPlayerRecordHandlerV1Op
.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 := "characterLocation"
body := map[string]interface{}{
"LastLocation": "x:120,y:200",
"__META": map[string]interface{}{
"set_by":"SERVER",
"is_public": false,
},
}
namespace := "mygame"
userId := "myuserid"
input := &admin_player_record.AdminPostPlayerRecordHandlerV1Params{
Body: body,
Key: key,
Namespace: namespace,
UserID: userId,
}
result, err := adminPlayerRecordService.AdminPostPlayerRecordHandlerV1Short(input)
@Builder
public class MyCharacterLocation extends ModelsPlayerRecordRequest {
@Builder
public class Meta
{
@JsonProperty("set_by")
public String setBy;
@JsonProperty("is_public")
public boolean isPublic;
}
@JsonProperty("__META")
public Meta RecordMeta;
@JsonProperty("lastLocation")
public String lastLocation;
}
...
final AdminPlayerRecord adminPlayerRecordWrapper = new AdminPlayerRecord(sdk);
String key = "characterLocation";
String userId = "<user-id>";
var record = MyCharacterLocation.builder()
.lastLocation("x:120,y:200")
.RecordMeta(MyCharacterLocation.Meta.builder()
.setBy("SERVER")
.isPublic(false)
.build())
.build();
ModelsPlayerRecordResponse response;
try {
response = adminPlayerRecordWrapper.adminPostPlayerRecordHandlerV1(AdminPostPlayerRecordHandlerV1.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.admin_post_player_record_handler_v1(
body=cloudsave_models.ModelsPlayerRecordRequest.create(
{
"LastLocation": ""x:120,y:200",
"__META": {
"set_by": "SERVER",
"is_public": False,
}
}
),
key="characterLocation",
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)
非公開プレイヤーレコードデータを表示する
保存された非公開プレイヤーレコードは、レコードの所有者のみが取得できます。データを取得した後、ゲームのユースケースをサポートするために、好きなことができます。例えば、グラフィック品質設定をインポートしたり、キーバインディング設定をインポートしたりできます。
- Unreal
- Unity
- C# Extend SDK
- Go Extend SDK
- Java Extend SDK
- Python Extend SDK
FApiClientPtr ApiClient = AccelByteOnlineSubsystemPtr->GetApiClient();
FString Key = "graphicQuality";
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 = "graphicQuality";
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 = "graphicQuality";
string userId = "<user-id>";
var response = sdk.Cloudsave.PublicPlayerRecord.GetPlayerRecordHandlerV1Op
.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 := "graphicQuality"
namespace := "mygame"
userId := "myuserid"
input := &public_player_record.GetPlayerRecordHandlerV1Params{
Key: key,
Namespace: namespace,
UserID: userId,
}
result, err := publicPlayerRecordService.GetPlayerRecordHandlerV1Short(input)
final PublicPlayerRecord publicPlayerRecordWrapper = new PublicPlayerRecord(sdk);
String key = "graphicQuality";
String userId = "<user-id>";
ModelsPlayerRecordResponse response;
try {
response = publicPlayerRecordWrapper.getPlayerRecordHandlerV1(GetPlayerRecordHandlerV1.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 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.get_player_record_handler_v1(
key="graphicQuality",
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 つの方法があります。
- 置換:データ全体を新しいコンテンツに置き換えたい場合に適しています。レコードが存在しない場合は、新しいデータに基づいて作成され、レコードが既に存在する場合は、レコード全体を置き換えます。
- 追加:プレイヤーレコードに新しいキーと値のみを追加したい場合に適しています。このプロセスは、置換と比較して軽量です。
ユーザーの非公開プレイヤーレコードを置換する
以下の例では、graphicQuality キー内のユーザーデータを置換する方法を示します。
- Unreal
- Unity
- C# Extend SDK
- Go Extend SDK
- Java Extend SDK
- Python Extend SDK
FApiClientPtr ApiClient = AccelByteOnlineSubsystemPtr->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 is successful
})
, FErrorHandler::CreateLambda([](int32 ErrorCode, FString ErrorMessage)
{
// Do something if ReplaceUserRecord has an error
}));
CloudSave cloudSave = AccelByteSDK.GetClientRegistry().GetApi().GetCloudSave();
bool isPublic = false;
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, 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 = "graphicQuality";
string userId = "<user-id>";
var record = new MyGraphicQuality()
{
Textures = 2,
Shadow = 2,
Lighting = 2,
PostProcessing = 2
};
var response = sdk.Cloudsave.PublicPlayerRecord.PutPlayerRecordHandlerV1Op
.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 := "graphicQuality"
body := map[string]interface{}{
"textures": 2,
"shadow": 2,
"lighting": 2,
"post-precessing": 2,
}
namespace := "mygame"
userId := "myuserid"
input := &public_player_record.PutPlayerRecordHandlerV1Params{
Body: body,
Key: key,
Namespace: namespace,
UserID: userId,
}
result, err := publicPlayerRecordService.PutPlayerRecordHandlerV1Short(input)
final PublicPlayerRecord publicPlayerRecordWrapper = new PublicPlayerRecord(sdk);
String key = "graphicQuality";
String userId = "<user-id>";
var record = MyGraphicQuality.builder()
.textures(0)
.shadow(2)
.lighting(2)
.postProcessing(2)
.build();
ModelsPlayerRecordResponse response;
try {
response = publicPlayerRecordWrapper.putPlayerRecordHandlerV1(PutPlayerRecordHandlerV1.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 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(
{
# 0 Low Quality, 1 Medium Quality, 2 High Quality
"textures": 2,
"shadow": 2,
"lighting": 2,
"post-processing": 2,
"__META": {
"is_public": False,
}
}
),
key="graphicQuality",
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)
ユーザーの非公開プレイヤーレコードに追加する
以下の例では、graphicQuality キー内のユーザーデータに追加する方法を示します。
- Unreal
- Unity
- C# Extend SDK
- Go Extend SDK
- Java Extend SDK
- Python Extend SDK
FApiClientPtr ApiClient = AccelByteOnlineSubsystemPtr->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 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 = " grapicQuality";
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);
string key = "graphicQuality";
string userId = "<user-id>";
var record = new MyGraphicQuality()
{
Blur = 2
};
var response = sdk.Cloudsave.PublicPlayerRecord.PostPlayerRecordHandlerV1Op
.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 := "graphicQuality"
body := map[string]interface{}{
"blur": 2,
}
namespace := "mygame"
userId := "myuserid"
input := &public_player_record.PostPlayerRecordHandlerV1Params{
Body: body,
Key: key,
Namespace: namespace,
UserID: userId,
}
result, err := publicPlayerRecordService.PostPlayerRecordHandlerV1Short(input)
final PublicPlayerRecord publicPlayerRecordWrapper = new PublicPlayerRecord(sdk);
String key = "graphicQuality";
String userId = "<user-id>";
var record = MyGraphicQuality.builder()
.lighting(2)
.build();
ModelsPlayerRecordResponse response;
try {
response = publicPlayerRecordWrapper.postPlayerRecordHandlerV1(PostPlayerRecordHandlerV1.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(
{
# 0 Low Quality, 1 Medium Quality, 2 High Quality
"blur": 2,
"__META": {
"is_public": False,
}
}
),
key="graphicQuality",
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)
ゲームサーバー経由で非公開プレイヤーレコードを変更する
ゲームサーバーは、非公開プレイヤーレコードデータを変更するための最も多くの権限を持っています。レコードの書き込み権限の詳細については、このセクションを確認してください。これは、ゲームサーバーのみがプレイヤーレコードを変更できるようにしたい場合に適しています。例えば、ゲームサーバーがキャラクターの最後の位置を保存します。
以下の例では、ゲームサーバー経由で characterLocation キー内のプレイヤーレコードデータを変更する方法を示します。
- Unreal
- Unity
- C# Extend SDK
- Go Extend SDK
- Java Extend SDK
- Python Extend SDK
FServerApiClientPtr ApiServer = AccelByteOnlineSubsystemPtr->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 is successful
})
, FErrorHandler::CreateLambda([](int32 ErrorCode, FString ErrorMessage)
{
// Do something if ReplaceUserRecord has an error
}));
ServerCloudSave serverCloudSave = AccelByteSDK.GetServerRegistry().GetApi().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 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 = "characterLocation";
string userId = "<user-id>";
var serverRecord = new MyCharacterLocation()
{
RecordMeta = new MyCharacterLocation.Meta()
{
SetBy = "SERVER",
IsPublic = true
},
LastLocation = "x:2330,y:8710"
};
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 := "characterLocation"
body := map[string]interface{}{
"LastLocation": "x:120,y:200",
"__META": map[string]interface{}{
"set_by":"SERVER",
"is_public": false,
},
}
namespace := "mygame"
userId := "myuserid"
input := &admin_player_record.AdminPutPlayerRecordHandlerV1Params{
Body: body,
Key: key,
Namespace: namespace,
UserID: userId,
}
result, err := adminPlayerRecordService.AdminPutPlayerRecordHandlerV1Short(input)
final AdminPlayerRecord adminPlayerRecordWrapper = new AdminPlayerRecord(sdk);
String key = "characterLocation";
String userId = "<user-id>";
var record = MyCharacterLocation.builder()
.lastLocation("x:2330,y:8710")
.RecordMeta(MyCharacterLocation.Meta.builder()
.setBy("SERVER")
.isPublic(true)
.build())
.build();
ModelsPlayerRecordResponse response;
try {
response = adminPlayerRecordWrapper.adminPutPlayerRecordHandlerV1(AdminPutPlayerRecordHandlerV1.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.admin_put_player_record_handler_v1(
body=cloudsave_models.ModelsPlayerRecordRequest.create(
{
"LastLocation": "x:2330,y:8710",
"__META": {
"set_by": "SERVER",
"is_public": False,
}
}
),
key="characterLocation",
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)
特定のユーザーの非公開プレイヤーレコードを削除する
非公開プレイヤーレコードデータを削除することもできます。プレイヤーレコードデータの削除は、ゲームクライアントまたはゲームサーバーから実行できます。
ゲームクライアント経由でユーザーの非公開プレイヤーレコードを削除する
以下の例では、ゲームクライアント経由で graphicQuality キーを持つユーザーレコードデータを削除する方法を示します。
- Unreal
- Unity
- C# Extend SDK
- Go Extend SDK
- Java Extend SDK
- Python Extend SDK
FApiClientPtr ApiClient = AccelByteOnlineSubsystemPtr->GetApiClient();
FString Key = "graphicQuality";
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 = "graphicQuality";
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 = "graphicQuality";
string userId = "<user-id>";
sdk.Cloudsave.PublicPlayerRecord.DeletePlayerRecordHandlerV1Op
.Execute(key, sdk.Namespace, userId);
publicPlayerRecordService := &cloudsave.PublicPlayerRecordService{
Client: factory.NewCloudsaveClient(&repository.ConfigRepositoryImpl{}),
TokenRepository: &repository.TokenRepositoryImpl{},
}
key := "graphicQuality"
namespace := "mygame"
userId := "myuserid"
input := &public_player_record.DeletePlayerRecordHandlerV1Params{
Key: key,
Namespace: namespace,
UserID: userId,
}
err := publicPlayerRecordService.DeletePlayerRecordHandlerV1Short(input)
final PublicPlayerRecord publicPlayerRecordWrapper = new PublicPlayerRecord(sdk);
String key = "graphicQuality";
String userId = "<user-id>";
try {
publicPlayerRecordWrapper.deletePlayerRecordHandlerV1(DeletePlayerRecordHandlerV1.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.delete_player_record_handler_v1(
key="graphicQuality",
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)
ゲームサーバー経由でユーザーの非公開プレイヤーレコードを削除する
以下の例では、ゲームサーバー経由で characterLocation キーを持つユーザーレコードデータを削除する方法を示します。
- Unreal
- Unity
- C# Extend SDK
- Go Extend SDK
- Java Extend SDK
- Python Extend SDK
FServerApiClientPtr ApiServer = AccelByteOnlineSubsystemPtr->GetServerApiClient();
FString Key = "characterLocation";
FString UserId = "Player User Id";
ApiServer->ServerCloudSave.DeleteUserRecord(Key
, UserId
, false
, 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 = "characterLocation";
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 = "characterLocation";
string userId = "<user-id>";
sdk.Cloudsave.AdminPlayerRecord.AdminDeletePlayerRecordHandlerV1Op
.Execute(key, sdk.Namespace, userId);
adminPlayerRecordService := &cloudsave.AdminPlayerRecordService{
Client: factory.NewCloudsaveClient(&repository.ConfigRepositoryImpl{}),
TokenRepository: &repository.TokenRepositoryImpl{},
}
key := "graphicQuality"
namespace := "mygame"
userId := "myuserid"
input := &admin_player_record.AdminDeletePlayerRecordHandlerV1Params{
Key: key,
Namespace: namespace,
UserID: userId,
}
err := adminPlayerRecordService.AdminDeletePlayerRecordHandlerV1Short(input)
final AdminPlayerRecord adminPlayerRecordWrapper = new AdminPlayerRecord(sdk);
String key = "graphicQuality";
String userId = "<user-id>";
try {
adminPlayerRecordWrapper.adminDeletePlayerRecordHandlerV1(AdminDeletePlayerRecordHandlerV1.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="characterLocation",
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)