본문 바로가기

유니티

[ 유니티 ] 곡 별 점수를 PlayerPrefs에 저장하기

[ 데이터 형식]

[public class MusicScoreData]

곡 별 최근 점수 / 최고 점수를 가지고 있다 . 각 점수는 다시 난이도에 따라 나뉜다 .

public class MusicScoreData
{
    public float recentEasyScore = 0;
    public float recentNormalScore = 0;
    public float recentHardScore = 0;
    public float bestEasyScore = 0;
    public float bestNormalScore = 0;
    public float bestHardScore = 0;
}

 

[public class TotalScoreData]

PlayerPrefs에 저장되는 TotalScoreData는 MusicScoreData를 Dic으로 가지고 있다 .

MusicScoreData는 곡 제목을 키로 가지고 있는다 .

public class TotalScoreData
{
    public Dictionary<string, MusicScoreData> totalScoreDic = new Dictionary<string, MusicScoreData>();
}

[ TotalScoreManager ]

[ public class TotalScoreManager : SingletonMono<TotalScoreManager> ]

곡의 점수를 총괄하는 매니저 . 곡의 저장과 불러옴을 담당한다 . 각 메서드를 아래에서 나눠서 보자 .

 

[ Init 메서드 ]

Param과 Init 메서드를 정의하였다 . PlayerPrefs에서 곡의 데이터를 불러올것이다 .

    //전체 곡 데이터 
    public TotalScoreData totalScoreData;
	
    //초기화 . PlayerPrefs에서 곡 정보를 가져오거나 없다면 새로 세팅할것이다
    protected override void Init()
    {
        GetTotalScoreData();
        base.Init();
    }

[ PlayerPrefs_Method 메서드 ]

PlayerPrefs에서 데이터를 불러오고 저장하는 메서드

    //Get
    public void GetTotalScoreData()
    {
    	//rawData가 없다면 기본값인 "" 으로 잡힐것이다
        string rawData = PlayerPrefs.GetString("TotalScoreData", "");

        if (rawData == "")//데이터가 없다면
        {
            InitTotalScoreData();//데이터 생성
            SetTotalScoreData();//저장
        }
        else
        {
            this.totalScoreData = JsonConvert.DeserializeObject<TotalScoreData>(rawData);
            //빠져 있는 데이터가 있는지 체크한다 (새로 곡 추가시 PlayerPrefs에는 반영 x 이기에)
            CheckScoreDic();
        }
    }
    //Set
    public void SetTotalScoreData()
    {
    	//데이터를 직렬화 하여 저장한다 .
        string jsonData = JsonConvert.SerializeObject(totalScoreData);
        PlayerPrefs.SetString("TotalScoreData", jsonData);
        //PlayerPrefs.Save();
    }

=>PlayerPrefs.Save를 하지 않은 이유는 공식문서에서 인게임중 사용을 피함을 추천하였기 때문이다 .

유니티 도큐먼트 - PlayerPrefs.Save

 

[ TotalScore_Method 메서드 ]

TotalScore의 생성 , 뮤직 리스트와 대조하여 없는 값을 체크하는 메서드

public void InitTotalScoreData()
    {
        this.totalScoreData = new TotalScoreData();

        foreach (var musicData in SoundManager.instance.MusicDataDic.Values.OrderBy(ele => ele.musicIndex))
        {
            MusicScoreData scoreData = new MusicScoreData();
            totalScoreData.totalScoreDic.Add(musicData.musicTitle, scoreData);
        }
    }

=>MusicDataDic의 곡만큼 점수를 새로 세팅한다 . 

