すべてを統合する - プレイヤーを検索する - (Unreal Engine モジュール)
注釈:本資料はAI技術を用いて翻訳されています。
UIをプレイヤー検索とフレンドリクエスト送信に接続する
-
FindFriendsWidget_Starterクラスのヘッダーファイルを開きます。サブシステムを呼び出すための新しい関数をいくつか定義します。
protected:
// ...
void DisplaySelfFriendCode();
void FindFriendByDisplayName(const FString& DisplayName);
void SendFriendRequestByFriendCode(const FString& FriendCode);
-
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);
}
}
));
} -
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);
}
}
));
} -
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);
}
}
));
} -
引き続き
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();
} -
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());
} -
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);
}
}
));
} -
プロジェクトをコンパイルし、エラーがないことを確認してください。
リソース
- このチュートリアルセクションで使用されているファイルは、Unreal Byte Wars GitHubリポジトリで入手できます。
- AccelByteWars/Source/AccelByteWars/TutorialModules/Social/FriendsEssentials/UI/FindFriendsWidget_Starter.h
- AccelByteWars/Source/AccelByteWars/TutorialModules/Social/FriendsEssentials/UI/FindFriendsWidget_Starter.cpp
- AccelByteWars/Source/AccelByteWars/TutorialModules/Social/FriendsEssentials/UI/FriendWidgetEntry_Starter.cpp