Menu
CoddyTech

불러오기와 기본값

Coddy Unity 여정의 Unity 게임 아키텍처 섹션에 포함된 레슨. 50개 중 26번째.

불러오기는 저장 파일이 없거나 완전하지 않은 경우에도 처리할 수 있어야 합니다. 레이싱 게임은 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을 불러오고, Space를 누르면 반려동물에게 먹이를 주고 저장합니다. 불러오기는 두 가지 방식으로 잘못됩니다:

  • 새 플레이어에게는 pet.json이 없으므로 Start가 FileNotFoundException과 함께 중단됩니다. 파일이 없으면 Inspector에서 설정한 반려동물(Biscuit, 배고픔 30, 행복도 80, Ball)을 그대로 두고 A new pet: Biscuit을 기록하세요.
  • 게임 버전 1에서는 petName과 hunger만 저장했습니다. happiness와 toys는 버전 2에서 추가되었습니다(PetSave.cs 참조). 이전 저장 파일을 FromJson으로 불러오면 Inspector의 값이 아니라 클래스의 기본값인 50과 장난감 없음이 적용됩니다. 기존 파일을 JsonUtility.FromJsonOverwrite를 사용해 pet에 불러오면 파일에 없는 값은 Inspector의 값을 유지합니다. 그리고 불러온 이름을 사용해 환영 메시지를 기록하세요. 예: Welcome back, Mochi.

플레이를 눌러 반려동물에게 먹이를 준 다음, 중지를 누르고 다시 플레이를 누른 뒤 확인을 누르세요.

직접 해보기

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;
    }
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

Unity 게임 아키텍처의 모든 레슨