Storing Player Attributes in Public Records
概要
クラウドセーブサービスでは、プレイヤーのデータを公開保存できます。公開保存とは、特定のプレイヤーのデータを他のプレイヤーから読み取れるようにするということです。JSON 形式で保存したすべてのデータを取得、変更、削除できます。
保存されているデータは通常は機密性の低いデータであり、他のプレイヤーに公開されても問題はありません。また、このデータに関するプライバシー規則はありません。たとえば、次のようなデータを保存します。
- プレイヤーのプロファイルデータ (プレイヤーのステータス、プレイヤー情報、ジョブ、ロール、ティア、レベルなど)
- プレイヤーがカスタマイズした武器装備など
このガイドでは、プレイヤーレコードを活用してプレイヤーデータを公開保存し、それをゲームクライアント内で表示し、ゲームのユースケースに従って変更する方法を説明します。
目標
このセクションの目標は次のとおりです。
- 公開プレイヤーレコードについての説明と概要を示す。
- 公開プレイヤーレコードにプレイヤーデータを保存する方法を説明する。
- 公開プレイヤーレコードを表示する方法を説明する。
- 公開プレイヤーレコードを変更する方法を説明する。
- 公開プレイヤーレコードを削除する方法を説明する。
- AccelByte SDK を使用して公開プレイヤーレコードを活用する方法を説明する。
前提条件
以下へのアクセスが必要になります。
- 管理者ポータル
- AccelByte UnrealまたはUnity SDK (次の必要な権限を含む)
- クライアント ID
- クライアントの秘密
- AccelByte Save API ドキュメント
公開プレイヤーレコードへのユーザーデータの保存
ゲームではユーザーデータを保存することが重要です。なぜなら、データを保存することで、プレイヤーはプレイするたびに最初から始める必要がなくなり、ゲーム体験をより楽しいものにできるからです。
クラウドセーブの公開プレイヤーレコードを保存する方法は 2 つあり、ゲームのユースケースに基づいて選択できます。
- ゲームクライアントを介して保存:保存されたデータはゲームクライアントとゲームサーバーの両方から変更できる。
- ゲームサーバーを介して保存:ゲームサーバーを介して保存されたデータは、ゲームサーバーからしか変更できない。
上記 2 つの手法における唯一の違いは、レコードに割り当てることができる書き込み権限です。レコードの書き込み権限の詳細については、こちらのセクション を確認してください。
ゲームクライアントを介した公開プレイヤーレコードへのユーザーデータの保存
この保存方法は、たとえば、プレイヤーの武器装備といったプレイヤー情報などのデータを保存するのに適しています。
次の例では、ゲームクライアントを介して、playerInformation キー内にユーザーデータを保存する方法を示しています。
注意:キーが既に存在する場合、新しいデータは既存のレコードに追加されます。
- Unreal Engine
- Unity
FApiClientPtr ApiClient = FMultiRegistry::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 been successful
})
, FErrorHandler::CreateLambda([](int32 ErrorCode, FString ErrorMessage)
{
// Do something if SaveUserRecord has an error
}));
CloudSave cloudSave = MultiRegistry.GetApiClient().GetCloudSave();
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 an error
Debug.Log($"Error SaveUserRecord, Error Code: {result.Error.Code} Error Message: {result.Error.Message}");
}
else
{
// Do something if SaveUserRecord been successful
}
}
, true);
ゲームサーバーを介した公開プレイヤーレコードへのユーザーデータの保存
この保存方法は、プレイヤーのランクやティアなど、特定のゲームロジックにより更新されるものの、プレイヤーに手動でトリガーされることのないデータの保存に適しています。
次の例では、ゲームサーバーを介して、playerTier キー内にユーザーデータを保存する方法を示しています。
- Unreal Engine
- Unity
FServerApiClientPtr ApiServer = FMultiRegistry::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 been successful
})
, FErrorHandler::CreateLambda([](int32 ErrorCode, FString ErrorMessage)
{
// Do something if SaveUserRecord has an error
}));
ServerCloudSave serverCloudSave = MultiRegistry.GetServerApiClient().GetCloudSave();
string key = "playerTier";
string userId = "Player User Id";
RecordSetBy setBy = RecordSetBy.SERVER;
Dictionary<string, object> recordRequest = new Dictionary<string, object>
{
{"Rank", "Legend" }
};
serverCloudSave.SaveUserRecord(userId
, key
, recordRequest
, setBy
, true
, 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
}
});
公開プレイヤーレコードのデータの表示
ゲームのユースケースに基づいて、保存したレコードを取得して表示できます。プレイヤーレコードを表示する一般的なアプローチは 2 つあり、いずれもレコードの所有者に基づいています。
- 自分の公開プレイヤーレコード(自分のプレイヤー情報ページなど)
- 他のユーザーの公開プレイヤーレコード(他のユーザーのプレイヤー情報ページなど)
自分の公開プレイヤーレコードの表示
次の例は、playerInfo キー内のユーザーデータを取得する方法を示しています。
- Unreal Engine
- Unity
FApiClientPtr ApiClient = FMultiRegistry::GetApiClient();
FString Key = "playerInfo";
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 = "playerInfo";
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
}
});
他のユーザーが所有する公開プレイヤーレコードの表示
公開ユーザーレコードは、他のユーザーも取得できます。次の例は、playerInfo キー内にある、他のユーザーが所有するプレイヤーレコードのデータの取得方法を示しています。
- Unreal Engine
- Unity
FApiClientPtr ApiClient = FMultiRegistry::GetApiClient();
FString Key = "playerInfo";
FString UserId = "Player User Id";
ApiClient->CloudSave.GetPublicUserRecord(Key
, UserId
, THandler<FAccelByteModelsUserRecord>::CreateLambda([](FAccelByteModelsUserRecord Result)
{
// Do something if GetPublicUserRecord been successful
})
, FErrorHandler::CreateLambda([](int32 ErrorCode, FString ErrorMessage)
{
// Do something if GetPublicUserRecord has an error
}));
CloudSave cloudSave = MultiRegistry.GetApiClient().GetCloudSave();
string key = "playerInfo";
string userId = "Player User Id";
cloudSave.GetPublicUserRecord(key
, userId
, result =>
{
if (result.IsError)
{
// Do something if GetPublicUserRecord an error
Debug.Log($"Error GetPublicUserRecord, Error Code: {result.Error.Code} Error Message: {result.Error.Message}");
}
else
{
// Do something if GetPublicUserRecord been successful
}
});
公開プレイヤーレコードのデータの変更
プレイヤーレコードのデータは、ゲームのユースケースに基づいて変更できます。クラウドセーブの公開プレイヤーレコードを変更する方法は 2 つあり、ユースケースに基づいて選択可能です。
1.ゲームクライアントを介して変更します。これは、プレイヤーが自分のプレイヤーレコードを変更できるようにする場合に適しています。たとえば、ユーザーがプレイヤー情報を更新する場合などです。
2.ゲームサーバーを介して変更します。これは、ゲームサーバーしかプレイヤーレコードを変更できないようにする場合に適しています。たとえば、ゲームサーバーがプレイヤーに新しいランクやティアを割り当てる場合などです。
ゲームクライアントを介した公開プレイヤーレコードの変更
公開プレイヤーレコードを変更するには、2 つの手法があります。
置換:データ全体を新しい内容に置き換えたい場合に適しています。レコードが存在しない場合は、その新しいデータに基づいて作成されます。レコードが既に存在する場合は、そのすべてを置き換えます。
追加:プレイヤーレコードに新しいキーと値のみを追加したい場合に適しています。置換に比べて軽いプロセスで実行できます。
ユーザーの公開プレイヤーレコードの置換
次の例は、playerInfo キー内のユーザーデータを置き換える方法を示しています。
- Unreal Engine
- Unity
FApiClientPtr ApiClient = FMultiRegistry::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 been successful
})
, FErrorHandler::CreateLambda([](int32 ErrorCode, FString ErrorMessage)
{
// Do something if ReplaceUserRecord has an error
}));
CloudSave cloudSave = MultiRegistry.GetApiClient().GetCloudSave();
string key = "playerInfo";
Dictionary<string, object> recordRequest = new Dictionary<string, object>
{
{"FirstName", "Doe" }
};
cloudSave.ReplaceUserRecord(key
, true
, 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
}
});
ユーザーの公開プレイヤーレコードの追加
次の例は、playerInfo キー内にユーザーデータを追加する方法を示しています。
- Unreal Engine
- Unity
FApiClientPtr ApiClient = FMultiRegistry::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 been successful
})
, FErrorHandler::CreateLambda([](int32 ErrorCode, FString ErrorMessage)
{
// Do something if SaveUserRecord has an error
}));
CloudSave cloudSave = MultiRegistry.GetApiClient().GetCloudSave();
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 an error
Debug.Log($"Error SaveUserRecord, Error Code: {result.Error.Code} Error Message: {result.Error.Message}");
}
else
{
// Do something if SaveUserRecord been successful
}
}
, true);
ゲームサーバーを介した公開プレイヤーレコードの変更
ゲームサーバーは、公開プレイヤーレコードのデータを変更するための権限を、最も多く有しています。レコードの書き込み権限の詳細については、こちらのセクション を確認してください。
次の例では、ゲームサーバーを介して playerTier キー内にあるプレイヤーレコードのデータを変更する方法を示しています。
- Unreal Engine
- Unity
FServerApiClientPtr ApiServer = FMultiRegistry::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 been successful
})
, FErrorHandler::CreateLambda([](int32 ErrorCode, FString ErrorMessage)
{
// Do something if ReplaceUserRecord has an error
}));
ServerCloudSave serverCloudsave = MultiRegistry.GetServerApiClient().GetCloudSave();
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
, true
, 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
}
});
特定のユーザーが所有する公開プレイヤーレコードの削除
公開プレイヤーレコードのデータは削除することもできます。プレイヤーレコードのデータの削除は、ゲームクライアントまたはゲームサーバーから行えます。
ゲームクライアントを介したユーザーの公開プレイヤーレコードの削除
次の例は、ゲームクライアントを介して playerInfo キーでユーザーレコードデータを削除する方法を示しています。
- Unreal Engine
- Unity
FApiClientPtr ApiClient = FMultiRegistry::GetApiClient();
FString Key = "playerInfo";
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 = "playerInfo";
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
}
});
ゲームサーバーを介したユーザーの公開プレイヤーレコードの削除
次の例では、ゲームサーバーを介して、playerTier キーでユーザーレコードのデータを削除する方法を示しています。
- Unreal Engine
- Unity
FServerApiClientPtr ApiServer = FMultiRegistry::GetServerApiClient();
FString Key = "playerTier";
FString UserId = "Player User Id";
ApiServer->ServerCloudSave.DeleteUserRecord(Key
, UserId
, true
, 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 = "playerTier";
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
}
});