반응형
JsonUtility
- 유니티에서 제공하는 JSON 클래스이다.
- 다른 JSON 라이브러리에 비해 기능이 적지만 성능이 좋다.
- 직렬화된 클래스, 구조체만 지원되고 배열, 리스트, 딕셔너리 등의 자료구조는 클래스로 래핑해야 JSON 변환이 가능하다.
직렬화(Serializable)
- C#은 복합 데이터 형식을 쉽게 스트림에 읽기/쓰기를 할 수 있게 하는 직렬화라는 메커니즘을 제공한다.
- 직렬화는 객체의 상태(필드에 저장된 값들)를 메모리에 저장 장치에 저장이 가능한 0과 1의 순서로 바꾸는것을 말한다.
- 직렬화는 원하는 데이터 위에 [Serializable] 어트리뷰트를 작성해주면 된다.
using System;
using UnityEngine;
public struct SomeStruct
{
[SerializeField]
private int m_iNum;
[SerializeField]
private bool m_bCheck;
public SomeStruct(int i, bool b)
{
m_iNum = i;
m_bCheck = b;
}
}
//ToJson
SomeStruct ss = new SomeStruct(10, false);
string json = JsonUtility.ToJson(ss, true);
//FromJson
SomeStruct ss2 = JsonUtility.FromJson<SomeStruct>(json);
- JSON으로 변환 할 클래스나 구조체를 반드시 직렬화 어트리뷰트를 작성해줄 필요는 없지만, 해당 클래스나 구조체가 다른 클래스의 멤버가 되면 반드시 직렬화 어트리뷰트를 작성해줘야한다.
- 멤버 변수의 접근 지시자를 private로 할 경우 [SerializeField] 어트리뷰트를 붙여줘야 해당 데이터가 JSON으로 변환된다.
- static, readonly, const 키워드가 붙은 멤버 데이터는 JSON으로 변환되지 않는다.
- JSON으로 변환하지 못하게 할 멤버는 [NonSerialized] 어트리뷰트를 붙여준다.
- FromJsonOverwrite(json, object)는 추후 작성할 예정(기능 파악 중..)
※※ 직렬화 클래스(혹은 구조체)에 멤버변수가 추가된 경우, 해당 멤버변수에 대한 에러가 발생하지 않고 기본값으로 초기화된다.
래핑 클래스
- 배열이나 리스트 등의 자료구조는 API에 직접 전달하는 기능은 지원되지 않기 때문에, 클래스나 구조체로 래핑 해서 변환한다.
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public static class JsonWrapper
{
#region ARRAY WRAPPER
[Serializable]
private class ArrayWrapper<T>
{
[SerializeField]
private T[] m_items;
public T[] Items { get { return m_items; } }
public ArrayWrapper(T[] arr)
{
m_items = arr;
}
}
public static string ToJson<T>(T[] array, bool prettyPrint = false)
{
ArrayWrapper<T> wrapper = new ArrayWrapper<T>(array);
//bool : 출력 제어 (로그 출력 시, 보기 좋게 출력하는 기능 지원. default : false)
return JsonUtility.ToJson(wrapper, prettyPrint);
}
public static T[] ArrayFromJson<T>(string json)
{
ArrayWrapper<T> wrapper = JsonUtility.FromJson<ArrayWrapper<T>>(json);
return wrapper.Items;
}
#endregion
#region LIST WRAPPER
[Serializable]
private class ListWrapper<T>
{
[SerializeField]
private List<T> m_list;
public List<T> ToList()
{
return m_list;
}
public ListWrapper(List<T> list)
{
m_list = list;
}
}
public static string ToJson<T>(List<T> list, bool prettyPrint = false)
{
ListWrapper<T> wrapper = new ListWrapper<T>(list);
return JsonUtility.ToJson(wrapper, prettyPrint);
}
public static List<T> ListFromJson<T>(string json)
{
ListWrapper<T> wrapper = JsonUtility.FromJson<ListWrapper<T>>(json);
return wrapper.ToList();
}
#endregion
}
- Dictionary 역시 위와 같은식으로 래핑 클래스를 정의해야한다.
참고
반응형
'Develoment > Unity' 카테고리의 다른 글
[유니티] 이벤트 함수 - 1 (Awake, Start, OnEnable, Update, FixedUpdate, LateUpdate) (0) | 2022.01.31 |
---|---|
[유니티] Generic singleton(제네릭 싱글톤) 클래스 제작 (0) | 2022.01.26 |
[유니티] 타일맵 컴포넌트 배열 가져오기 (0) | 2022.01.10 |
유니티 스크립트 한글 깨짐현상 해결하기 (0) | 2021.11.12 |
[유니티] UGUI 파티클을 사용하면서 배치를 줄여보자. (1) | 2021.07.26 |