すべてをまとめる - 最近のプレイヤー - (Unreal Engine モジュール)
注釈:本資料はAI技術を用いて翻訳されています。
最近のプレイヤーリストを表示するために UI を接続する
このセクションでは、RecentPlayersSubsystem の実装をウィジェットに接続して、最近のプレイヤーリストを表示する方法を説明します。
-
RecentPlayersWidget_Starterクラスの CPP ファイルを開き、InitRecentPlayersList()を以下のコードに置き換えて、最近のプレイヤーリストを取得して表示します。void URecentPlayersWidget_Starter::InitRecentPlayersList()
{
ensure(RecentPlayersSubsystem);
RecentPlayersSubsystem->GetRecentPlayers(GetOwningPlayer(), FOnGetRecentPlayersComplete::CreateWeakLambda(this, [this](bool bWasSuccessful, TArray<UFriendData*> RecentPlayersList)
{
if(bWasSuccessful)
{
if(RecentPlayersList.IsEmpty())
{
Ws_RecentPlayers->SetWidgetState(EAccelByteWarsWidgetSwitcherState::Loading);
Tv_RecentPlayers->ClearListItems();
RecentPlayersSubsystem->QueryRecentPlayers(GetOwningPlayer());
}
else
{
Tv_RecentPlayers->SetListItems(RecentPlayersList);
Ws_RecentPlayers->SetWidgetState(EAccelByteWarsWidgetSwitcherState::Not_Empty);
}
}
else
{
Ws_RecentPlayers->SetWidgetState(EAccelByteWarsWidgetSwitcherState::Error);
Tv_RecentPlayers->ClearListItems();
}
}));
} -
次に、
OnQueryRecentPlayerComplete()関数を以下のコードに置き換えて、ゲームセッション終了時にリストがクエリされたときに最近のプレイヤーリストを更新します。void URecentPlayersWidget_Starter::OnQueryRecentPlayerComplete(const FUniqueNetId& UserId, const FString& Namespace,
bool bWasSuccessful, const FString& Error)
{
if(!bWasSuccessful)
{
UE_LOG_RECENTPLAYERS(Warning, TEXT("Error querying recent players! Message: %s"), *Error);
Ws_RecentPlayers->SetWidgetState(EAccelByteWarsWidgetSwitcherState::Error);
return;
}
RecentPlayersSubsystem->GetRecentPlayers(GetOwningPlayer(), FOnGetRecentPlayersComplete::CreateWeakLambda(this, [this](bool bWasSuccessful, TArray<UFriendData*> RecentPlayersList)
{
if(bWasSuccessful)
{
Tv_RecentPlayers->SetListItems(RecentPlayersList);
Ws_RecentPlayers->SetWidgetState(RecentPlayersList.IsEmpty() ?
EAccelByteWarsWidgetSwitcherState::Empty :
EAccelByteWarsWidgetSwitcherState::Not_Empty);
}
else
{
Ws_RecentPlayers->SetWidgetState(EAccelByteWarsWidgetSwitcherState::Error);
}
}));
} -
次に、以下のハイライトされたコードを
NativeOnActivated()関数に挿入します。このコードは、最近のプレイヤークエリの完了を管理するためにデリゲートをバインドし、クエリが終了したときに指定されたコールバック関数が呼び出されるようにします。また、ウィジェットが表示されたときに表示される最近のプレイヤーリストを初期化します。void URecentPlayersWidget_Starter::NativeOnActivated()
{
Super::NativeOnActivated();
Btn_Back->OnClicked().AddUObject(this, &ThisClass::DeactivateWidget);
// Reset widgets.
Ws_RecentPlayers->SetWidgetState(EAccelByteWarsWidgetSwitcherState::Loading);
Tv_RecentPlayers->ClearListItems();
Tv_RecentPlayers->OnItemClicked().AddUObject(this, &ThisClass::OnRecentPlayerEntryClicked);
OnQueryRecentPlayersCompletedDelegate = FOnQueryRecentPlayersCompleteDelegate::CreateUObject(this, &ThisClass::OnQueryRecentPlayerComplete);
RecentPlayersSubsystem->BindRecentPlayerDelegate(OnQueryRecentPlayersCompletedDelegate);
InitRecentPlayersList();
} -
最後に、ウィジェットが非アクティブ化されたときに最近のプレイヤーのデリゲートをアンバインドします。これを行うには、以下のハイライトされたコードを
NativeOnDeactivated()関数に追加します。void URecentPlayersWidget_Starter::NativeOnDeactivated()
{
Btn_Back->OnClicked().Clear();
Tv_RecentPlayers->OnItemClicked().Clear();
RecentPlayersSubsystem->UnBindRecentPlayerDelegate(OnRecentPlayersListUpdatedDelegateHandle);
Super::NativeOnDeactivated();
}
ゲームセッションプレイヤーリストを表示するために UI を接続する
このセクションでは、RecentPlayersSubsystem の実装をウィジェットに接続して、ゲームセッションプレイヤーリストを表示する方法を説明します。
-
PlayersListWidget_Starterクラスの CPP ファイルを開き、InitGameSessionPlayersList()を以下のコードに置き換えて、ゲームセッションプレイヤーリストを取得して表示します。この関数は、ゲームセッションメンバーが変更されたときにリストも更新します。void UPlayersListWidget_Starter::InitGameSessionPlayersList()
{
Tv_PlayersList->OnItemClicked().RemoveAll(this);
Tv_PlayersList->OnItemClicked().AddUObject(this, &ThisClass::OnPlayersListEntryClicked);
RecentPlayersSubsystem->GetGameSessionPlayerList(GetOwningPlayer(), FOnGetGameSessionPlayerListComplete::CreateWeakLambda(this, [this](bool bWasSuccessful, TArray<UFriendData*> PlayersData)
{
if(bWasSuccessful)
{
Tv_PlayersList->SetListItems(PlayersData);
Ws_PlayersList->SetWidgetState(EAccelByteWarsWidgetSwitcherState::Not_Empty);
}
else
{
Ws_PlayersList->SetWidgetState(EAccelByteWarsWidgetSwitcherState::Error);
}
}));
const FOnlineSubsystemAccelByte* Subsystem = static_cast<FOnlineSubsystemAccelByte*>(Online::GetSubsystem(GetWorld()));
IOnlineSessionPtr SessionInterface = Subsystem->GetSessionInterface();
if(SessionInterface.IsValid())
{
#if ENGINE_MAJOR_VERSION >= 5 && ENGINE_MINOR_VERSION >= 5
SessionInterface->ClearOnSessionParticipantJoinedDelegates(this);
SessionInterface->AddOnSessionParticipantJoinedDelegate_Handle(FOnSessionParticipantJoinedDelegate::CreateUObject(this, &ThisClass::OnSessionParticipantsJoined));
#else
SessionInterface->ClearOnSessionParticipantsChangeDelegates(this);
SessionInterface->AddOnSessionParticipantsChangeDelegate_Handle(FOnSessionParticipantsChangeDelegate::CreateUObject(this, &ThisClass::OnSessionParticipantsChanged));
#endif
}
} -
最後に、
FriendWidgetEntryクラスの CPP ファイルを開き、NativeOnListItemObjectSet()関数を見つけます。次に、以下のコードに置き換えます。以下のハイライトされたコードは、ゲームセッションプレイヤーリストのステータスを設定します。void UFriendWidgetEntry::NativeOnListItemObjectSet(UObject* ListItemObject)
{
Super::NativeOnListItemObjectSet(ListItemObject);
CachedFriendData = Cast<UFriendData>(ListItemObject);
// Display display name.
if (!CachedFriendData->DisplayName.IsEmpty())
{
Tb_DisplayName->SetText(FText::FromString(CachedFriendData->DisplayName));
}
else
{
Tb_DisplayName->SetText(FText::FromString(
UTutorialModuleOnlineUtility::GetUserDefaultDisplayName(CachedFriendData->UserId.ToSharedRef().Get())));
}
// Display avatar image.
const FString AvatarURL = CachedFriendData->AvatarURL;
Img_Avatar->LoadImage(AvatarURL);
if(CachedFriendData->DataSource != EDataSource::User)
{
Ws_OptionButtons->SetVisibility(ESlateVisibility::Hidden);
if(CachedFriendData->DataSource == EDataSource::GameSessionPlayer)
{
URecentPlayersSubsystem* RecentPlayersSubsystem = GetGameInstance()->GetSubsystem<URecentPlayersSubsystem>();
if(RecentPlayersSubsystem != nullptr)
{
Tb_GameSessionStatus->SetVisibility(ESlateVisibility::Visible);
Tb_GameSessionStatus->SetText(FText::FromString(RecentPlayersSubsystem->GetGameSessionPlayerStatus(CachedFriendData)));
const FOnlineSubsystemAccelByte* Subsystem = static_cast<FOnlineSubsystemAccelByte*>(Online::GetSubsystem(GetWorld()));
IOnlineSessionPtr SessionInterface = Subsystem->GetSessionInterface();
if(SessionInterface.IsValid())
{
#if ENGINE_MAJOR_VERSION >= 5 && ENGINE_MINOR_VERSION >= 5
SessionInterface->ClearOnSessionParticipantJoinedDelegates(this);
SessionInterface->AddOnSessionParticipantJoinedDelegate_Handle(FOnSessionParticipantJoinedDelegate::CreateUObject(this, &ThisClass::OnSessionParticipantsJoined));
#else
SessionInterface->ClearOnSessionParticipantsChangeDelegates(this);
SessionInterface->AddOnSessionParticipantsChangeDelegate_Handle(FOnSessionParticipantsChangeDelegate::CreateUObject(this, &ThisClass::OnSessionParticipantsChanged));
#endif
}
}
}
}
else
{
// Display options based on friend's invitation status.
Ws_OptionButtons->SetActiveWidgetIndex((uint8)CachedFriendData->Status);
// Show the reason why the player cannot send invitation request.
Btn_Invite->SetVisibility(!CachedFriendData->bCannotBeInvited ? ESlateVisibility::Visible : ESlateVisibility::Collapsed);
Tb_CannotInviteMessage->SetVisibility(CachedFriendData->bCannotBeInvited ? ESlateVisibility::Visible : ESlateVisibility::Collapsed);
Tb_CannotInviteMessage->SetText(FText::FromString(CachedFriendData->ReasonCannotBeInvited));
Tb_GameSessionStatus->SetVisibility(ESlateVisibility::Collapsed);
}
OnListItemObjectSet.Broadcast();
}
リソース
- このチュートリアルセクションで使用されているファイルは、Unreal Byte Wars GitHub リポジトリで入手できます。
- AccelByteWars/Source/AccelByteWars/TutorialModules/Social/FriendsEssentials/UI/FriendWidgetEntry.cpp
- AccelByteWars/Source/AccelByteWars/TutorialModules/Social/RecentPlayers/UI/RecentPlayersWidget_Starter.h
- AccelByteWars/Source/AccelByteWars/TutorialModules/Social/RecentPlayers/UI/RecentPlayersWidget_Starter.cpp
- AccelByteWars/Source/AccelByteWars/TutorialModules/Social/RecentPlayers/UI/PlayersListWidget_Starter.h
- AccelByteWars/Source/AccelByteWars/TutorialModules/Social/RecentPlayers/UI/PlayersListWidget_Starter.cpp