void CheckTotalScoreData()
    {
        //곡의 점수는 있지만 MusicDataDic에는 없는 경우(해당 곡이 빠진 경우)를 확인
        List<string> list = totalScoreData.totalScoreDic.Keys.ToList();
        for (int i=list.Count-1;i >=0;i--)
        {
            if (SoundManager.instance.MusicDataDic.ContainsKey(list[i]) == false)
            {
                totalScoreData.totalScoreDic.Remove(list[i]);
                SetTotalScoreData();
            }
        }

        //MusicDataDic에는 있지만 곡의 점수는 없는 경우(새로 곡을 추가한 경우)를 확인
        foreach (var musicData in SoundManager.instance.MusicDataDic.Values.OrderBy(ele => ele.musicIndex))
        {
            //해당 곡이 scoreDic에 없다면 새로 생성하여 넣어주고 저장까지 수행한다 .
            if (totalScoreData.totalScoreDic.ContainsKey(musicData.musicTitle) == false)
            {
                MusicScoreData scoreData = new MusicScoreData();
                totalScoreData.totalScoreDic.Add(musicData.musicTitle, scoreData);
                SetTotalScoreData();
            }
        }
    }

=>곡을 새로 추가했을때 점수 데이터에는 해당 key가 없을수 있기에 먼저 체크를 진행 , 없다면 만들어준다 .

 

[ MusicScore_Method 메서드 ]

각 곡마다의 점수를 관리하는 메서드

    //곡을 완주한후 해당 점수를 레벨에 맞게 저장한다
    public void SetMusicScoreData(string musicTitle, float score, AllEnums.DifficultyLevel level)
    {
        if (totalScoreData.totalScoreDic.ContainsKey(musicTitle))
        {
            SetScoreByDifficulty(level, totalScoreData.totalScoreDic[musicTitle], score);
            SetTotalScoreData();
        }
        else
        {
            Debug.LogWarning("곡 정보가 없다 ");
        }
    }

=>곡의 완주후 데이터를 저장

 public void SetScoreByDifficulty(AllEnums.DifficultyLevel level,MusicScoreData data, float score)
    {
        switch (level)
        {
            case AllEnums.DifficultyLevel.EASY:

                data.recentEasyScore = score;
                if (data.bestEasyScore < data.recentEasyScore)
                    data.bestEasyScore = data.recentEasyScore;
                break;

            case AllEnums.DifficultyLevel.NORMAL:

                data.recentNormalScore = score;
                if (data.bestNormalScore < data.recentNormalScore)
                    data.bestNormalScore = data.recentNormalScore;
                break;

            case AllEnums.DifficultyLevel.HARD:

                data.recentHardScore = score;
                if (data.bestHardScore < data.recentHardScore)
                    data.bestHardScore = data.recentHardScore;
                break;

            default: break;

        }
    }

=>데이터를 레벨에 맞게 저장 (최고점수는 갱신까지 진행)

    public float GetBestScore(string musicTitle, AllEnums.DifficultyLevel level)
    {
        switch (level)
        {
            case AllEnums.DifficultyLevel.EASY:
                return totalScoreData.totalScoreDic[musicTitle].bestEasyScore;

            case AllEnums.DifficultyLevel.NORMAL:
                return totalScoreData.totalScoreDic[musicTitle].bestNormalScore;

            case AllEnums.DifficultyLevel.HARD:
                return totalScoreData.totalScoreDic[musicTitle].bestHardScore;

            default: return 0;

        }
    }

=>난이도와 곡에 맞는 최고 점수를 가져온다

  public float GetRecentScore(string musicTitle, AllEnums.DifficultyLevel level)
    {
        switch (level)
        {
            case AllEnums.DifficultyLevel.EASY:
                return totalScoreData.totalScoreDic[musicTitle].recentEasyScore;

            case AllEnums.DifficultyLevel.NORMAL:
                return totalScoreData.totalScoreDic[musicTitle].recentNormalScore;

            case AllEnums.DifficultyLevel.HARD:
                return totalScoreData.totalScoreDic[musicTitle].recentHardScore;

            default: return 0;

        }
    }

=>난이도와 곡에 맞는 최근 점수를 가져온다