프로그래밍/Unity 2016. 7. 20. 14:48

필자가 JSON을 알게 된 것은 nodejs+mongodb를 연환한 서버를 구축할 때 였다.

이 당시에는 JSON의 개념조차 잡혀있지 않았고 JSON이 파일까지 만들어주는 줄 알았다.

(JSON은 파싱 즉 값을 string으로 변환만 해준다.)

결국엔 실패했다.


각설하고 이번 게임 제작할때 SAVE / LOAD를 구현하려고 다시 자료를 찾던중 playerprefabs와 json을 활용한 자료 저장 xml이 있었다. 그중 필자는 저번의 실패를 만회하기 위해 json을 다시 도전했고 자료를 찾던중 유니티 5.3이상부터 지원되는 JsonUtility 기능에 대해서 알게되었다.


https://docs.unity3d.com/ScriptReference/JsonUtility.html    <= 유니티 공식홈페이지

   JsonUtility 레퍼런스


영어로 되어있다.


해석하자면


FromJson

Create an object from its JSON representation.
JSON 형식으로부터 오브젝트를 생성한다.

FromJsonOverwrite

Overwrite data in an object by reading from its JSON representation.
JSON 형식의 데이터를 받아와 오브젝트에 오버라이팅을 한다.

ToJson

Generate a JSON representation of the public fields of an object.
public 형식으로 선언된 오브젝트를 JSON형식으로 저장한다.

여기서 오브젝트란 클래스 / 구조체 / 값 전부 된다.


이제 사용 방법을 보겠다. 

우선 필자는 클래스를 오브젝트로 잡았다.


[SerializeField]

    public class Data

    {

        public string charname;

        public string birthday;

        public int stress;

        public int stamina;

        public int year;

        public int month;

        public int money;

        public bool istired;

        public bool isseek;

    }


아 그리고 모든 오브젝트는 public 과 [SerializeField]로 선언되어야 한다. (이유는 잘 모르겠으나 레퍼런스를 읽어보니 JsonUtility에서 읽고 쓰는 오브젝트들은 SerializeField / public으로 선언되어있어야 사용가능하다고 나옴)


아무튼 필자는 세이브 버튼을 누르면 함수가 호출되도록 설계했다.

 public void Button_save()

    {

        var saveData = new Data();

        saveData.charname = m_charactorname;

        saveData.birthday = m_birthday;

        saveData.stress = m_stress;

        saveData.stamina = m_stamina;

        saveData.year = m_year;

        saveData.month = m_month;

        saveData.money = m_money;

        saveData.istired = m_istired;

        saveData.isseek = m_isseek;

        string save = JsonUtility.ToJson(saveData, prettyPrint: true);

  Debug.Log(save);


        pathForDocumentsFile("save.txt");       //파일 입출력 용 함수

        writeStringToFile(save1, "save.txt");      //파일 입출력 용 함수

    }

이런 식으로 만들었다.

우선적으로 클래스를 saveData로 동적생성 해주고 각각의 값을 저장했다.

그 후 string save = JsonUtility.ToJson(saveData, prettyPrint: true); 이렇게 적었다.

JsonUtility 레퍼런스에서 JsonUtility.ToJson의 반환 값이 string이므로 string 변수를 생성 후 그 곳에 저장한다. 그리고 Debug.Log()를 해보면 Json형식으로 바뀐 값을 볼 수있다.

여기서 그만두면 string에만 저장되있고 파일로는 저장이 안된다. 따라서 이제 string을 파일입출력을 통해 txt파일로 저장하면된다!


이제 저장을 했으니 불러오기를 할 차례이다.

이거 또한 Load 버튼을 누르면 함수가 호출되도록 설계했다.

 public void Button_load()

    {

        pathForDocumentsFile("save.txt");                        //파일 입출력 용 함수

        string load = readStringFromFile("save.txt");           //파일 입출력 용 함수

        var loadData = JsonUtility.FromJson<Data>(load);

        m_charactorname = loadData.charname;

        m_birthday = loadData.birthday;

        m_stress = loadData.stress;

        m_stamina = loadData.stamina;

        m_year = loadData.year;

        m_month = loadData.month;

        m_money = loadData.money;

        m_istired = loadData.istired;

        m_isseek = loadData.isseek;

    }


세이브와는 정 반대이다.   var loadData = JsonUtility.FromJson<Data>(load); 

Data클래스의 형식으로 Json으로 되어있는 파일을 바꿔준다.


JsonUtility.FromJson<T>(string );

레퍼런스에서는 이러한 구조로 되어있다. 따라서 T 부분에 자기가 원하는 저장시 데이터 상태를 넣어주고 string 부분에 Json형식이 저장되 있는 것을 넣어주면된다.

'프로그래밍 > Unity' 카테고리의 다른 글

유니티 VideoPlayer.  (0) 2017.08.03
오브젝트 풀  (0) 2016.07.15
LitJSON 파일 있는지 없는지 확인 함수  (0) 2016.07.10
posted by 천마서생
: