feat: 랭킹UI 추가 및 리스트 세팅 코드 추가(서버 오류로 리스트 아직 안나옴)

This commit is contained in:
aube.lee
2025-03-01 20:09:50 +09:00
parent ee133d5173
commit 3511ea679b
11 changed files with 321 additions and 66 deletions

View File

@@ -184,9 +184,9 @@ namespace TON
/// <summary>
/// 플레이어 랭킹 리스트 불러오기
/// 플레이어 랭킹 리스트 불러오기
/// </summary>
public void GetRankData(System.Action<List<ClearData>> onComplete = null)
public void GetRankData(System.Action<LitJson.JsonData> onComplete = null)
{
// 가져올 필드 지정 (모든 필드를 가져오려면 null 사용)
string[] select = new string[] { "nickname", "wave", "score", "play_time" };
@@ -207,30 +207,7 @@ namespace TON
LitJson.JsonData rankData = bro.GetReturnValuetoJSON()["rows"];
Debug.Log("가져온 데이터 수: " + rankData.Count);
// ClearData 리스트 생성 및 변환
List<ClearData> clearDataList = new List<ClearData>();
for (int i = 0; i < rankData.Count; i++)
{
LitJson.JsonData row = rankData[i];
clearDataList.Add(new ClearData
{
nickname = row["nickname"].ToString(),
wave = int.Parse(row["wave"].ToString()),
score = int.Parse(row["score"].ToString()),
playTime = float.Parse(row["play_time"].ToString()),
});
}
// 정렬 (score 내림차순, playTime 오름차순)
clearDataList.Sort((a, b) =>
{
if (a.score != b.score) return b.score.CompareTo(a.score);
return a.playTime.CompareTo(b.playTime);
});
onComplete?.Invoke(clearDataList);
onComplete?.Invoke(rankData);
}
else
{

View File

@@ -38,5 +38,39 @@ namespace TON
{
return LoadAsset<Sprite>($"UI/Monster Portrait/wave{wave}_monster", out result);
}
public bool LoadRankPawIcon(int rank, out Sprite result)
{
if (rank < 4)
{
// Rank 1, 2, 3일 때 실행할 코드
return LoadAsset<Sprite>($"UI/Ranking Paw/paw_{rank}th", out result);
}
else if (rank >= 4 && rank <= 20)
{
// Rank 4~20일 때 실행할 코드
return LoadAsset<Sprite>($"UI/Ranking Paw/paw_4th", out result);
}
else if (rank >= 21 && rank <= 50)
{
// Rank 21~50일 때 실행할 코드
return LoadAsset<Sprite>($"UI/Ranking Paw/paw_5th", out result);
}
else if (rank >= 51 || rank == -1)
{
// Rank 51 이상일 때 실행할 코드
return LoadAsset<Sprite>($"UI/Ranking Paw/paw_6th", out result);
}
else
{
result = null;
return false;
}
}
public bool LoadMyRankBoxImage(out Sprite result)
{
return LoadAsset<Sprite>($"UI/Ranking Paw/my_rank_box", out result);
}
}
}

View File

@@ -14,23 +14,19 @@ namespace TON
ControllerUI, // 캐릭터 컨트롤러 UI
LobbyUI, // 게임 로비 UI
SkillSettingUI, // 스킬 세팅 팝업 UI
RankingUI, // 랭킹 UI
IngameUI, // 인게임 표시 UI
OptionUI, // 화면 우측 상단 골드, 인벤토리, 옵션 버튼 UI
PANEL_END,
POPUP_START,
LoadingUI,
GameOverUI, // 게임 오버 시 노출되는 UI
GameWinUI, // 게임 클리어 시 노출되는 UI
PauseUI, // 일시중지 버튼 선택 시 노출되는 UI
GoldPopup,
POPUP_END,

View File

@@ -29,6 +29,7 @@ namespace TON
rankDataManager = new BackendRankDataManager();
GetMyRankData();
GetRankList();
}
public void GetMyRankData()
@@ -90,15 +91,34 @@ namespace TON
public void GetRankList()
{
rankDataManager.GetRankData(rankList =>
rankDataManager.GetRankData(rankData =>
{
int i = 1;
rankList.ForEach((data) =>
Debug.Log($"Rank {i++}: {data.nickname}, Wave {data.wave}, Score {data.score}, PlayTime {data.playTime}"));
for (int i = 0; i < rankData.Count; i++)
{
LitJson.JsonData row = rankData[i];
RankList.Add(new ClearData
{
nickname = row["nickname"].ToString(),
wave = int.Parse(row["wave"].ToString()),
score = int.Parse(row["score"].ToString()),
playTime = float.Parse(row["play_time"].ToString()),
});
}
// 정렬 (score 내림차순, playTime 오름차순)
RankList.Sort((a, b) =>
{
if (a.score != b.score) return b.score.CompareTo(a.score);
return a.playTime.CompareTo(b.playTime);
});
});
}
public int GetMyRankNumber()
{
int rankNumber = RankList.FindIndex(data => data.nickname.Equals(TOP_RECORD.nickname));
return rankNumber;
}
}
}

View File

