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

すべてを統合する - プレイヤーを検索する - (Unreal Engine モジュール)

Last updated on February 4, 2026

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

UIをプレイヤー検索とフレンドリクエスト送信に接続する

  1. FindFriendsWidget_Starter クラスのヘッダーファイルを開きます。サブシステムを呼び出すための新しい関数をいくつか定義します。

protected:
// ...
void DisplaySelfFriendCode();

void FindFriendByDisplayName(const FString& DisplayName);
void SendFriendRequestByFriendCode(const FString& FriendCode);
  1. FindFriendsWidget_Starter クラスのCPPファイルを開き、DisplaySelfFriendCode() 関数を定義します。この関数はプレイヤーのフレンドコードを取得し、UIに表示します。

    void UFindFriendsWidget_Starter::DisplaySelfFriendCode()
    {
    Tb_FriendCode->SetText(FText::GetEmpty());
    Ws_FriendCode->SetActiveWidget(Th_FriendCodeLoader);

    FriendsSubsystem->GetSelfFriendCode(
    GetOwningPlayer(),
    FOnGetSelfFriendCodeComplete::CreateWeakLambda(this, [this](bool bWasSuccessful, UFriendData* FriendData, const FString& FriendCode)
    {
    if (bWasSuccessful && !FriendCode.IsEmpty())
    {
    Tb_FriendCode->SetText(FText::FromString(FriendCode));
    Ws_FriendCode->SetActiveWidget(Tb_FriendCode);
    }
    else
    {
    Ws_FriendCode->SetActiveWidget(Tb_FriendCodeEmpty);
    }
    }
    ));
    }
  2. FindFriendByDisplayName() 関数を定義します。この関数はサブシステムの FindFriend() 関数をトリガーし、取得したフレンド情報をUIに表示します。

    void UFindFriendsWidget_Starter::FindFriendByDisplayName(const FString& DisplayName)
    {
    ensure(FriendsSubsystem);

    Ws_FindFriends->SetWidgetState(EAccelByteWarsWidgetSwitcherState::Loading);

    // Try to find friend by exact display name.
    FriendsSubsystem->FindFriend(
    GetOwningPlayer(),
    DisplayName,
    FOnFindFriendComplete::CreateWeakLambda(this, [this](bool bWasSuccessful, UFriendData* FriendData, const FString& ErrorMessage)
    {
    Lv_FindFriends->SetUserFocus(GetOwningPlayer());
    Lv_FindFriends->ClearListItems();

    if (bWasSuccessful)
    {
    // Reset the status to be "searched", because the data is retrieved from the result of find friend.
    FriendData->Status = EFriendStatus::Searched;
    Lv_FindFriends->AddItem(FriendData);
    Lv_FindFriends->RequestRefresh();
    Ws_FindFriends->SetWidgetState(EAccelByteWarsWidgetSwitcherState::Not_Empty);
    }
    else
    {
    Ws_FindFriends->ErrorMessage = FText::FromString(ErrorMessage);
    Ws_FindFriends->SetWidgetState(EAccelByteWarsWidgetSwitcherState::Error);
    }
    }
    ));
    }
  3. SendFriendRequestByFriendCode() 関数を定義します。この関数は SendFriendRequest を使用してすぐにフレンドリクエストを送信します。ただし、失敗した場合は、入力されたフレンドコードを表示名として使用してプレイヤーを検索します。

    void UFindFriendsWidget_Starter::SendFriendRequestByFriendCode(const FString& FriendCode)
    {
    // Abort if trying to friend with themself.
    if (FriendCode.Equals(Tb_FriendCode->GetText().ToString()))
    {
    Ws_FindFriends->ErrorMessage = CANNOT_INVITE_FRIEND_SELF;
    Ws_FindFriends->SetWidgetState(EAccelByteWarsWidgetSwitcherState::Error);
    return;
    }

    ensure(FriendsSubsystem);

    Ws_FindFriends->SetWidgetState(EAccelByteWarsWidgetSwitcherState::Loading);

    // Try to send friend request by friend code.
    FriendsSubsystem->SendFriendRequest(
    GetOwningPlayer(),
    FriendCode,
    FOnSendFriendRequestComplete::CreateWeakLambda(this, [this](bool bWasSuccessful, UFriendData* FriendData, const FString& ErrorMessage)
    {
    Lv_FindFriends->SetUserFocus(GetOwningPlayer());
    Lv_FindFriends->ClearListItems();

    if (!bWasSuccessful && !FriendData)
    {
    /* Fallback, the player might enter display name instead of friend code.
    * Try to find friend by the exact display name. */
    FindFriendByDisplayName(Edt_SearchBar->GetText().ToString());
    }
    else
    {
    // Reset the status to be "searched", because the data is retrieved from the result of find friend.
    FriendData->Status = EFriendStatus::Searched;
    Lv_FindFriends->AddItem(FriendData);
    Lv_FindFriends->RequestRefresh();
    Ws_FindFriends->SetWidgetState(EAccelByteWarsWidgetSwitcherState::Not_Empty);
    }
    }
    ));
    }
  4. 引き続き FindFriendsWidget_Starter クラスのCPPファイルで、NativeOnActivated() 関数に移動します。この関数はウィジェットが開かれたときに呼び出されます。以下のコードに置き換えてください。これにより、ウィジェットがアクティブになるとすぐに DisplaySelfFriendCode がトリガーされます。

    void UFindFriendsWidget_Starter::NativeOnActivated()
    {
    Super::NativeOnActivated();

    Btn_Back->OnClicked().AddUObject(this, &ThisClass::DeactivateWidget);

    Edt_SearchBar->SetText(FText::FromString(TEXT("")));
    Edt_SearchBar->OnTextCommitted.AddDynamic(this, &ThisClass::OnSearchBarCommitted);
    Btn_Search->OnClicked().AddWeakLambda(this, [this]()
    {
    OnSearchBarCommitted(Edt_SearchBar->GetText(), ETextCommit::Type::OnEnter);
    });
    Btn_CopyFriendCode->OnClicked().AddUObject(this, &ThisClass::CopyFriendCodeToClipboard);

    // Reset widgets.
    Ws_FindFriends->SetWidgetState(EAccelByteWarsWidgetSwitcherState::Empty);
    Lv_FindFriends->ClearListItems();

    DisplaySelfFriendCode();
    }
  5. FindFriendsWidget_Starter クラスのCPPファイルで、OnSearchBarCommitted() 関数に移動し、現在の実装を以下のコードに置き換えます。最初に、ロジックは入力されたテキストをフレンドコードとして扱い、失敗した場合は表示名として扱います。完了すると、結果が表示されます。

    void UFindFriendsWidget_Starter::OnSearchBarCommitted(const FText& Text, ETextCommit::Type CommitMethod)
    {
    if (CommitMethod != ETextCommit::Type::OnEnter || Text.IsEmpty())
    {
    return;
    }

    SendFriendRequestByFriendCode(Text.ToString());
    }
  6. FriendWidgetEntry_Starter クラスのCPPファイルを開き、OnInviteButtonClicked() に移動して、現在の実装を以下のコードに置き換えます。これにより、FriendsSubsystem_Starter サブシステムを使用してフレンド招待リクエストが送信されます。

    void UFriendWidgetEntry_Starter::OnInviteButtonClicked()
    {
    ensure(CachedFriendData);
    ensure(FriendsSubsystem);

    FriendsSubsystem->SendFriendRequest(
    GetOwningPlayer(),
    CachedFriendData->UserId,
    FOnSendFriendRequestComplete::CreateWeakLambda(this, [this](bool bWasSuccessful, UFriendData* FriendData, const FString& ErrorMessage)
    {
    if (bWasSuccessful)
    {
    // Since the invitation is already sent, refresh the entry data to show that the friend cannot be invited again.
    CachedFriendData->bCannotBeInvited = FriendData->bCannotBeInvited;
    CachedFriendData->ReasonCannotBeInvited = FriendData->ReasonCannotBeInvited;
    NativeOnListItemObjectSet(CachedFriendData);
    }
    }
    ));
    }
  7. プロジェクトをコンパイルし、エラーがないことを確認してください。

リソース