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

すべてをまとめる - エンタイトルメントの基礎 - (Unreal Engine モジュール)

Last updated on February 4, 2026

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

UI をエンタイトルメントに接続する

  1. OwnedCountWidgetEntry_Starter CPP ファイルを開き、RetrieveEntitlementWithForceRequest() 関数を見つけて、既存の実装を以下のコードに置き換えます。この更新されたコードは、先ほど実装した GetOrQueryUserItemEntitlement() 関数を呼び出し、ShowOwnedCount() を完了時のデリゲートとしてバインドします。

    void UOwnedCountWidgetEntry_Starter::RetrieveEntitlementWithForceRequest(const bool bForceRequest)
    {
    SetVisibility(ESlateVisibility::Collapsed);

    const ULocalPlayer* LocalPlayer = GetOwningPlayer()->GetLocalPlayer();
    W_Parent = GetFirstOccurenceOuter<UStoreItemListEntry>();
    if (W_Parent && LocalPlayer)
    {
    // Get item.
    const UStoreItemDataObject* ItemData = W_Parent->GetItemData();
    if (!ItemData)
    {
    return;
    }

    EntitlementsSubsystem->GetOrQueryUserItemEntitlement(
    LocalPlayer->GetPreferredUniqueNetId().GetUniqueNetId(),
    ItemData->GetStoreItemId(),
    FOnGetOrQueryUserItemEntitlementComplete::CreateUObject(this, &ThisClass::ShowOwnedCount),
    bForceRequest);
    }
    }
  2. EquipmentInventoryWidget_Starter CPP ファイルを開き、QueryEquipmentItems()SaveEquipments() を置き換えて、プレイヤーの装備を実際にクエリおよび保存するようにします。

    void UEquipmentInventoryWidget_Starter::QueryEquipmentItems()
    {
    const ULocalPlayer* LocalPlayer = GetOwningPlayer()->GetLocalPlayer();
    if (!LocalPlayer)
    {
    UE_LOG_ENTITLEMENTS_ESSENTIALS(Warning, "Failed to save customization. Local player is invalid.");
    Ws_Root->SetWidgetState(EAccelByteWarsWidgetSwitcherState::Error);
    return;
    }

    const int32 LocalUserNum = LocalPlayer->GetControllerId();
    const FUniqueNetIdPtr UserId = LocalPlayer->GetPreferredUniqueNetId().GetUniqueNetId();
    Ws_Root->SetWidgetState(EAccelByteWarsWidgetSwitcherState::Loading);

    // Get the equipment items.
    EntitlementsSubsystem->GetUserEquipments(
    LocalUserNum,
    UserId,
    FOnUpdateUserEquipmentsComplete::CreateWeakLambda(this, [this, UserId]
    (const FOnlineError& Error, const FPlayerEquipments& Equipments)
    {
    // Store current equipments if any.
    if (Error.bSucceeded)
    {
    CachedEquipments = Equipments;
    }

    // Query entitlements to be displayed.
    EntitlementsSubsystem->GetOrQueryUserEntitlements(
    UserId,
    FOnGetOrQueryUserEntitlementsComplete::CreateWeakLambda(this, [this]
    (const FOnlineError& Error, const TArray<UStoreItemDataObject*> Entitlements)
    {
    if (!Error.bSucceeded)
    {
    Ws_Root->SetWidgetState(EAccelByteWarsWidgetSwitcherState::Error);
    return;
    }

    CachedEntitlements.Empty();
    CachedEntitlements.Append(Entitlements);

    W_Inventory->RefreshCategories();
    W_Inventory->SwitchCategory();

    Ws_Root->SetWidgetState(EAccelByteWarsWidgetSwitcherState::Not_Empty);
    }));
    }));
    }
    void UEquipmentInventoryWidget_Starter::SaveEquipments()
    {
    const ULocalPlayer* LocalPlayer = GetOwningPlayer()->GetLocalPlayer();
    if (!LocalPlayer)
    {
    UE_LOG_ENTITLEMENTS_ESSENTIALS(Warning, "Failed to save customization. Local player is invalid.");
    return;
    }

    const int32 LocalUserNum = LocalPlayer->GetControllerId();

    UAccelByteWarsGameInstance* GameInstance = Cast<UAccelByteWarsGameInstance>(GetGameInstance());
    if (!GameInstance)
    {
    UE_LOG_ENTITLEMENTS_ESSENTIALS(Warning, "Failed to save customization. Game instance is invalid.");
    return;
    }

    UPromptSubsystem* PromptSubsystem = GameInstance->GetSubsystem<UPromptSubsystem>();
    if (!PromptSubsystem)
    {
    UE_LOG_ENTITLEMENTS_ESSENTIALS(Warning, "Failed to save customization. Prompt subsystem is invalid.");
    return;
    }

    PromptSubsystem->ShowLoading(TEXT_SAVING_EQUIPMENTS);
    EntitlementsSubsystem->SetUserEquipments(
    LocalUserNum,
    LocalPlayer->GetPreferredUniqueNetId().GetUniqueNetId(),
    CachedEquipments,
    FOnUpdateUserEquipmentsComplete::CreateWeakLambda(this, [this, PromptSubsystem]
    (const FOnlineError& Error, const FPlayerEquipments& Equipments)
    {
    PromptSubsystem->HideLoading();
    if (!Error.bSucceeded)
    {
    PromptSubsystem->ShowMessagePopUp(ERROR_PROMPT_TEXT, Error.ErrorMessage);
    }
    DeactivateWidget();
    }));
    }

リソース