1. 시스템 개요
플레이어의 게임 기록을 서버에 저장하고 순위를 표시하는 기능을 구현했습니다. 주요 기능은 다음과 같습니다:
- 명성, 최고층, 골드, 도전의 탑 킬 카운트 등 다양한 랭킹 타입 지원
- REST API를 통한 서버와의 통신
- 비동기 작업을 통한 효율적인 데이터 처리
- 직관적인 UI 인터페이스
2. 주요 컴포넌트 구조
2.1 LeaderboardManager
public class LeaderboardManager : IManager
{
private const string API_URL = "https://asia-northeast3-topandslash.cloudfunctions.net";
// 리더보드 데이터 구조 정의
public class LeaderboardEntry
{
public string playerName;
public int reputation;
public int highestFloor;
public int totalGold;
public int challengeKillCount;
public string recordDate;
}
// 주요 기능
public async Task SubmitScore() { ... }
public async Task<List<LeaderboardEntry>> GetTopScores(RankingType rankType) { ... }
}
2.2 UI 컴포넌트
public class UILeaderboard : UIPopUp
{
// UI 요소들
private UILeaderboardEntry[] entryUIs = new UILeaderboardEntry[10];
private DateTime lastRefreshTime;
private const float REFRESH_COOLDOWN = 3f;
}
3. 구현 과정에서 배운 점
비동기 프로그래밍
UnityWebRequest를 async/await로 래핑하여 사용하기 위해 확장 메서드를 구현했습니다
public static TaskAwaiter<UnityWebRequest> GetAwaiter(this UnityWebRequestAsyncOperation operation)
{
var tcs = new TaskCompletionSource<UnityWebRequest>();
operation.completed += asyncOp => tcs.SetResult(((UnityWebRequestAsyncOperation)asyncOp).webRequest);
return tcs.Task.GetAwaiter();
}
Firebase다루는법
(설명 생략)
4. 성능 최적화 포인트
1. 메모리 관리
- UI 엔트리 재사용으로 가비지 생성 최소화
- 불필요한 GameObject 생성 방지
2. 네트워크 최적화
- 새로고침 쿨다운 구현
- 비동기 통신으로 메인 스레드 블로킹 방지
3. UI 렌더링 최적화
- 필요한 엔트리만 활성화
- 스크롤 뷰 최적화