Menu
CoddyTech

불러오기와 기본값

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은 클래스의 초기화 값을 다시 적용합니다.

challenge icon

챌린지

중급

새 플레이어와 이전 저장 데이터를 위해 pet.json을 안전하게 불러오세요.

  1. Start()에서 FromJson 줄을 if (File.Exists(path))와 else로 바꾸세요.
  2. 파일이 있으면 Inspector의 pet을 채우세요: JsonUtility.FromJsonOverwrite(File.ReadAllText(path), pet); 그런 다음 pet.petName에서 Welcome back, Mochi를 로그에 출력하세요.
  3. 파일이 없으면 같은 방식으로 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 플레이그라운드