メインコンテンツまでスキップ

エンタイトルメントを管理する

Last updated on February 4, 2026

注釈:本資料はAI技術を用いて翻訳されています。

概要

AccelByte Gaming Services (AGS) エンタイトルメントサービスは、プレイヤーが購入または受け取ったアイテムの個別の所有権を管理します。エンタイトルメントを使用して、プレイヤーにアイテムのインスタンスを付与または取り消すことができます。アイテムの作成と設定はストアで処理されます。

エンタイトルメントには2つのタイプがあります:

  • 永続エンタイトルメント: スタック不可で永続的です。使用後も消えません。永続エンタイトルメントの例には、ゲームスキン、武器、アンロック可能なキャラクター、その他多くの可能性が含まれます。
  • 消耗品: 使用後に消えます。消耗品はスタック可能またはスタック不可です。複数のスタック可能なアイテムは同じエンタイトルメントの下にありますが、複数のスタック不可のアイテムは、同一のアイテムから生成された場合でも、それぞれ独自のエンタイトルメントを持ちます。消耗品エンタイトルメントの例には、弾薬、ポーション、食料が含まれます。

エンタイトルメント管理では、特定のプレイヤーのエンタイトルメント履歴、または特定のエンタイトルメントを所有するプレイヤーを確認できます。

この記事では、以下の方法について説明します:

  • プレイヤーにエンタイトルメントを付与する
  • プレイヤーのエンタイトルメントを検索する
  • プレイヤーのエンタイトルメントを無効にする
  • プレイヤーのエンタイトルメントを有効にする
  • プレイヤーのエンタイトルメントを取り消す
  • プレイヤーのエンタイトルメント履歴を一覧表示する

前提条件

  • AGS管理者ポータルへのアクセス
  • 適切なネームスペースを作成済みであること

プレイヤーにエンタイトルメントを付与する

  1. 管理者ポータルのサイドバーで、Commerce > Entitlements > User Entitlementsに移動します。

  2. User Entitlementsページで、Grant Itemボタンをクリックします。

    アイテムを付与

    Grant Itemフォームが開きます。

    アイテム付与フォーム

  3. 必須フィールドに入力します:

    • Add Itemフィールドで、プレイヤーに付与するアイテムを検索します。
    • Select Userフィールドに、エンタイトルメントを付与するプレイヤーのUser IDを入力します。次に、Addをクリックします。
    • プレイヤーに付与するアイテムのQuantityを入力します。
  4. すべてのフィールドに入力したら、Grantボタンをクリックします。新しいエンタイトルメントがプレイヤーに付与され、プレイヤーのアカウントに表示されます。

プレイヤーのエンタイトルメントを検索する

  1. 管理者ポータルのサイドバーで、Commerce > Entitlements > User Entitlementsに移動します。

  2. User Entitlementsページで、メールアドレス、ユーザーID、または完全なエンタイトルメントIDを使用してプレイヤーを検索します。

    エンタイトルメントを検索

    「Full Entitlement ID」検索オプションは、エンタイトルメントIDに基づいて特定のエンタイトルメントを表示し、所有プレイヤーのユーザーIDを表示します

  3. (オプション) プレイヤーのユーザーIDまたはメールアドレスを使用して検索する場合は、検索にフィルターを適用します。Entitlement ClassとFeatures Nameに基づいて結果をフィルタリングできます。

    • Entitlement Class: アイテムタイプに基づいて結果をフィルタリングします。All、App、Entitlement、Code、Subscription、Media、Option Box、Loot Boxから選択できます。

      注記

      Entitlement ClassフィールドのEntitlementオプションを使用すると、App、Code、Subscription、Media、Option Box以外のアイテムタイプを選択できます。アイテムタイプの詳細については、収益化ガイドを参照してください。

    • Features Name: 機能に基づいて結果をフィルタリングします。Enterキーを押してから別の機能を追加することで、複数の機能名を入力できます。アイテムへの機能の追加を含む機能名の追加の詳細については、ストアのセットアップを参照してください。

プレイヤーのエンタイトルメントを無効にする

  1. 管理者ポータルのサイドバーで、Commerce > Entitlements > User Entitlementsに移動します。

  2. User Entitlementsページで、メールアドレス、ユーザーID、または完全なエンタイトルメントIDを使用してプレイヤーを検索します。

  3. 選択したレコードで、Action列の下にある**More Actions (...)**アイコンをクリックし、Disableをクリックします。

    プレイヤーのエンタイトルメントを無効化

  4. Disable Entitlementフォームが開きます。Confirmをクリックします。

