すべてを統合する - フレンドリストを表示する - (Unity モジュール)
注釈:本資料はAI技術を用いて翻訳されています。
フレンドリストを取得するために UI を接続する
-
FriendsMenu_Starter.csを開き、FriendsEssentialsWrapper_Starterクラスをプライベート変数として宣言します。private FriendsEssentialsWrapper_Starter friendsEssentialsWrapper; -
既存の
LoadFriendList()関数を以下のコードに置き換えて、FriendsEssentialsWrapper_StarterクラスからGetFriendList()関数を呼び出します。これにより、バックエンドから実際のフレンドリストの取得がトリガーされます。private void LoadFriendList()
{
widgetSwitcher.SetWidgetState(AccelByteWarsWidgetSwitcher.WidgetState.Loading);
ClearFriendList();
friendsEssentialsWrapper.GetFriendList(OnLoadFriendListCompleted);
} -
既存の
OnLoadFriendListCompletedコールバック関数を以下のコードに置き換えて、結果を処理します。private void OnLoadFriendListCompleted(Result<Friends> result)
{
if (result.IsError)
{
widgetSwitcher.SetWidgetState(AccelByteWarsWidgetSwitcher.WidgetState.Error);
return;
}
if (result.Value.friendsId.Length <= 0)
{
widgetSwitcher.SetWidgetState(AccelByteWarsWidgetSwitcher.WidgetState.Empty);
return;
}
GetBulkUserInfo(result.Value);
} -
GetBulkUserInfo()という関数を作成して、フレンドIDのリストからユーザー情報を取得します。private void GetBulkUserInfo(Friends friends)
{
friendsEssentialsWrapper.GetBulkUserInfo(friends.friendsId, OnGetBulkUserInfoCompleted);
} -
OnGetBulkUserInfoCompleted()というコールバック関数を作成して、結果を処理します。private void OnGetBulkUserInfoCompleted(Result<AccountUserPlatformInfosResponse> result)
{
if (result.IsError)
{
widgetSwitcher.SetWidgetState(AccelByteWarsWidgetSwitcher.WidgetState.Error);
return;
}
ClearFriendList();
widgetSwitcher.SetWidgetState(AccelByteWarsWidgetSwitcher.WidgetState.Not_Empty);
PopulateFriendList(result.Value.Data);
} -
PopulateFriendList()という関数を作成して、フレンドリストを入力します。private void PopulateFriendList(params AccountUserPlatformData[] userInfo)
{
foreach (AccountUserPlatformData baseUserInfo in userInfo)
{
CreateFriendEntry(baseUserInfo.UserId, AccelByteWarsOnlineUtility.GetDisplayName(baseUserInfo));
}
} -
CreateFriendEntry()という関数を作成して、各フレンドのフレンドエントリを作成します。フレンドの表示名が空の場合、この関数はユーザーIDの最初の5文字を表示名として使用します。private void CreateFriendEntry(string userId, string displayName)
{
GameObject playerEntry = InstantiateToColumn(friendEntryPrefab);
playerEntry.name = userId;
FriendEntry playerEntryHandler = playerEntry.GetComponent<FriendEntry>();
playerEntryHandler.EntryView = FriendEntry.FriendEntryView.Default;
playerEntryHandler.UserId = userId;
playerEntryHandler.FriendName.text = displayName;
friendEntries.Add(userId, playerEntry);
} -
既存の
OnEnable()関数を以下のコードに置き換えて、friendsEssentialsWrapper変数を初期化し、LoadFriendList()関数を呼び出します。private void OnEnable()
{
if (friendsEssentialsWrapper == null)
{
friendsEssentialsWrapper = TutorialModuleManager.Instance.GetModuleClass<FriendsEssentialsWrapper_Starter>();
}
if (friendsEssentialsWrapper == null)
{
BytewarsLogger.LogWarning("FriendsEssentialsWrapper_Starter is not enabled");
return;
}
LoadFriendList();
}
フレンドのアバターを表示するためにUIを接続する
-
FriendsMenu_Starter.csを開き、RetrieveUserAvatar()という関数を作成して、ユーザーアバターを取得します。private void RetrieveUserAvatar(string userId)
{
friendsEssentialsWrapper.GetUserAvatar(userId, result => OnGetAvatarCompleted(result, userId));
} -
OnGetAvatarCompleted()というコールバック関数を作成して、結果を処理します。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 || !friendEntries.TryGetValue(userId, out GameObject friendEntry))
{
return;
}
Image friendImage = friendEntry.GetComponent<FriendEntry>().FriendImage;
Rect imageRect = new Rect(0f, 0f, result.Value.width, result.Value.height);
friendImage.sprite = Sprite.Create(result.Value, imageRect, Vector2.zero);
} -
CreateFriendEntry()関数を更新して、RetrieveUserAvatar()関数を呼び出します。以下のコードを追加します:private void CreateFriendEntry(string userId, string displayName)
{
//...
friendEntries.Add(userId, playerEntry);
RetrieveUserAvatar(userId);
}
エントリをフレンド詳細メニューに接続する
-
FriendsMenu_Starter.csを開き、OnFriendEntryClicked()という関数を作成して、フレンドエントリのクリックイベントを処理します。この関数は、フレンド詳細メニューキャンバスをインスタンス化し、ユーザー情報を渡し、メニューをフレンド詳細メニューに変更します。private void OnFriendEntryClicked(string userId, string displayName, FriendEntry playerEntryHandler)
{
if (friendDetailsAssetEnum is AssetEnum.FriendDetailsMenu_Starter)
{
MenuManager.Instance.InstantiateCanvas(friendDetailsAssetEnum);
}
if (!MenuManager.Instance.AllMenu.TryGetValue(friendDetailsAssetEnum, out MenuCanvas menuCanvas))
{
BytewarsLogger.LogWarning($"Unable to find {friendDetailsAssetEnum} in menu manager");
return;
}
if (menuCanvas.gameObject.TryGetComponent(out FriendDetailsMenu_Starter friendDetailMenu))
{
friendDetailMenu.UserId = userId;
friendDetailMenu.FriendImage.sprite = playerEntryHandler.FriendImage.sprite;
friendDetailMenu.FriendDisplayName.text = displayName;
}
MenuManager.Instance.ChangeToMenu(friendDetailsAssetEnum);
} -
CreateFriendEntry()関数を更新して、フレンドエントリにイベントリスナーを追加し、OnFriendEntryClicked()関数を呼び出します。以下のコードを追加します。private void CreateFriendEntry(string userId, string displayName)
{
//...
playerEntryHandler.FriendName.text = displayName;
Button friendButton = playerEntry.GetComponent<Button>();
friendButton.onClick.AddListener(() => OnFriendEntryClicked(userId, displayName, playerEntryHandler));
friendEntries.Add(userId, playerEntry);
//...
}
UIをフレンドアクションイベントに接続する
このセクションでは、フレンドを追加する および フレンドを管理する モジュールで使用した静的アクションイベントを使用します。これらのモジュールを完了していない場合、またはこれらのモジュールを完了する予定がない場合は、リアルタイムのフレンドリスト更新機能のみが失われます。
-
FriendsMenu_Starter.csを開き、OnFriendListUpdate()という関数を作成します。これにより、LoadFriendList()関数がトリガーされ、現在表示されているリストが更新されます。private void OnFriendListUpdate(string userId)
{
if (!gameObject.activeSelf)
{
return;
}
LoadFriendList();
} -
Awake()関数を更新して、ラッパー内のアクションイベントをOnFriendListUpdate()関数にバインドします。以下のコードを追加します:private void Awake()
{
//...
backButton.onClick.AddListener(MenuManager.Instance.OnBackPressed);
FriendsEssentialsModels.OnRequestAccepted += OnFriendListUpdate;
ManagingFriendsModels.OnPlayerUnfriended += OnFriendListUpdate;
ManagingFriendsModels.OnPlayerBlocked += OnFriendListUpdate;
//...
} -
OnDestroy()関数を以下のコードに置き換えて、UIが破棄されたときにこれらのイベントをアンバインドします。private void OnDestroy()
{
FriendsEssentialsModels.OnRequestAccepted -= OnFriendListUpdate;
ManagingFriendsModels.OnPlayerUnfriended -= OnFriendListUpdate;
ManagingFriendsModels.OnPlayerBlocked -= OnFriendListUpdate;
}
フレンド詳細を表示するためにUIを接続する
-
FriendDetailsMenu_Starter.csを開き、以下のコードを追加してモジュールラッパーを宣言します:private FriendsEssentialsWrapper friendsEssentialsWrapper; -
OnEnable()関数を更新して、モジュールラッパーを定義します。以下のコードを追加します。private void OnEnable()
{
if (friendsEssentialsWrapper == null)
{
friendsEssentialsWrapper = TutorialModuleManager.Instance.GetModuleClass<FriendsEssentialsWrapper>();
}
if (friendsEssentialsWrapper != null && !string.IsNullOrEmpty(UserId))
{
friendsEssentialsWrapper.GetFriendshipStatus(UserId, OnGetFriendshipStatusCompleted);
}
DisableAllButtons();
} -
Awake()を更新して、受信/リクエストのライフサイクルイベントを接続し、登録された関数を宣言します。private void Awake()
{
...
InitializePartyButtons();
FriendsEssentialsModels.OnIncomingRequest += OnIncomingRequest;
FriendsEssentialsModels.OnRequestAccepted += OnRequestAccepted;
FriendsEssentialsModels.OnRequestCanceled += OnRequestCanceled;
FriendsEssentialsModels.OnRequestRejected += OnRequestRejected;
}
private void OnRequestRejected (string userId)
{
if (!gameObject.activeSelf || userId != UserId)
{
return;
}
addFriendButton.gameObject.SetActive(true);
cancelButton.gameObject.SetActive(false);
}
private void OnRequestCanceled (string userId)
{
if (!gameObject.activeSelf || userId != UserId)
{
return;
}
addFriendButton.gameObject.SetActive(true);
acceptButton.gameObject.SetActive(false);
rejectButton.gameObject.SetActive(false);
}
private void OnIncomingRequest (string userId)
{
if (!gameObject.activeSelf || userId != UserId)
{
return;
}
acceptButton.gameObject.SetActive(true);
rejectButton.gameObject.SetActive(true);
addFriendButton.gameObject.SetActive(false);
}
private void OnRequestAccepted (string userId)
{
if (!gameObject.activeSelf || userId != UserId)
{
return;
}
unfriendButton.gameObject.SetActive(true);
cancelButton.gameObject.SetActive(false);
}
フレンドリクエストを送信するためにUIを接続する
-
Addfriend()関数を更新して、プレイヤーにフレンドリクエストを送信できるようにします。既存の実装を以下のコードに置き換えます。private void AddFriend()
{
friendsEssentialsWrapper.SendFriendRequest(UserId, OnAddfriendCompleted);
addFriendButton.gameObject.SetActive(false);
} -
OnAddfriendCompleted()という新しい関数を作成して、結果を処理します。private void OnAddfriendCompleted(Result result)
{
if (result.IsError)
{
MenuManager.Instance.PromptMenu.ShowPromptMenu(FriendsEssentialsModels.PromptErrorTitle,
result.Error.Message, "OK", null);
return;
}
BytewarsLogger.Log($"Successfully add player with user ID: {UserId}");
MenuManager.Instance.PushNotification(new PushNotificationModel
{
Message = result.IsError ? FriendsEssentialsModels.DefaultSendFriendRequestErrorMessage : FriendsEssentialsModels.FriendRequestSentDetailsMessage
});
cancelButton.gameObject.SetActive(true);
}
フレンドリクエストをキャンセルするためにUIを接続する
-
CancelFriendRequest()関数を更新して、フレンドリクエストをキャンセルします。既存の実装を以下のコードに置き換えます。private void CancelFriendRequest()
{
friendsEssentialsWrapper.CancelFriendRequests(UserId, OnFriendRequestCanceled);
cancelButton.gameObject.SetActive(false);
} -
OnFriendRequestCanceled()という新しい関数を作成して、結果を処理します。private void OnFriendRequestCanceled (Result result)
{
if (result.IsError)
{
MenuManager.Instance.PromptMenu.ShowPromptMenu(FriendsEssentialsModels.PromptErrorTitle,
result.Error.Message, "OK", null);
return;
}
BytewarsLogger.Log($"Successfully canceled friend request with user ID: {UserId}");
MenuManager.Instance.PushNotification(new PushNotificationModel
{
Message = result.IsError ? FriendsEssentialsModels.ErrorStatusMessage : FriendsEssentialsModels.FriendRequestCanceledMessage
});
addFriendButton.gameObject.SetActive(true);
}
フレンドリクエストを承認するためにUIを接続する
-
AcceptFriendRequest()関数を更新して、フレンドリクエストを承認します。既存の実装を以下のコードに置き換えます。private void AcceptFriendRequest()
{
friendsEssentialsWrapper.AcceptFriend(UserId, OnAcceptFriendCompleted);
acceptButton.gameObject.SetActive(false);
rejectButton.gameObject.SetActive(false);
} -
OnAcceptFriendCompleted()という新しい関数を作成して、結果を処理します。private void OnAcceptFriendCompleted (Result result)
{
if (result.IsError)
{
MenuManager.Instance.PromptMenu.ShowPromptMenu(FriendsEssentialsModels.PromptErrorTitle,
result.Error.Message, "OK", null);
return;
}
BytewarsLogger.Log($"Successfully accepted friend request with user ID: {UserId}");
MenuManager.Instance.PushNotification(new PushNotificationModel
{
Message = result.IsError ? FriendsEssentialsModels.ErrorStatusMessage : FriendsEssentialsModels.FriendRequestAcceptedMessage
});
unfriendButton.gameObject.SetActive(true);
}
フレンドリクエストを拒否するためにUIを接続する
-
RejectFriendRequest()関数を更新して、フレンドリクエストを拒否します。既存の実装を以下のコードに置き換えます。private void RejectFriendRequest()
{
friendsEssentialsWrapper.DeclineFriend(UserId, OnRejectFriendRequest);
rejectButton.gameObject.SetActive(false);
acceptButton.gameObject.SetActive(false);
} -
OnRejectFriendRequest()という新しい関数を作成して、結果を処理します。private void OnRejectFriendRequest (Result result)
{
if (result.IsError)
{
MenuManager.Instance.PromptMenu.ShowPromptMenu(FriendsEssentialsModels.PromptErrorTitle,
result.Error.Message, "OK", null);
return;
}
BytewarsLogger.Log($"Successfully accepted friend request with user ID: {UserId}");
MenuManager.Instance.PushNotification(new PushNotificationModel
{
Message = result.IsError ? FriendsEssentialsModels.ErrorStatusMessage : FriendsEssentialsModels.FriendRequestRejectedMessage
});
addFriendButton.gameObject.SetActive(true);
}
リソース
- このチュートリアルで使用されているファイルは、Unity Byte Wars GitHub リポジトリで入手できます。