본문 바로가기
유니티

Day 50 - 멀티플레이 실시간 랭킹 시스템 구현

by shin0707 2024. 12. 10.
728x90

  • 주제

>>  랭킹 시스템의 핵심 원리

>>  Unity에서 랭킹 UI 구현하기

>> 서버에서 실시간 랭킹 처리하기

>> 주기적인 랭킹 업데이트
>> 최종 테스트


  • 공부내용

멀티플레이 게임에서 랭킹 시스템은 경쟁심을 자극하며, 플레이어들이 지속적으로 게임에 참여하도록 동기를 부여한다. 오늘은 실시간 랭킹 업데이트를 중심으로, 효율적인 랭킹 시스템 구현 방안을 알아보겠다.

 

1. 랭킹 시스템의 핵심 원리

랭킹 시스템은 주로 다음과 같은 방식으로 작동한다.

  • 점수 저장: 각 플레이어의 점수를 서버에 저장
  • 정렬 및 갱신: 점수를 기준으로 랭킹을 실시간으로 갱신
  • 데이터 전송: 클라이언트가 랭킹 데이터를 주기적으로 요청

 

1-1. 실시간 갱신과 정렬의 효율성

플레이어가 많을수록 점수 정렬에 필요한 연산량이 증가한다. 이를 최적화하려면 다음 방법을 고려한다.

  • 우선순위 큐(Priority Queue): 점수 변경 시 자동으로 정렬
  • Redis: 정렬된 데이터 저장 및 빠른 읽기/쓰기

2. Unity에서 랭킹 UI 구현하기

클라이언트에서 서버에서 받아온 랭킹 데이터를 표시하려면 스크롤 뷰를 활용한다.

 

2-1. 랭킹 데이터 모델

[Serializable]
public class RankingData
{
    public string playerName;
    public int score;
}

 

 

2-2. 랭킹 UI 갱신 코드

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class RankingUIManager : MonoBehaviour
{
    public Transform content;
    public GameObject rankingItemPrefab;

    public void UpdateRanking(List<RankingData> rankings)
    {
        foreach (Transform child in content)
        {
            Destroy(child.gameObject);
        }

        foreach (var data in rankings)
        {
            var item = Instantiate(rankingItemPrefab, content);
            item.transform.Find("PlayerName").GetComponent<Text>().text = data.playerName;
            item.transform.Find("Score").GetComponent<Text>().text = data.score.ToString();
        }
    }
}

 

설명

  • 서버에서 받아온 RankingData 리스트를 순회하며 UI를 생성한다.
  • 기존 UI는 삭제하고, 새 데이터를 기반으로 업데이트한다.

 


 

3. 서버에서 실시간 랭킹 처리하기

Redis를 활용한 랭킹 저장

Redis의 Sorted Set 자료구조는 점수에 따라 데이터를 자동으로 정렬하므로 랭킹 시스템에 적합하다.

 

3-1. 플레이어 점수 저장

lua

ZADD ranking 100 "player1"
ZADD ranking 200 "player2"

 

 

3-2. 상위 10명 조회

lua

ZRANGE ranking 0 9 WITHSCORES

Redis를 사용하면 수백만 명의 데이터를 효율적으로 처리할 수 있다.


4. 주기적인 랭킹 업데이트

 

4-1. 점수 변경 후 서버 동기화

플레이어 점수가 변경될 때마다 서버로 데이터를 전송하여 즉시 반영한다.

public void UpdatePlayerScore(string playerId, int score)
{
    string jsonData = JsonUtility.ToJson(new { playerId = playerId, score = score });
    SendMessage(jsonData); // WebSocket으로 서버에 전송
}

5. 최종 테스트

 

  • 데이터 정확성: 랭킹 데이터가 정확하게 표시되는지 확인
  • 실시간 업데이트: 점수 변경 후 UI에 반영되는지 확인
  • 대량 데이터 처리: 다수의 플레이어가 접속한 상황을 시뮬레이션

 

 

728x90
반응형