実績をロック解除する
注釈:本資料はAI技術を用いて翻訳されています。
概要
AccelByte Gaming Services (AGS) の実績サービスを使用すると、ゲームのニーズに応じてユーザー実績をロック解除するさまざまな方法を選択できます。ユーザー実績のロック解除は、設定した実績設定に依存します。非段階型実績のみを手動でロック解除できます。段階型実績の場合、プレイヤーが実績の目標値を既に達成している場合、自動的にロック解除されます。
このガイドでは、実績サービスのロック解除プロセスがどのように機能するかを学習します。
目標
- 実績をロック解除するために AccelByte SDK を利用する方法を説明する。
前提条件
- AGS 管理ポータルへのアクセス。
- AccelByte Unreal、Unity、または Extend SDK(以下の権限を含む):
- Client ID
- Client Secret
- AccelByte Achievement API ドキュメントへのアクセス。
- 必要な情報を設定するための AccelByte Statistics API へのアクセス。
実績をロック解除する
プレイヤーの実績をロック解除するには、ゲームクライアントから、またはゲーム専用サーバーからの2つの方法があります。
ゲームクライアントから実績をロック解除する
このロック解除プロセスは、プレイヤーの初回ログイン、プレイヤーの初回友達招待など、ゲームプレイに影響を与えない実績をロック解除するのに適しています。
このロック解除プロセスは、非段階型実績設定にのみ使用できます。
実績をロック解除するには、achievementCode を知っている必要があります。その実績コードと次の関数を使用して実績をロック解除できます:
- Unreal
- Unity
- C# Extend SDK
- Go Extend SDK
- Java Extend SDK
- Python Extend SDK
FString AchievementCode = FString("MyAchievementCode");
auto ApiClient = AccelByteOnlineSubsystemPtr->GetApiClient();
auto AchievementApi = ApiClient->GetAchievementApi().Pin();
AchievementApi->UnlockAchievement(AchievementCode, FVoidHandler::CreateLambda([]()
{
// Do something if UnlocKAchievement is successful
}), FErrorHandler:: CreateLambda([](int32 ErrorCode, const FString& ErrorMessage)
{
// Do something if UnlockAchievement has an error
}));
var achievement = AccelByteSDK.GetClientRegistry().GetApi().GetAchievement();
string achievementCode = "MyAchievementCode";
achievement.UnlockAchievement(achievementCode, result =>
{
if (result.IsError)
{
// Do something if UnlockAchievement has an error
Debug.Log($"Error UnlockAchievement, Error Code: {result.Error.Code} Error Message: {result.Error.Message}");
return;
}
// Do something if UnlockAchievement is successful
});
string achievementCode = "<achievement-code>";
string userId = "<user-id>";
sdk.Achievement.UserAchievements.PublicUnlockAchievementOp
.Execute(achievementCode, sdk.Namespace, userId);
userAchievementsService := &achievement.UserAchievementsService{
Client: factory.NewAchievementClient(&repository.ConfigRepositoryImpl{}),
TokenRepository: &repository.TokenRepositoryImpl{},
}
achievementCode := "achievementCode"
namespace := "mygame"
userId := "myuserid"
input := &user_achievements.PublicUnlockAchievementParams{
AchievementCode: achievementCode,
Namespace: namespace,
UserID: userId,
}
err := userAchievementsService.PublicUnlockAchievementShort(input)
final UserAchievements userAchievementsWrapper = new UserAchievements(sdk);
String achievementCode = "<achievement-code>";
String userId = "<user-id>";
try {
userAchievementsWrapper.publicUnlockAchievement(PublicUnlockAchievement.builder()
.namespace("<namespace>")
.userId(userId)
.achievementCode(achievementCode)
.build());
} catch (Exception e) {
// Do something when failed
return;
}
import accelbyte_py_sdk.api.achievement as achievement_service
import accelbyte_py_sdk.api.achievement.models as achievement_models
result, error = achievement_service.public_unlock_achievement(
achievement_code="MyAchievementCode",
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)
専用サーバーから実績をロック解除する
サーバーから実績をロック解除することは、通常、マッチが完了した後に行われます。専用サーバーから実績をロック解除するには、実績を付与するユーザーの userID と achievementCode が必要です。その情報と次の関数を使用して実績をロック解除できます:
- Unreal
- Unity
- C# Extend SDK
- Go Extend SDK
- Java Extend SDK
- Python Extend SDK
FString AchievementCode = FString("MyAchievementCode");
FString UserId = FString("UserId");
auto ServerApiClient = AccelByteOnlineSubsystemPtr->GetServerApiClient();
ServerApiClient->ServerAchievement.UnlockAchievement(UserId, AchievementCode, FVoidHandler::CreateLambda([]()
{
// Do something if UnlockAchievement is successful
}), FErrorHandler::CreateLambda([](int32 ErrorCode, const FString& ErrorMessage)
{
// Do something if UnlockAchievement has an error
}));
var achievement = AccelByteSDK.GetServerRegistry().GetApi().GetAchievement();
string achievementCode = "MyAchievementCode";
string userId = "UserId";
achievement.UnlockAchievement(userId, achievementCode, result =>
{
if (result.IsError)
{
// Do something if UnlockAchievement has an error
Debug.Log($"Error UnlockAchievement, Error Code: {result.Error.Code} Error Message: {result.Error.Message}");
return;
}
// Do something if UnlockAchievement is successful
});
string achievementCode = "<achievement-code>";
string userId = "<user-id>";
sdk.Achievement.UserAchievements.AdminUnlockAchievementOp
.Execute(achievementCode, sdk.Namespace, userId);
userAchievementsService := &achievement.UserAchievementsService{
Client: factory.NewAchievementClient(&repository.ConfigRepositoryImpl{}),
TokenRepository: &repository.TokenRepositoryImpl{},
}
achievementCode := "achievementCode"
namespace := "mygame"
userId := "myuserid"
input := &user_achievements.AdminUnlockAchievementParams{
AchievementCode: achievementCode,
Namespace: namespace,
UserID: userId,
}
err := userAchievementsService.AdminUnlockAchievementShort(input)
final UserAchievements userAchievementsWrapper = new UserAchievements(sdk);
String achievementCode = "<achievement-code>";
String userId = "<user-id>";
try {
userAchievementsWrapper.adminUnlockAchievement(AdminUnlockAchievement.builder()
.namespace("<namespace>")
.userId(userId)
.achievementCode(achievementCode)
.build());
} catch (Exception e) {
// Do something when failed
return;
}
import accelbyte_py_sdk.api.achievement as achievement_service
import accelbyte_py_sdk.api.achievement.models as achievement_models
result, error = achievement_service.admin_unlock_achievement(
achievement_code="MyAchievementCode",
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)
一括実績ロック解除操作
ユーザーの複数の実績をロック解除することは、連続的で疲れるプロセスになる可能性があります。 そのため、複数の実績を同時にロック解除する関数があります。 これは、必要な権限を所有している限り、プレイヤー自身が実行することも、ゲームサーバーが実行することもできます。
プレイヤーによる一括ロック解除
このアクションを実行するためにプレイヤーアカウントに必要な権限:
NAMESPACE:{namespace}:USER:{userId}:ACHIEVEMENT [UPDATE]
スコープ: social
- Unreal Engine SDK
- Unreal Engine OSS
FAccelByteModelsAchievementBulkUnlockRequest AchievementsToUnlock{};
AchievementsToUnlock.AchievementCodes = ExampleArrayOfAchievement;
auto ApiClient = AccelByteOnlineSubsystemPtr->GetApiClient();
auto AchievementApi = ApiClient->GetAchievementApi().Pin();
AchievementApi->BulkUnlockAchievement(AchievementsToUnlock,
THandler<TArray<FAccelByteModelsAchievementBulkUnlockRespone>>::CreateLambda([](const TArray<FAccelByteModelsAchievementBulkUnlockRespone>& Response)
{
// Do something if BulkUnlockAchievement is successful because it contains an array of response for each achievement that tried to be unlocked.
for (auto& UnlockAttempt : Response)
{
//Do something & check for each
if (UnlockAttempt.Success)
{
...
}
else
{
...
}
}
}), FErrorHandler:: CreateLambda([](int32 ErrorCode, const FString& ErrorMessage)
{
// Do something if BulkUnlockAchievement has an error
}));
auto DefaultAchievementInterface = AccelByteOnlineSubsystemPtr->GetAchievementsInterface();
if(!DefaultAchievementInterface.IsValid())
{
return;
}
const FOnlineAchievementsAccelBytePtr AchievementInterfacePtr = StaticCastSharedPtr<FOnlineAchievementsAccelByte>(DefaultAchievementInterface);
if(!AchievementInterfacePtr.IsValid())
{
return;
}
AchievementInterfacePtr->UnlockAchievementBulkOperation(*UserNetId.Get(),
AchievementCodes,
FOnBulkAchievementUnlockDelegate::CreateLambda([&](const FUniqueNetId& User, const TArray<FAccelByteModelsAchievementBulkUnlockRespone>& Response) {
// Do something if BulkUnlockAchievement is successful because it contains an array of response for each achievement that tried to be unlocked.
for (auto& UnlockAttempt : Response)
{
//Do something & check for each
if (UnlockAttempt.Success)
{
...
}
else
{
...
}
}
}));
ゲームサーバーによる一括ロック解除
このアクションを実行するためにゲームサーバーの OAuth クライアントに必要な権限:
ADMIN:NAMESPACE:{namespace}:USER:{userId}:ACHIEVEMENT [UPDATE]
スコープ: social
- Unreal Engine SDK
- Unreal Engine OSS
FAccelByteModelsAchievementBulkUnlockRequest AchievementsToUnlock{};
AchievementsToUnlock.AchievementCodes = ExampleArrayOfAchievement;
FString UserId = FString("UserId");
auto ServerApiClient = AccelByteOnlineSubsystemPtr->GetServerApiClient();
ServerApiClient->ServerAchievement.BulkUnlockAchievement(UserId, AchievementsToUnlock,
THandler<TArray<FAccelByteModelsAchievementBulkUnlockRespone>>::CreateLambda([](const TArray<FAccelByteModelsAchievementBulkUnlockRespone>& Response)
{
// Do something if BulkUnlockAchievement is successful because it contains an array of response for each achievement that tried to be unlocked.
for (auto& UnlockAttempt : Response)
{
//Do something & check for each
if (UnlockAttempt.Success)
{
...
}
else
{
...
}
}
}), FErrorHandler:: CreateLambda([](int32 ErrorCode, const FString& ErrorMessage)
{
// Do something if BulkUnlockAchievement has an error
}));
auto DefaultAchievementInterface = AccelByteOnlineSubsystemPtr->GetAchievementsInterface();
if(!DefaultAchievementInterface.IsValid())
{
return;
}
const FOnlineAchievementsAccelBytePtr AchievementInterfacePtr = StaticCastSharedPtr<FOnlineAchievementsAccelByte>(DefaultAchievementInterface);
if(!AchievementInterfacePtr.IsValid())
{
return;
}
AchievementInterfacePtr->UnlockAchievementBulkOperationByGameServer(*UserNetId.Get(),
AchievementCodes,
FOnBulkAchievementUnlockDelegate::CreateLambda([&](const FUniqueNetId& User, const TArray<FAccelByteModelsAchievementBulkUnlockRespone>& Response) {
// Do something if BulkUnlockAchievement is successful because it contains an array of response for each achievement that tried to be unlocked.
for (auto& UnlockAttempt : Response)
{
//Do something & check for each
if (UnlockAttempt.Success)
{
...
}
else
{
...
}
}
}));