오늘 학습 키워드
도전 과제 하기
오늘 학습 한 내용을 나만의 언어로 정리하기
로컬 리더보드 만들기
- 아이디어 : 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는 프로퍼티 아니고 변수를 기준으로 함
내일 학습 할 것은 무엇인지
내일 아침에 문서 작성 끝내버려야지~