アイテムのステータスが管理者ポータルでInactiveに変更され、アイテムはプレイヤーから非表示になり、使用できなくなります。

プレイヤーのエンタイトルメントを無効化

プレイヤーのエンタイトルメントを有効にする

  1. 管理者ポータルのサイドバーで、Commerce > Entitlements > User Entitlementsに移動します。

  2. User Entitlementsページで、メールアドレス、ユーザーID、または完全なエンタイトルメントIDを使用してプレイヤーを検索します。

  3. 選択したレコードで、Action列の下にある**More Actions (...)**アイコンをクリックし、Enableをクリックします。

    プレイヤーのエンタイトルメントを有効化

  4. Enable Entitlementフォームが開きます。Confirmをクリックします。

アイテムのステータスが管理者ポータルでActiveに変更され、アイテムは再びプレイヤーが使用できるようになります。

アクティブなプレイヤーのエンタイトルメント

プレイヤーのエンタイトルメントを取り消す

  1. 管理者ポータルのサイドバーで、Commerce > Entitlements > User Entitlementsに移動します。

  2. User Entitlementsページで、メールアドレス、ユーザーID、または完全なエンタイトルメントIDを使用してプレイヤーを検索します。

  3. 選択したレコードで、Action行の下にある**More Actions (...)**アイコンをクリックし、Revokeをクリックします。

    プレイヤーのエンタイトルメントを取り消す

  4. Revoke Entitlementフォームが表示されます。Confirmをクリックします。

管理者ポータルで、アイテムのステータスがRevokedに変更され、アイテムはプレイヤーのアカウントから削除されます。

プレイヤーのエンタイトルメント履歴を一覧表示する

エンタイトルメント履歴は、エンタイトルメントの履歴ステータスのリストです。たとえば、最初に付与され、後で取り消されました。AGS管理者ポータルを通じて、プレイヤーのエンタイトルメントの履歴を確認できます。これを行うには、以下の手順に従います:

  1. 管理者ポータルのサイドバーで、Commerce > Entitlements > User Entitlementsに移動します。

  2. User Entitlementsページで、メールアドレス、ユーザーID、または完全なエンタイトルメントIDを使用してプレイヤーを検索します。

  3. エンタイトルメントのリストから表示したいレコードを選択し、Viewをクリックします。

  4. Entitlement Historyポップアップに、エンタイトルメント履歴が降順で表示されます。

SDKでエンタイトルメントを実装する

プレイヤーがアイテムの注文を行うと、エンタイトルメントが自動的に付与されます。エンタイトルメントはプレイヤーのアカウントに追加されます。

プレイヤーのエンタイトルメントを確認する

このセクションでは、サブスクリプションありとなしのプレイヤーのエンタイトルメントを確認する方法について説明します。

サブスクリプションありのプレイヤーの場合

ゲームまたはプラットフォームがプレイヤーにサブスクリプションを提供している場合、次のコードを使用してプレイヤーのエンタイトルメントとサブスクリプションプランを確認できます。

FApiClientPtr ApiClient = AccelByteOnlineSubsystemPtr->GetApiClient("key"); 

