오늘 학습 키워드

도전 과제 하기

오늘 학습 한 내용을 나만의 언어로 정리하기

로컬 리더보드 만들기

  • 아이디어 : DateTime, int 형태의 List를 만들어서 JSON 직렬/역직렬화 하기.
[Serializable]
public struct GameData
{
    public DateTime Date { get; set; }
    public int Score { get; set; }
}
public void LeaderBoardUpdate(SceneNumber sceneNumber, int score)
{
 
}
 
public void SaveLeaderBoard(string sceneName)
{
 
}
 
public List<GameData> LoadLeaderBoard(string sceneName)
{
 
}
  • 어떤 정보 에 의하면, Resources.Load()이 성능 이슈가 있다고 함. 그래서 나도 FIleStream으로 써보려고 함
// GlobalManager.cs
public void LeaderBoardUpdate(string sceneName, int score)
{
    GameDatas gameDatas = LoadLeaderBoard(sceneName);
    GameData newData = new GameData(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), score);
    if (gameDatas == null) gameDatas = new();
 
    Debug.Log($"{newData.ToString()}");
 
    gameDatas.dataList.Add(newData);
    SaveLeaderBoard(sceneName, gameDatas);
    Debug.Log($"{sceneName} 게임 리더보드 {score} | {newData.date} 추가 됨. ");
}
 
public void SaveLeaderBoard(string sceneName, GameDatas gameDatas)
{
    string path = Application.persistentDataPath + $"/{sceneName}.json";
 
    StreamWriter sw = new(path, false);
    sw.Write(JsonUtility.ToJson(gameDatas));
    sw.Close();
    
}
 
public GameDatas LoadLeaderBoard(string sceneName)
{
    string path = Application.persistentDataPath + $"/{sceneName}.json";
    Debug.Log(path);
    FileStream fs = new(path, FileMode.OpenOrCreate);
    StreamReader sr = new StreamReader(fs);
 
    string data = sr.ReadToEnd();
    GameDatas gameDatas = JsonUtility.FromJson<GameDatas>(data);
    fs.Close();
    return gameDatas;
}
// LeaderBoard.cs
public class LeaderBoard : MonoBehaviour
{
    public Transform contents;
    public GameObject dataPrefab;
    public TextMeshProUGUI titleText;
    public GameObject noDataText;
 
    private List<GameObject> gameObjects = new();
 
    public void AddDatas(Global.GameDatas gameDatas)
    {
        if (gameDatas == null || gameDatas.dataList == null)
        {
            noDataText.SetActive(true);
            return;
        }
        foreach (var data in gameDatas.dataList)
        {
            noDataText.SetActive(false);
            GameObject go = Instantiate(dataPrefab, contents);
            LeaderBoardData leaderBoardData = go.GetComponent<LeaderBoardData>();
            leaderBoardData.SetText(data);
            gameObjects.Add(go);
        }
    }
 
    public void SetTitle(string gameName)
    {
        titleText.text = gameName;
    }
 
    public void OnClickExit()
    {
        if(gameObjects.Count > 0)
        {
            foreach(var data in gameObjects)
            {
                Destroy(data);
            }
        }
        gameObject.SetActive(false);
    }
}
// LeaderBoardData.cs
public class LeaderBoardData : MonoBehaviour
{
    public TextMeshProUGUI scoreText;
    public TextMeshProUGUI timeText;
 
    public void SetText(Global.GameData data)
    {
        scoreText.text = data.score.ToString() + "점";
        timeText.text = data.date;
    }
}

커스텀 캐릭터 / 탈것도 완료!

학습하며 겪었던 문제점 & 에러

문제 1

  • 문제&에러에 대한 정의

C#에서 했던것처럼 직렬화/역직렬화를 위해 퍼블릭 프로퍼티로 설정했었음

  • 내가 한 시도

Serializable도 넣고 SerializeField도 넣고 해봤음. 근데 안됐음.

  • 해결 방법

그러다 마지막에 혹시 JsonUtiilty의 직렬화 정책이 프로퍼티 기준이 아니고 일반 변수 기준인가 싶었음 그래서 일반 변수로 만들었더니 됐음

  • 새롭게 알게 된 점

JsonUtility는 프로퍼티 아니고 변수를 기준으로 함

내일 학습 할 것은 무엇인지

내일 아침에 문서 작성 끝내버려야지~