OSS でフレンドリクエストを管理する - フレンドを追加する - (Unreal Engine モジュール)
注釈:本資料はAI技術を用いて翻訳されています。
スターターパックの内容
プレイヤーを検索するモジュールでは、FriendSubsystem_Starter サブシステムクラスにいくつかのフレンド機能を実装しました。このチュートリアルでも引き続きそのクラスを使用します。
開始する前に、このチュートリアルで使用するいくつかのデリゲートが /Source/AccelByteWars/TutorialModules/Social/FriendsEssentials/FriendsEssentialsModels.h ファイルに用意されています。
-
キャッシュされたフレンドデータが更新されたときのコールバックとして使用されるデリゲート。
DECLARE_DELEGATE_ThreeParams(FOnGetCacheFriendListComplete, bool /*bWasSuccessful*/, TArray<TSharedRef<FOnlineFriend>>& /*CachedFriendList*/, const FString& /*ErrorMessage*/);
DECLARE_DELEGATE(FOnCachedFriendsDataUpdated); -
受信および送信されたフレンドリクエストの取得が完了したときのコールバックとして使用されるデリゲート。
// ...
DECLARE_DELEGATE_ThreeParams(FOnGetInboundFriendRequestListComplete, bool /*bWasSuccessful*/, TArray<UFriendData*> /*FriendRequests*/, const FString& /*ErrorMessage*/);
DECLARE_DELEGATE_ThreeParams(FOnGetOutboundFriendRequestListComplete, bool /*bWasSuccessful*/, TArray<UFriendData*> /*FriendRequests*/, const FString& /*ErrorMessage*/); -
フレンドリクエストの承認、拒否、キャンセルが完了したときのコールバックとして使用されるデリゲート。
// ...
DECLARE_DELEGATE_TwoParams(FOnAcceptFriendRequestComplete, bool /*bWasSuccessful*/, const FString& /*ErrorMessage*/);
DECLARE_DELEGATE_TwoParams(FOnRejectFriendRequestComplete, bool /*bWasSuccessful*/, const FString& /*ErrorMessage*/);
DECLARE_DELEGATE_TwoParams(FOnCancelFriendRequestComplete, bool /*bWasSuccessful*/, const FString& /*ErrorMessage*/);
受信したフレンドリクエストの取得を実装する
このセクションでは、受信したフレンドリクエストのリストを取得する機能を実装します。
-
以前、
FriendsSubsystem_StarterにCacheFriendList()という関数を作成しました。この関数は、受信したフレンドリクエストを含むフレンドリストを取得してキャッシュするために使用されます。したがって、受信したフレンドリクエストを取得するには、そのキャッシュされたフレンドリストをフィルタリングするだけで済みます。 -
FriendsSubsystem_Starterクラスのヘッダーファイルを開き、以下の関数宣言を作成します。public:
// ...
void GetInboundFriendRequestList(const APlayerController* PC, const FOnGetInboundFriendRequestListComplete& OnComplete = FOnGetInboundFriendRequestListComplete());注記「Inbound」フレンドリクエストは、「受信した」フレンドリクエストの別の呼び方です。
-
上記の関数の定義を作成します。
FriendsSubsystem_Starterクラスの CPP ファイルを開き、以下のコードを追加します。この関数は、キャッシュされたフレンドリストをフィルタリングして、受信したフレンドリクエストを取得します。void UFriendsSubsystem_Starter::GetInboundFriendRequestList(const APlayerController* PC, const FOnGetInboundFriendRequestListComplete& OnComplete)
{
if (!ensure(FriendsInterface))
{
UE_LOG_FRIENDS_ESSENTIALS(Warning, TEXT("Cannot query friend request list. Friends Interface is not valid."));
return;
}
// Get friend inbound request list from cache.
const int32 LocalUserNum = GetLocalUserNumFromPlayerController(PC);
GetCacheFriendList(LocalUserNum, true, FOnGetCacheFriendListComplete::CreateWeakLambda(this, [this, OnComplete](bool bWasSuccessful, TArray<TSharedRef<FOnlineFriend>>& CachedFriendList, const FString& ErrorMessage)
{
if (bWasSuccessful)
{
// Filter pending inbound friend requests.
CachedFriendList = CachedFriendList.FilterByPredicate([](const TSharedRef<FOnlineFriend>& Friend)
{
return Friend->GetInviteStatus() == EInviteStatus::PendingInbound;
});
TArray<UFriendData*> InboundFriendRequestList;
for (const TSharedRef<FOnlineFriend>& TempData : CachedFriendList)
{
InboundFriendRequestList.Add(UFriendData::ConvertToFriendData(TempData, this));
}
OnComplete.ExecuteIfBound(true, InboundFriendRequestList, TEXT(""));
}
else
{
OnComplete.ExecuteIfBound(false, TArray<UFriendData*>(), ErrorMessage);
}
}));
}
送信したフレンドリクエストの取得を実装する
このセクションでは、送信したフレンドリクエストのリストを取得する機能を実装します。
-
FriendsSubsystem_Starterクラスのヘッダーファイルを開き、以下の関数宣言を作成します。public:
// ...
void GetOutboundFriendRequestList(const APlayerController* PC, const FOnGetOutboundFriendRequestListComplete& OnComplete = FOnGetOutboundFriendRequestListComplete());注記「Outbound」フレンドリクエストは、「送信した」フレンドリクエストの別の呼び方です。
-
上記の関数の定義を作成します。
FriendsSubsystem_Starterクラスの CPP ファイルを開き、以下のコードを追加します。受信したフレンドリクエストの取得と同様に、送信したフレンドリクエストを取得するには、キャッシュされたフレンドリストをフィルタリングするだけで済みます。void UFriendsSubsystem_Starter::GetOutboundFriendRequestList(const APlayerController* PC, const FOnGetOutboundFriendRequestListComplete& OnComplete)
{
if (!ensure(FriendsInterface))
{
UE_LOG_FRIENDS_ESSENTIALS(Warning, TEXT("Cannot query friend request list. Friends Interface is not valid."));
return;
}
// Get friend outbound request list from cache.
const int32 LocalUserNum = GetLocalUserNumFromPlayerController(PC);
GetCacheFriendList(LocalUserNum, true, FOnGetCacheFriendListComplete::CreateWeakLambda(this, [this, OnComplete](bool bWasSuccessful, TArray<TSharedRef<FOnlineFriend>>& CachedFriendList, const FString& ErrorMessage)
{
if (bWasSuccessful)
{
// Filter pending outbound friend requests.
CachedFriendList = CachedFriendList.FilterByPredicate([](const TSharedRef<FOnlineFriend>& Friend)
{
return Friend->GetInviteStatus() == EInviteStatus::PendingOutbound;
});
TArray<UFriendData*> OutbondFriendRequestList;
for (const TSharedRef<FOnlineFriend>& TempData : CachedFriendList)
{
OutbondFriendRequestList.Add(UFriendData::ConvertToFriendData(TempData, this));
}
OnComplete.ExecuteIfBound(true, OutbondFriendRequestList, TEXT(""));
}
else
{
OnComplete.ExecuteIfBound(false, TArray<UFriendData*>(), ErrorMessage);
}
}));
}
受信したフレンドリクエストの承認を実装する
このセクションでは、受信したフレンドリクエストを承認する機能を実装します。
-
FriendsSubsystem_Starterクラスのヘッダーファイルを開き、以下の関数を宣言します。public:
// ...
void AcceptFriendRequest(const APlayerController* PC, const FUniqueNetIdRepl FriendUserId, const FOnAcceptFriendRequestComplete& OnComplete = FOnAcceptFriendRequestComplete()); -
フレンドリクエストの承認プロセスが完了したときに処理するコールバック関数も作成する必要があります。
protected:
// ...
void OnAcceptFriendRequestComplete(int32 LocalUserNum, bool bWasSuccessful, const FUniqueNetId& FriendId, const FString& ListName, const FString& ErrorStr, const FOnAcceptFriendRequestComplete OnComplete); -
上記の関数を定義します。
FriendsSubsystem_Starterクラスの CPP ファイルを開き、AcceptFriendRequest()関数を定義します。この関数はフレンドリクエストを承認し、OnAcceptFriendRequestComplete()関数を呼び出してコールバックを処理します。void UFriendsSubsystem_Starter::AcceptFriendRequest(const APlayerController* PC, const FUniqueNetIdRepl FriendUserId, const FOnAcceptFriendRequestComplete& OnComplete)
{
if (!ensure(FriendsInterface) || !ensure(PromptSubsystem))
{
UE_LOG_FRIENDS_ESSENTIALS(Warning, TEXT("Cannot accept friend request. Friends Interface or Prompt Subsystem is not valid."));
return;
}
PromptSubsystem->ShowLoading(ACCEPT_FRIEND_REQUEST_MESSAGE);
const int32 LocalUserNum = GetLocalUserNumFromPlayerController(PC);
FriendsInterface->AcceptInvite(LocalUserNum, FriendUserId.GetUniqueNetId().ToSharedRef().Get(), TEXT(""), FOnAcceptInviteComplete::CreateUObject(this, &ThisClass::OnAcceptFriendRequestComplete, OnComplete));
} -
フレンドリクエストの承認プロセスが完了したときに呼び出される
OnAcceptFriendRequestComplete()関数を定義します。この関数は、受信したフレンドリクエストの承認プロセスが成功したかどうかを示すログを出力し、コールバックデリゲートをトリガーし、リクエストのステータスをプレイヤーに伝えるポップアップメッセージを表示します。なお、PromptSubsystemは Byte Wars 固有のものであるため、空のプロジェクトではこのオブジェクトは見つかりません。void UFriendsSubsystem_Starter::OnAcceptFriendRequestComplete(int32 LocalUserNum, bool bWasSuccessful, const FUniqueNetId& FriendId, const FString& ListName, const FString& ErrorStr, const FOnAcceptFriendRequestComplete OnComplete)
{
PromptSubsystem->HideLoading();
if (bWasSuccessful)
{
UE_LOG_FRIENDS_ESSENTIALS(Warning, TEXT("Success to accept a friend request."));
PromptSubsystem->ShowMessagePopUp(MESSAGE_PROMPT_TEXT, SUCCESS_ACCEPT_FRIEND_REQUEST);
OnComplete.ExecuteIfBound(true, TEXT(""));
}
else
{
UE_LOG_FRIENDS_ESSENTIALS(Warning, TEXT("Failed to accept a friend request. Error: %s"), *ErrorStr);
PromptSubsystem->ShowMessagePopUp(ERROR_PROMPT_TEXT, FText::FromString(ErrorStr));
OnComplete.ExecuteIfBound(false, ErrorStr);
}
}
受信したフレンドリクエストの拒否を実装する
このセクションでは、受信したフレンドリクエストを拒否する機能を実装します。
-
FriendsSubsystem_Starterクラスのヘッダーファイルを開き、以下の関数を宣言します。public:
// ...
void RejectFriendRequest(const APlayerController* PC, const FUniqueNetIdRepl FriendUserId, const FOnRejectFriendRequestComplete& OnComplete = FOnRejectFriendRequestComplete()); -
フレンドリクエストの拒否プロセスが完了したときに処理するコールバック関数も作成する必要があります。
protected:
// ...
void OnRejectFriendRequestComplete(int32 LocalUserNum, bool bWasSuccessful, const FUniqueNetId& FriendId, const FString& ListName, const FString& ErrorStr, const FOnRejectFriendRequestComplete OnComplete); -
上記の関数を定義します。
FriendsSubsystem_Starterクラスの CPP ファイルを開き、RejectFriendRequest()関数を定義します。この関数はフレンドリクエストを拒否し、OnRejectFriendRequestComplete()関数を呼び出してコールバックを処理します。void UFriendsSubsystem_Starter::RejectFriendRequest(const APlayerController* PC, const FUniqueNetIdRepl FriendUserId, const FOnRejectFriendRequestComplete& OnComplete)
{
if (!ensure(FriendsInterface) || !ensure(PromptSubsystem))
{
UE_LOG_FRIENDS_ESSENTIALS(Warning, TEXT("Cannot reject friend request. Friends Interface or Prompt Subsystem is not valid."));
return;
}
PromptSubsystem->ShowLoading(REJECT_FRIEND_REQUEST_MESSAGE);
const int32 LocalUserNum = GetLocalUserNumFromPlayerController(PC);
OnRejectFriendRequestCompleteDelegateHandle = FriendsInterface->AddOnRejectInviteCompleteDelegate_Handle(LocalUserNum, FOnRejectInviteCompleteDelegate::CreateUObject(this, &ThisClass::OnRejectFriendRequestComplete, OnComplete));
FriendsInterface->RejectInvite(LocalUserNum, FriendUserId.GetUniqueNetId().ToSharedRef().Get(), TEXT(""));
} -
フレンドリクエストの拒否プロセスが完了したときに呼び出される
OnRejectFriendRequestComplete()関数を定義します。この関数は、受信したフレンドリクエストの拒否プロセスが成功したかどうかを示すログを出力し、コールバックデリゲートをトリガーし、リクエストのステータスをプレイヤーに伝えるポップアップを表示します。void UFriendsSubsystem_Starter::OnRejectFriendRequestComplete(int32 LocalUserNum, bool bWasSuccessful, const FUniqueNetId& FriendId, const FString& ListName, const FString& ErrorStr, const FOnRejectFriendRequestComplete OnComplete)
{
PromptSubsystem->HideLoading();
FriendsInterface->ClearOnRejectInviteCompleteDelegate_Handle(LocalUserNum, OnRejectFriendRequestCompleteDelegateHandle);
if (bWasSuccessful)
{
UE_LOG_FRIENDS_ESSENTIALS(Warning, TEXT("Success to reject a friend request."));
PromptSubsystem->ShowMessagePopUp(MESSAGE_PROMPT_TEXT, SUCCESS_REJECT_FRIEND_REQUEST);
OnComplete.ExecuteIfBound(true, TEXT(""));
}
else
{
UE_LOG_FRIENDS_ESSENTIALS(Warning, TEXT("Failed to reject a friend request. Error: %s"), *ErrorStr);
PromptSubsystem->ShowMessagePopUp(ERROR_PROMPT_TEXT, FText::FromString(ErrorStr));
OnComplete.ExecuteIfBound(false, ErrorStr);
}
}
送信したフレンドリクエストのキャンセルを実装する
このセクションでは、送信したフレンドリクエストをキャンセルする機能を実装します。
-
FriendsSubsystem_Starterクラスのヘッダーファイルを開き、以下の関数を宣言します。public:
// ...
void CancelFriendRequest(const APlayerController* PC, const FUniqueNetIdRepl FriendUserId, const FOnCancelFriendRequestComplete& OnComplete = FOnCancelFriendRequestComplete()); -
送信したフレンドリクエストのキャンセルプロセスが完了したときに処理するコールバック関数も作成する必要があります。
protected:
// ...
void OnCancelFriendRequestComplete(int32 LocalUserNum, bool bWasSuccessful, const FUniqueNetId& FriendId, const FString& ListName, const FString& ErrorStr, const FOnCancelFriendRequestComplete OnComplete); -
上記の関数を定義します。
FriendsSubsystem_Starterクラスの CPP ファイルを開き、CancelFriendRequest()関数を定義します。この関数は送信したフレンドリクエストをキャンセルし、OnCancelFriendRequestComplete()関数を呼び出してコールバックを処理します。void UFriendsSubsystem_Starter::CancelFriendRequest(const APlayerController* PC, const FUniqueNetIdRepl FriendUserId, const FOnCancelFriendRequestComplete& OnComplete)
{
if (!ensure(FriendsInterface) || !ensure(PromptSubsystem))
{
UE_LOG_FRIENDS_ESSENTIALS(Warning, TEXT("Cannot cancel friend request. Friends Interface or Prompt Subsystem is not valid."));
return;
}
PromptSubsystem->ShowLoading(CANCEL_FRIEND_REQUEST_MESSAGE);
const int32 LocalUserNum = GetLocalUserNumFromPlayerController(PC);
OnCancelFriendRequestCompleteDelegateHandle = FriendsInterface->AddOnDeleteFriendCompleteDelegate_Handle(LocalUserNum, FOnDeleteFriendCompleteDelegate::CreateUObject(this, &ThisClass::OnCancelFriendRequestComplete, OnComplete));
FriendsInterface->DeleteFriend(LocalUserNum, FriendUserId.GetUniqueNetId().ToSharedRef().Get(), TEXT(""));
} -
送信したフレンドリクエストのキャンセルプロセスが完了したときに呼び出される
OnCancelFriendRequestComplete()関数を定義します。この関数は、送信したフレンドリクエストのキャンセルプロセスが成功したかどうかを示すログを出力し、コールバックデリゲートをトリガーします。void UFriendsSubsystem_Starter::OnCancelFriendRequestComplete(int32 LocalUserNum, bool bWasSuccessful, const FUniqueNetId& FriendId, const FString& ListName, const FString& ErrorStr, const FOnCancelFriendRequestComplete OnComplete)
{
PromptSubsystem->HideLoading();
FriendsInterface->ClearOnDeleteFriendCompleteDelegate_Handle(LocalUserNum, OnCancelFriendRequestCompleteDelegateHandle);
if (bWasSuccessful)
{
UE_LOG_FRIENDS_ESSENTIALS(Warning, TEXT("Success to cancel a friend request."));
PromptSubsystem->ShowMessagePopUp(MESSAGE_PROMPT_TEXT, SUCCESS_CANCEL_FRIEND_REQUEST);
OnComplete.ExecuteIfBound(true, TEXT(""));
}
else
{
UE_LOG_FRIENDS_ESSENTIALS(Warning, TEXT("Failed to cancel a friend request. Error: %s"), *ErrorStr);
PromptSubsystem->ShowMessagePopUp(ERROR_PROMPT_TEXT, FText::FromString(ErrorStr));
OnComplete.ExecuteIfBound(false, ErrorStr);
}
}
フレンドリストの更新をリッスンする
プレイヤーがフレンドリクエストを承認、拒否、またはキャンセルすると、キャッシュされたフレンドリストは AccelByte Gaming Services (AGS) Online Subsystem (OSS) によって自動的に更新されます。このセクションでは、フレンドリストが更新されたときに実行されるデリゲートをバインドする方法を学びます。これは、後で表示されるエントリウィジェットを更新する必要がある場合に役立ちます。
-
FriendsSubsystem_Starterクラスのヘッダーファイルを開き、以下の関数宣言を作成します。public:
// ...
void BindOnCachedFriendsDataUpdated(const APlayerController* PC, const FOnCachedFriendsDataUpdated& Delegate);
void UnbindOnCachedFriendsDataUpdated(const APlayerController* PC); -
FriendsSubsystem_Starterクラスの CPP ファイルを開き、上記の関数の定義を作成します。まず、BindOnCachedFriendsDataUpdated()関数から始めます。void UFriendsSubsystem_Starter::BindOnCachedFriendsDataUpdated(const APlayerController* PC, const FOnCachedFriendsDataUpdated& Delegate)
{
ensure(FriendsInterface);
const int32 LocalUserNum = GetLocalUserNumFromPlayerController(PC);
// Add on friends changed delegate.
OnFriendsChangeDelegateHandles.Add(LocalUserNum, FriendsInterface->AddOnFriendsChangeDelegate_Handle(LocalUserNum, FOnFriendsChangeDelegate::CreateWeakLambda(this, [Delegate]() { Delegate.ExecuteIfBound(); })));
} -
UnbindOnCachedFriendsDataUpdated()関数の定義を作成します。void UFriendsSubsystem_Starter::UnbindOnCachedFriendsDataUpdated(const APlayerController* PC)
{
ensure(FriendsInterface);
const int32 LocalUserNum = GetLocalUserNumFromPlayerController(PC);
// Clear on friends changed delegate.
FDelegateHandle TempHandle = OnFriendsChangeDelegateHandles[LocalUserNum];
if (TempHandle.IsValid())
{
FriendsInterface->ClearOnFriendsChangeDelegate_Handle(LocalUserNum, TempHandle);
}
} -
これらの関数の背後にある考え方を理解するために少し時間を取ってください。基本的に、
BindOnCachedFriendsDataUpdated()関数を使用して、フレンドリストが更新されたときに実行されるデリゲートをバインドできます。そのデリゲートをアンバインドするには、UnbindOnCachedFriendsDataUpdated()関数を使用できます。次のチュートリアルでは、これらの関数を使用して表示されるエントリウィジェットを更新します。
リソース
- このチュートリアルセクションで使用されるファイルは、Unreal Byte Wars GitHub リポジトリで入手できます。