FString EntitlementName = "Entitlement";
FString ItemId = "ItemId";
TArray<FString> Features = { "feature1" };
int Offset = 0;
int Limit = 20;
ApiClient->Entitlement.QueryUserEntitlements(EntitlementName, ItemId, Offset, Limit
, THandler<FAccelByteModelsEntitlementPagingSlicedResult>::CreateLambda(
[=](const FAccelByteModelsEntitlementPagingSlicedResult& Result)
{
UE_LOG(LogTemp Log, TEXT(" Success"));
})
, FErrorHandler::CreateLambda([](int32 ErrorCode, const FString& ErrorMessage)
{
UE_LOG(LogTemp, Error, TEXT("Error. Code: %d, Reason: %s"), ErrorCode, *ErrorMessage)
}
, EAccelByteEntitlementClass::NONE
, EAccelByteAppType::NONE);

サブスクリプションなしのプレイヤーの場合

サブスクリプションを提供していない場合は、次のコードを使用してプレイヤーのエンタイトルメントを確認できます。プレイヤーのすべてのエンタイトルメントを取得するには、EntitlementNameItemId""(つまり、空の文字列)に設定します。

FApiClientPtr ApiClient = AccelByteOnlineSubsystemPtr->GetApiClient("key");

FString EntitlementName = "";
FString ItemId = "";
int32 Offset = 0;
int32 Limit = 20;

ApiClient->Entitlement.QueryUserEntitlements(EntitlementName, ItemId, Offset, Limit,
THandler<FAccelByteModelsEntitlementPagingSlicedResult>::CreateWeakLambda(this, [](const FAccelByteModelsEntitlementPagingSlicedResult& Result)
{
UE_LOG(LogTemp, Log, TEXT("Query User Entitlements Success!"));
}),
FErrorHandler::CreateWeakLambda(this, [](int32 ErrorCode, const FString& ErrorMessage)
{
UE_LOG(LogTemp, Error, TEXT("Query User Entitlements Failed, Error Code: %d Error Message: %s"), ErrorCode, *ErrorMessage);
}),
EAccelByteEntitlementClass::NONE,
EAccelByteAppType::NONE
);

QueryUserEntitlements()からのレスポンスオブジェクトには、すべてのエンタイトルメント関連IDを含むエンタイトルメント情報の配列が含まれています。これには、EntitlementIdItemIdSKUIdが含まれます。これらのIDは、後でアイテムまたは特定のエンタイトルメント情報を取得するために使用できます。

注記

場合によっては、ネームスペースや環境に依存しない独自のアイテムIDがある場合は、SKU関連の関数を使用することをお勧めします。ItemIdは自動的に生成されますが、SKU IDは管理者ポータルで手動で定義できます。詳細については、アイテムの作成に関するドキュメントを参照してください。

エンタイトルメントで引き換えられたアイテムを確認する

引き換えられたアイテムを確認するには、Entitlement APIからgetUserEntitlementByIdを呼び出すことができます。レスポンスには、引き換えられたアイテムに関する詳細情報を含むitemSnapshotが含まれています。エンタイトルメントがコード引き換えプロセスの結果である場合、レスポンスに表示されるエンタイトルメントソースはREDEEM_CODEである必要があります。

FString EntitlementId = "EntitlementId"
FApiClientPtr ApiClient = AccelByteOnlineSubsystemPtr->GetApiClient("key");

ApiClient->Entitlement.Entitlement.GetUserEntitlementById(EntitlementId, THandler<FAccelByteModelsEntitlementInfo>::CreateLambda([](const FAccelByteModelsEntitlementInfo& Result)
{
UE_LOG(LogTemp, Log, TEXT("The redeemed item ID: %s with name %s"), *Result.ItemId, *Result.ItemSnapshot.Name);
}), FErrorHandler::CreateLambda([](int32 Code, const FString& Message){}));

SKUでユーザーエンタイトルメントを取得する

注記

この機能はまだSDKでサポートされていませんが、エンドポイントはAPIで利用可能です。

サードパーティアイテムエンタイトルメントの同期

このセクションでは、サードパーティプラットフォームでエンタイトルメントを同期する方法について説明します。

Apple

Appleエンタイトルメントを同期するには、この関数を使用します:

FApiClientPtr ApiClient = AccelByteOnlineSubsystemPtr->GetApiClient("key");

// Log in with Apple account
FString AppleAuthToken = "Token-from-apple";
ApiClient->User.LoginWithOtherPlatform(EAccelBytePlatformType::Apple, AppleAuthToken), FVoidHandler::CreateLambda([&]()
{
UE_LOG(LogTemp, Log, TEXT(" Success"));
// Do something when successful
}), FErrorHandler::CreateLambda([&](int32 ErrorCode, const FString& ErrorMessage)
{
UE_LOG(LogTemp, Error, TEXT(" Error. Code: %d, Reason: %s"), ErrorCode, *ErrorMessage);
// Do something when an error occurs
}));

...

// Sync Apple item entitlement
bSyncDone = false;
FAccelByteModelsPlatformSyncMobileApple SyncReqApple;
SyncReqApple.ProductId = "testProductIdInvalid";
SyncReqApple.TransactionId = "testTransactionIdInvalid";
SyncReqApple.ReceiptData = "testReceiptDataInvalid";
SyncReqApple.ExcludeOldTransactions = true;
SyncReqApple.Region = "ID";
SyncReqApple.Language = "en";
ApiClient->Entitlement.SyncMobilePlatformPurchaseApple(SyncReqApple
, FVoidHandler::CreateLambda(
[=]()
{
UE_LOG(LogTemp, Log, TEXT(" Success"));
})
, FErrorHandler::CreateLambda(
[](int32 ErrorCode, const FString& ErrorMessage)
{
UE_LOG(LogAccelByteEcommerceTest, Log, TEXT("Error. Code: %d, Reason: %s"), ErrorCode, *ErrorMessage);
})
);

Google

Googleエンタイトルメントを同期するには、この関数を使用します:

