すべてを統合する - プレイヤーを検索する - (Unity モジュール)
注釈:本資料はAI技術を用いて翻訳されています。
UI をプレイヤー検索に接続する
-
FindFriendsMenu_Starter.csを開き、FriendsEssentialsWrapper_Starterクラスをプライベートフィールドとして宣言します。private FriendsEssentialsWrapper_Starter friendsEssentialsWrapper; -
開始時に
friendsEssentialsWrapper機能を初期化するには、Start()関数に移動して次のコードを追加します。private void Start()
{
friendsEssentialsWrapper = TutorialModuleManager.Instance.GetModuleClass<FriendsEssentialsWrapper_Starter>();
} -
FindFriend()関数を見つけて、既存の実装を次のコードに置き換えます。Byte Wars では、ユーザーが検索を実行すると、指定された値を最初にフレンドコードとして扱います。失敗した場合は、表示名として扱います。ここでは、OnUsersFriendCodeFound()関数が呼び出され、ユーザー情報を確認して表示します。private void FindFriend(string query)
{
if (string.IsNullOrEmpty(friendSearchBar.text) || string.IsNullOrEmpty(friendSearchBar.text))
{
return;
}
widgetSwitcher.SetWidgetState(AccelByteWarsWidgetSwitcher.WidgetState.Loading);
friendSearchBar.enabled = false;
ClearSearchPanel();
// Find friend by friend code, make sure the friend code is in uppercase.
friendsEssentialsWrapper.GetUserByFriendCode(query.ToUpper(), result =>
{
OnUsersFriendCodeFound(result, query, fallbackAction: () =>
{
BytewarsLogger.Log("Friend code not found, searching by exact display name");
friendsEssentialsWrapper.GetUserByExactDisplayName(query, result => OnUsersDisplayNameFound(result, query));
});
});
} -
OnUsersFriendCodeFound()というコールバック関数を作成して、フレンドコードによるユーザー検索のレスポンスを受信したときに、データ、UI の変更、およびフォールバックアクションを処理します。フレンドコードが見つからない場合は、最初にフォールバックアクションをトリガーしようとします。フォールバックアクションがない場合は、クエリが見つからなかったというメッセージを表示します。private void OnUsersFriendCodeFound(Result<AccountUserPlatformData> result, string query, Action fallbackAction = null)
{
friendSearchBar.enabled = true;
if (result.IsError)
{
if (fallbackAction is not null)
{
fallbackAction.Invoke();
return;
}
string queryNotFoundMessage = FriendsEssentialsModels.QueryNotFoundMessage.Replace("%QUERY%", query);
widgetSwitcher.ErrorMessage = queryNotFoundMessage;
widgetSwitcher.SetWidgetState(AccelByteWarsWidgetSwitcher.WidgetState.Error);
return;
}
AccountUserPlatformData userData = result.Value;
if (userData.UserId == GameData.CachedPlayerState.PlayerId)
{
BytewarsLogger.Log("Found friend code with self entry");
widgetSwitcher.ErrorMessage = FriendsEssentialsModels.FriendRequestSelfMessage;
widgetSwitcher.SetWidgetState(AccelByteWarsWidgetSwitcher.WidgetState.Error);
return;
}
SendFriendInvitation(userData.UserId, usingFriendCode: true);
CreateFriendEntry(userData.UserId, AccelByteWarsOnlineUtility.GetDisplayName(userData));
} -
OnUsersDisplayNameFound()という別のコールバック関数を作成して、検索(表示名を使用)のレスポンスを受信したときに、データと UI の変更を処理します。ユーザーが見つかった場合は、結果が表示されます。見つからない場合は、クエリが見つからなかったというメッセージを表示します。private void OnUsersDisplayNameFound(Result<PublicUserInfo> result, string query)
{
if (result.IsError)
{
string queryNotFoundMessage = FriendsEssentialsModels.QueryNotFoundMessage.Replace("%QUERY%", query);
widgetSwitcher.ErrorMessage = queryNotFoundMessage;
widgetSwitcher.SetWidgetState(AccelByteWarsWidgetSwitcher.WidgetState.Error);
return;
}
CreateFriendEntry(result.Value.userId, AccelByteWarsOnlineUtility.GetDisplayName(result.Value));
} -
CreateFriendEntry()という関数を作成して、FriendEntry.prefabをインスタンス化し、ユーザーのアバター、表示名、招待送信ボタンを表示します。private void CreateFriendEntry(string userId, string displayName)
{
if (userId == GameData.CachedPlayerState.PlayerId)
{
BytewarsLogger.Log("Skipping self entry");
widgetSwitcher.SetWidgetState(AccelByteWarsWidgetSwitcher.WidgetState.Empty);
return;
}
GameObject playerEntry = Instantiate(friendEntryPrefab, resultContentPanel);
playerEntry.name = userId;
FriendEntry playerEntryHandler = playerEntry.GetComponent<FriendEntry>();
playerEntryHandler.EntryView = FriendEntry.FriendEntryView.Searched;
playerEntryHandler.UserId = userId;
playerEntryHandler.FriendName.text = displayName;
userResult = playerEntry;
}
UI をフレンドコード表示に接続する
-
FindFriendsMenu_Starter.csを開き、SetFriendCodeText()という関数を作成して、プレイヤーのフレンドコードを表示します。private void SetFriendCodeText()
{
friendCode.SetText(FriendsEssentialsModels.FriendCodePreloadMessage);
friendsEssentialsWrapper.GetSelfFriendCode((Result<string> result) =>
{
if (!result.IsError)
{
friendCode.SetText(result.Value);
}
});
} -
Start()関数に移動して、次のコードを追加してプレイヤーのフレンドコードを表示します。private void Start()
{
friendsEssentialsWrapper = TutorialModuleManager.Instance.GetModuleClass<FriendsEssentialsWrapper_Starter>();
SetFriendCodeText();
}
UI をフレンドシップステータス確認に接続する
Byte Wars では、検索結果を受信すると、ゲームは最初にフレンドシップステータスを確認し、検索されたユーザーがローカルユーザーと NotFriend の場合にのみ招待ボタンを有効にします。
-
FindFriendsMenu_Starter.csを開き、CheckFriendshipStatus()という関数を作成して、プレイヤーと検索されたプレイヤー間のフレンドシップステータスを確認します。private void CheckFriendshipStatus(string userId)
{
friendsEssentialsWrapper.GetFriendshipStatus(userId, OnGetFriendshipStatusCompleted);
} -
OnGetFriendshipStatusCompleted()というコールバック関数を作成して、フレンドシップステータスが取得されたときに、データと UI の変更を処理します。結果により、現在のビューの状態と、検索されたプレイヤーの UI エントリに表示されるステータスメッセージが決定されます。private void OnGetFriendshipStatusCompleted(Result<FriendshipStatus> result)
{
if (userResult is null)
{
return;
}
FriendEntry entryHandler = userResult.GetComponent<FriendEntry>();
if (result.IsError)
{
entryHandler.FriendStatus.text = FriendsEssentialsModels.ErrorStatusMessage;
BytewarsLogger.LogWarning($"Unable to get friendship status: {result.Error.Message}");
widgetSwitcher.SetWidgetState(AccelByteWarsWidgetSwitcher.WidgetState.Error);
return;
}
widgetSwitcher.SetWidgetState(AccelByteWarsWidgetSwitcher.WidgetState.Not_Empty);
RelationshipStatusCode friendshipStatus = result.Value.friendshipStatus;
string statusMessage = FriendsEssentialsModels.StatusMessageMap[friendshipStatus];
entryHandler.FriendStatus.text = statusMessage;
entryHandler.SendInviteButton.interactable = friendshipStatus is RelationshipStatusCode.NotFriend;
if (friendshipStatus is RelationshipStatusCode.Outgoing)
{
entryHandler.SendInviteButton.GetComponentInChildren<TMP_Text>().text = FriendsEssentialsModels.RequestSentMessage;
}
} -
CreateFriendEntry()関数に移動して、次のコードを追加し、以下に示すようにフレンドエントリを作成した後にCheckFriendshipStatus()関数を呼び出します。private void CreateFriendEntry(string userId, string displayName)
{
//...
userResult = playerEntry;
CheckFriendshipStatus(userId);
}
UI をフレンド招待送信に接続する
-
FindFriendsMenu_Starter.csを開き、SendFriendInvitation()という関数を作成して、検索されたプレイヤーにフレンド招待を送信します。この関数は、フレンドリクエストの送信中にローディングプロンプトを表示します。private void SendFriendInvitation(string userId, bool usingFriendCode = false)
{
if (!usingFriendCode)
{
MenuManager.Instance.PromptMenu.ShowLoadingPrompt(FriendsEssentialsModels.SendingFriendRequestMessage);
}
friendsEssentialsWrapper.SendFriendRequest(userId, result => OnSendRequestComplete(result, usingFriendCode));
} -
OnSendRequestComplete()というコールバック関数を作成して、フレンドリクエストのレスポンスを受信したときに、データと UI の変更を処理します。結果により、招待送信ボタンの状態と UI に表示されるステータスメッセージが更新されます。private void OnSendRequestComplete(IResult result, bool usingFriendCode = false)
{
if (result.IsError)
{
if (usingFriendCode)
{
BytewarsLogger.LogWarning($"Unable to send friend request using friend code: {result.Error.Message}");
return;
}
string errorMessage = FriendsEssentialsModels.DefaultSendFriendRequestErrorMessage;
if (FriendsEssentialsModels.SendFriendRequestErrorMessages.TryGetValue(result.Error.Code, out string message))
{
errorMessage = message;
}
MenuManager.Instance.PromptMenu.ShowPromptMenu(FriendsEssentialsModels.PromptErrorTitle, errorMessage, "OK", null);
return;
}
string promptDetailsMessage = usingFriendCode
? FriendsEssentialsModels.FriendRequestSentFriendCodeMessage
: FriendsEssentialsModels.FriendRequestSentDetailsMessage;
MenuManager.Instance.PromptMenu.ShowPromptMenu(FriendsEssentialsModels.PromptMessageTitle,
promptDetailsMessage, "OK", null);
if (!userResult.TryGetComponent(out FriendEntry entryHandler))
{
return;
}
entryHandler.SendInviteButton.interactable = false;
entryHandler.SendInviteButton.GetComponentInChildren<TMP_Text>().text = FriendsEssentialsModels.RequestSentMessage;
entryHandler.FriendStatus.text = FriendsEssentialsModels.StatusMessageMap[RelationshipStatusCode.Outgoing];
} -
CreateFriendEntry()関数に移動して、次のコードを追加し、招待送信ボタンがクリックされたときにSendFriendInvitation()関数を呼び出します。private void CreateFriendEntry(string userId, string displayName)
{
//...
playerEntryHandler.FriendName.text = displayName;
playerEntryHandler.SendInviteButton.onClick.AddListener(() => SendFriendInvitation(userId));
userResult = playerEntry;
//...
}
UI を検索されたプレイヤーのアバター表示に接続する
-
FindFriendsMenu_Starter.csを開き、RetrieveUserAvatar()という関数を作成して、検索されたプレイヤーのアバターを取得します。private void RetrieveUserAvatar(string userId)
{
friendsEssentialsWrapper.GetUserAvatar(userId, result => OnGetAvatarCompleted(result, userId));
} -
OnGetAvatarCompleted()というコールバック関数を作成して、アバターが取得されたときに、データと UI の変更を処理します。結果により、UI に表示されるアバター画像が更新されます。private void OnGetAvatarCompleted(Result<Texture2D> result, string userId)
{
if (result.IsError)
{
BytewarsLogger.LogWarning($"Unable to get avatar for user Id: {userId}, " +
$"Error Code: {result.Error.Code}, " +
$"Error Message: {result.Error.Message}");
return;
}
if (result.Value == null || userResult == null)
{
return;
}
Image entryImage = userResult.GetComponent<FriendEntry>().FriendImage;
Rect imageRect = new Rect(0f, 0f, result.Value.width, result.Value.height);
entryImage.sprite = Sprite.Create(result.Value, imageRect, Vector2.zero);
} -
CreateFriendEntry()関数に移動して、次のコードを追加し、フレンドエントリを作成した後にRetrieveUserAvatar()関数を呼び出します。private void CreateFriendEntry(string userId, string displayName)
{
//...
userResult = playerEntry;
CheckFriendshipStatus(userId);
RetrieveUserAvatar(userId);
}
リソース
- このチュートリアルで使用されているファイルは、Unity Byte Wars GitHub リポジトリで入手できます。
- Assets/Resources/Modules/Social/FriendsEssentials/Scripts/UI/FindFriendsMenu_Starter.cs
- Assets/Resources/Modules/Social/FriendsEssentials/Prefabs/FindFriendsMenu_Starter.prefab
- Assets/Resources/Modules/Social/FriendsEssentials/Prefabs/FriendEntry.prefab
- Assets/Resources/Modules/Social/FriendsEssentials/Scripts/UI/FriendEntry.cs