불러오기와 기본값
Coddy Unity 여정의 Unity 게임 아키텍처 섹션에 포함된 레슨. 64개 중 32번째.
로드 과정에서는 저장 파일이 없거나 완전하지 않은 경우를 처리해야 합니다. 레이싱 게임은 RaceSave를 저장하며, 게임 버전 2에서는 musicVolume이 추가되었습니다.
[System.Serializable]
public class RaceSave
{
public int trophies;
public string car = "Rookie Kart";
public float musicVolume = 0.8f;
}RaceSave save;
if (File.Exists(path))
{
save = JsonUtility.FromJson<RaceSave>(File.ReadAllText(path));
}
else
{
save = new RaceSave();
}새 플레이어에게는 파일이 없으며, 존재하지 않는 파일에 File.ReadAllText를 사용하면 FileNotFoundException이 발생하므로 먼저 File.Exists를 확인하고 new RaceSave()에서 시작하세요. 필드 초기화 값은 트로피 0개, Rookie Kart, 음량 0.8입니다. 이전 플레이어의 버전 1 파일에는 {"trophies":3,"car":"Red Racer"}가 들어 있습니다. FromJson은 새 RaceSave를 만들면서 필드 초기화를 실행한 다음 JSON에 있는 키만 설정하므로, musicVolume은 0.8입니다. 클래스에 해당 필드가 없는 키는 무시됩니다. 따라서 새 필드마다 적절한 값으로 초기화한다면 새 버전의 게임에서도 이전 저장 파일을 읽을 수 있습니다.
JsonUtility.FromJsonOverwrite(json, obj)는 객체를 새로 만드는 대신 이미 존재하는 객체를 채우며, JSON에 없는 필드는 기존 값을 그대로 둡니다. FromJson은 MonoBehaviour나 ScriptableObject를 만들 수 없습니다(Unity에서 Cannot deserialize JSON to new instances of type 'RaceSettings.' 오류가 발생합니다). 따라서 설정 에셋은 덮어쓰기로 불러옵니다. JsonUtility.FromJsonOverwrite(json, settings);. 덮어쓰기를 사용하면 Inspector에서 설정한 값처럼 객체가 이미 가지고 있던 값도 유지됩니다. 반면 FromJson은 클래스의 초기화 값을 다시 적용합니다.
챌린지
중급새 플레이어와 이전 저장 데이터를 위해 pet.json을 안전하게 불러오세요.
Start()에서 FromJson 줄을if (File.Exists(path))와else로 바꾸세요.- 파일이 있으면 Inspector의 pet을 채우세요:
JsonUtility.FromJsonOverwrite(File.ReadAllText(path), pet);그런 다음pet.petName에서Welcome back, Mochi를 로그에 출력하세요. - 파일이 없으면 같은 방식으로
A new pet: Biscuit를 로그에 출력하세요.
‘플레이’를 누르고 반려동물에게 먹이를 준 다음, ‘정지’를 누르고 ‘플레이’를 누르세요. 환영 메시지가 표시됩니다. 그런 다음 ‘확인’을 누르세요.
직접 해보기
using System.IO;
using UnityEngine;
using UnityEngine.InputSystem;
using TMPro;
public class PetCare : MonoBehaviour
{
public PetSave pet;
public TMP_Text petText;
private string path;
void Start()
{
path = Path.Combine(Application.persistentDataPath, "pet.json");
pet = JsonUtility.FromJson<PetSave>(File.ReadAllText(path));
Show();
}
void Update()
{
if (Keyboard.current.spaceKey.wasPressedThisFrame)
{
pet.hunger = Mathf.Max(pet.hunger - 10, 0);
pet.happiness = Mathf.Min(pet.happiness + 5, 100);
File.WriteAllText(path, JsonUtility.ToJson(pet));
Show();
}
}
void Show()
{
petText.text = pet.petName + ": hunger " + pet.hunger + ", happiness " + pet.happiness;
}
}
Unity 게임 아키텍처의 모든 레슨
직접 연습해 보세요: Unity 플레이그라운드