[ 데이터 형식]
[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;
}
}
=>난이도와 곡에 맞는 최근 점수를 가져온다
'유니티' 카테고리의 다른 글
[ 유니티 ]Scriptable Object 실행중 저장하기 (1) | 2023.04.07 |
---|---|
[ 유니티 ]SkyBox가 인게임에서 안바뀌는 문제 해결 (0) | 2023.04.05 |
[ 유니티 ] 자식 오브젝트 삭제하기 (0) | 2023.04.04 |
[ 유니티 ] 유니티 2021.3.16f1 설치 오류 (0) | 2023.03.29 |
[ 유니티 ] Action (Delegate)과 event 키워드 (0) | 2023.02.28 |