FApiClientPtr ApiClient = AccelByteOnlineSubsystemPtr->GetApiClient("key");
// Log in with Google account
FString GoogleAuthToken = "Token-from-Google";
ApiClient->User.LoginWithOtherPlatform(EAccelBytePlatformType::Google, GoogleAuthToken ), FVoidHandler::CreateLambda([&]()
{
UE_LOG(LogTemp, Log, TEXT(" Success"));
// Do something when successful
}), FErrorHandler::CreateLambda([&](int32 ErrorCode, const FString& ErrorMessage)
{
UE_LOG(LogTemp, Error, TEXT(" Error. Code: %d, Reason: %s"), ErrorCode, *ErrorMessage);
// Do something when an error occurs
}));

...

FAccelByteModelsItemInfo itemInfo;
ApiClient->Item.GetItemBySku(TEXT("sku-number")
, TEXT("en")
, TEXT("US")
, THandler<FAccelByteModelsItemInfo>::CreateLambda(
[=](const FAccelByteModelsItemInfo& Response)
{
itemInfo = Response;
})
,FErrorHandler::CreateLambda(
[&bGetItemDone](int32 ErrorCode, const FString& ErrorMessage)
{
UE_LOG(LogTemp, Log, TEXT("Error. Code: %d, Reason: %s"), ErrorCode, *ErrorMessage);
})
);

...

FAccelByteModelsPlatformSyncMobileGoogle SyncReqGoogle;
SyncReqGoogle.OrderId = TEXT("test-OrderId");
SyncReqGoogle.PackageName = TEXT("test-packageName");
SyncReqGoogle.ProductId = TEXT("testProductId");
SyncReqGoogle.PurchaseTime = 0;
SyncReqGoogle.PurchaseToken = TEXT("test.PurchaseToken");
if (bGetItemSuccess == true && itemInfo.EntitlementType == EAccelByteEntitlementType::DURABLE)
{
SyncReqGoogle.AutoAck = true;
}
else
{
SyncReqGoogle.AutoAck = false;
}
SyncReqGoogle.Region = TEXT("ID");
SyncReqGoogle.Language = TEXT("en");

if (!GoogleConfig.ApplicationName.IsEmpty())
{
ApiClient->Entitlement.SyncMobilePlatformPurchaseGooglePlay(SyncReqGoogle
, THandler<FAccelByteModelsPlatformSyncMobileGoogleResponse>::CreateLambda(
[&bSyncDone](FAccelByteModelsPlatformSyncMobileGoogleResponse const& response)
{
UE_LOG(LogTemp, Log, TEXT(" Success"));
if (response.NeedConsume)
UE_LOG(LogTemp, Log, TEXT("The item is consumable"));
if (!response.NeedConsume)
UE_LOG(LogTemp, Log, TEXT("The item is durable"));
})
, FErrorHandler::CreateLambda(
[&bSyncDone](int32 ErrorCode, const FString& ErrorMessage)
{
bSyncDone = true;
UE_LOG(LogTemp, Log, TEXT("Error. Code: %d, Reason: %s"), ErrorCode, *ErrorMessage);
})
);
}

Twitch

Twitchエンタイトルメントを同期するには、この関数を使用します:

FString TwitchAuthToken = "Token-from-twitch";
FApiClientPtr ApiClient = AccelByteOnlineSubsystemPtr->GetApiClient("key");

// Log in with Apple account
ApiClient->User.LoginWithOtherPlatform(EAccelBytePlatformType::Twitch, TwitchAuthToken), FVoidHandler::CreateLambda([&]()
{
UE_LOG(LogTemp, Log, TEXT(" Success"));
// Do something when successful
}), FErrorHandler::CreateLambda([&](int32 ErrorCode, const FString& ErrorMessage)
{
UE_LOG(LogTemp, Error, TEXT(" Error. Code: %d, Reason: %s"), ErrorCode, *ErrorMessage);
// Do something when an error occurs
}));

...

// Sync Twitch entitlement
FAccelByteModelsTwitchDropEntitlement model;
model.GameId = TEXT("123456"); // Your gameId
model.Region = TEXT("US");
model.Language = TEXT("en-US");
ApiClient->Entitlement.SyncTwitchDropEntitlement(model,
FVoidHandler::CreateLambda([&]()
{
UE_LOG(LogTemp, Log, TEXT(" Success"));
// Do something when successful
}),FErrorHandler::CreateLambda([&](int32 ErrorCode, const FString& ErrorMessage)
{
UE_LOG(LogTemp, Warning, TEXT(" Error. Code: %d, Reason: %s"), ErrorCode, *ErrorMessage);
// Do something when an error occurs
}));