@@ -105,9 +105,8 @@ namespace TON
public void OnClickRankingButton()
{
// TODO: 랭킹 UI 추가
StageManager.Singleton.GetRankList();
// UIManager.Show<RankingUI>(UIList.RankingUI);
// 랭킹 UI 추가
UIManager.Show<RankingUI>(UIList.RankingUI);
}
public void OnClickShopButton()

View File

@@ -0,0 +1,97 @@
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.Assertions;
using UnityEngine.UI;
namespace TON
{
public class RankingUI : UIBase
{
public static RankingUI Instance => UIManager.Singleton.GetUI<RankingUI>(UIList.RankingUI);
// 전체 랭킹 리스트를 스크롤 형식으로 구현하기 위함
public ScrollRect scrollRect;
public RankingUI_RankBox rankBoxPrefab;
public List<RectTransform> uiPrefabList = new List<RectTransform>();
public List<RankingUI_RankBox> createRankList = new List<RankingUI_RankBox>();
[SerializeField] private GameObject pawImage;
[SerializeField] private TextMeshProUGUI playerName;
[SerializeField] private TextMeshProUGUI rankNumber;
[SerializeField] private TextMeshProUGUI waveText;
[SerializeField] private TextMeshProUGUI scoreText;
[SerializeField] private TextMeshProUGUI playTimeText;
private void OnEnable()
{
// SetRankList();
SetMyRankData();
}
private void SetMyRankData()
{
ClearData TOP_RECORD = StageManager.Singleton.TOP_RECORD;
// int myRankNumber = StageManager.Singleton.GetMyRankNumber();
int myRankNumber = -1;
playerName.text = TOP_RECORD.nickname;
rankNumber.text = myRankNumber > -1 ? $"{myRankNumber} th" : "Not Record";
waveText.text = $"{TOP_RECORD.wave}";
scoreText.text = $"{TOP_RECORD.score}";
int minutes = Mathf.FloorToInt(TOP_RECORD.playTime / 60f);
int seconds = Mathf.FloorToInt(TOP_RECORD.playTime % 60f);
playTimeText.text = $"{minutes:0}m {seconds:0}s";
SetPawIcon(myRankNumber);
}
private void SetRankList()
{
// 이미 기존에 UI가 생성되어 있다면 삭제
if (createRankList.Count > 0)
{
createRankList.Clear();
}
if (uiPrefabList.Count > 0)
{
uiPrefabList.Clear();
}
List<ClearData> rankList = StageManager.Singleton.RankList;
float y = 0;
for (int i = 0; i < rankList.Count; i++)
{
ClearData clearData = rankList[i];
RankingUI_RankBox rankBox = Instantiate(rankBoxPrefab, scrollRect.content);
rankBox.gameObject.SetActive(true);
rankBox.Initalize(i + 1, clearData);
createRankList.Add(rankBox);
RectTransform rectTransform = rankBox.GetComponent<RectTransform>();
uiPrefabList.Add(rectTransform);
uiPrefabList[i].anchoredPosition = new Vector2(0f, -y);
y += uiPrefabList[i].sizeDelta.y;
}
scrollRect.content.sizeDelta = new Vector2(scrollRect.content.sizeDelta.x, y);
}
private void SetPawIcon(int rank)
{
Sprite loadedPawImage = null;
Assert.IsTrue(AssetManager.Singleton.LoadRankPawIcon(rank, out loadedPawImage));
pawImage.GetComponent<Image>().sprite = loadedPawImage;
}
public void OnClickCloseButton()
{
UIManager.Hide<RankingUI>(UIList.RankingUI);
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 4a019ce503091b94d814688735c831ce
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,51 @@
using System;
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.Assertions;
using UnityEngine.UI;
namespace TON
{
public class RankingUI_RankBox : MonoBehaviour
{
[SerializeField] private GameObject rankBoxImage;
[SerializeField] private GameObject pawImage;
[SerializeField] private TextMeshProUGUI playerName;
[SerializeField] private TextMeshProUGUI rankNumber;
[SerializeField] private TextMeshProUGUI waveText;
[SerializeField] private TextMeshProUGUI scoreText;
[SerializeField] private TextMeshProUGUI playTimeText;
public void Initalize(int rank, ClearData clearData)
{
playerName.text = clearData.nickname;
rankNumber.text = $"{rank} th";
waveText.text = $"{clearData.wave}";
scoreText.text = $"{clearData.score}";
int minutes = Mathf.FloorToInt(clearData.playTime / 60f);
int seconds = Mathf.FloorToInt(clearData.playTime % 60f);
playTimeText.text = $"{minutes:0}m {seconds:0}s";
SetPawIcon(rank);
SetMyRankBoxImage();
}
private void SetMyRankBoxImage()
{
Sprite loadedMyBoxImage = null;
Assert.IsTrue(AssetManager.Singleton.LoadMyRankBoxImage(out loadedMyBoxImage));
rankBoxImage.GetComponent<Image>().sprite = loadedMyBoxImage;
}
private void SetPawIcon(int rank)
{
Sprite loadedPawImage = null;
Assert.IsTrue(AssetManager.Singleton.LoadRankPawIcon(rank, out loadedPawImage));
pawImage.GetComponent<Image>().sprite = loadedPawImage;
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: e5f063d17b315ac49b03acf8e9dd20b4
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: