TIL 0227 게임개발 심화 팀 - 1 / 랭킹 시스템

강성원·2024년 2월 28일
0

TIL 오늘 배운 것

목록 보기
42/69

오늘 고민한 내용

리듬 게임에서 랭킹 시스템을 어떻게 만들까 고민중이다.

저장 방식

처음에는 랭킹 저장에 대해 엑셀과 스크립터블 오브젝트를 이용한 방식을 가져갈까 했다.

하지만 이 방식은 대량의 데이터가 엑셀에 존재할 때 게임으로 가져오는 것(대화, rpg아이템)에는 편의성이 특화돼있지만, 점수 랭킹처럼 실시간으로 추가되는 데이터에는 어울리지 않음을 깨달았다.

그래서 튜터님께 여쭈어보니, 튜터님도 위같은 방식은 맞지 않음을 알려주셨다.

아마 Json을 사용할 것 같다. (드디어 다뤄본다.)

자료구조 및 알고리즘 고민

튜터님의 추천대로 점수에 따른 순위 정렬에 퀵 정렬을 사용하기로 했다.

처음에는 [곡id, 유저이름, 점수]요소를 가진 클래스의 리스트를 점수별로 정렬하려고 했으나, 설계 중에 몇 가지 조건이 붙어버렸다.

  1. 우선 내가 구현하려는 것은 곡 별로 랭킹을 보여주는 것.
  2. 점수가 같으면 유저 이름으로 우선순위를 정해주는 것.

1번 문제를 해결하기 위해서 딕셔너리를 사용하기로 했다.
곡id가 키, 나머지 정보의 클래스를 값으로 한다.

2번 문제는 정렬 알고리즘 내부에 따로 예외를 둘까 한다.

  • 1번에 대한 코드
public class RankingEntry
{
    public RankingEntry(string UserName, int Score)
    {
        this.UserName = UserName;
        this.Score = Score;
    }

    public string   UserName { get; set; }
    public int      Score { get; set; }
}
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RankingManager : MonoBehaviour
{
    public static RankingManager instance;
    
    Dictionary<int, List<RankingEntry>> rankingMap = new Dictionary<int, List<RankingEntry>>();

    private void Awake()
    {
        instance = this; // TODO 싱글톤은 개선 필요
    }

    public void AddRankingEntry(int songId, string userName, int record)
    {
        ,,,생략,,,
    }
    ,,,생략
}
profile
개발은삼순이발

0개의 댓글