[Unity]리더보드 시스템을 구현해보자

네,가능합니다 ㅣ 2025. 1. 16. 20:23

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 렌더링 최적화

 

  • 요한 엔트리만 활성화
  • 스크롤  최적화