1. [SerializeField]
Unity의 Attribute중 하나로 해당 필드를 Inspector창에서 직렬화되도록 지정한다. 그러므로 해당 필드의 값을 인스펙터창에서 수정할 수 있고, 프리팹 또는 씬에 저장될때 유지된다.
[SerializeField]
private int example;
private로 설정되어있지만 inspector창에서 수정하고 싶은 경우 [SerializeField]를 사용하면 된다. private의 특징은 유지된다.
2. 직렬화
객체의 상태를 저장하거나 전송하기 위한 과정
일반적으로 객체의 메모리 상태는 해당 객체가 실행 중인 동안에만 유지된다. 프로그램이 종료되면 객체 상태는 사라지게 된다. 하지만 직렬화를 사용하면 객체는 메모리에서 상태를 보존하지 않고도 파일에 저장하거나 네트워크를 전송할 수 있다.
스크립트의 필드가 직렬화되도록 하는 방법은 public이거나 SerializedField 속성이 있어야 하고static,const,readonly가 아니어야 하고 fieldtype은 직렬화 할 수 있는 타입이어야 한다.
3. [System.Serializable]
Unity의 Attribute중 하나로 이 Attribute를 class나 struct 위에 선언하게 되면 해당 타입이 직렬화 가능한 형태가 된다. 직렬화 가능한 class나 struct로 만들어진 객체는 상태(State)를 저장하고 복원할 수 있다. 이를 이용해서 게임을 종료 한 후에도 이전 상태를 보존할 수 있다.
[System.Serializable]
public struct SaveState
{
public int playerID;
public string playerName;
public PlayerData(int ID, string name)
{
playerID = ID;
playerName = name;
}
}
왜 이렇게 명시적으로 해야할까?
Unity는 자동으로 모든 클래스를 저장하려고하지 않는다. 왜냐하면 성능 이슈도 있고 원하지 않는 데이터까지 저장될 수 있기 때문이다.
정리
Unity 직렬화의 목적에는 2가지 요소가 있다.
1. 에디터에 보여주고 저장하기 위함(Inspector + Scene, Prefab 등) - Unity 내부 저장소에 저장됨
Scene,Prefab,ScriptableObject,Asset파일등은 텍스트 또는 바이너리 포맷으로 프로젝트 안에 저장된다.
저장되는 대상
- [SerializeField]나 public으로 선언된 필드
- [System.Serializable]이 붙은 클래스의 필드
- Unity가 지원하는 타입만 포함
2. 런타임에 데이터를 저장/불러오기 위함(Save/Load/PlayerPrefs,서버 등) - 저장소는 개발자가 정한 곳으로 지됨
런타임에서는 JsonUtility, BinaryFormatter, PlayerPrefs, 파일 저장 등을 통해 직렬화된 데이터를 직접 파일이나 문자열로 저장한다.
- 저장 위치는 Application.persistentDataPath 같은 경로 (운영체제별로 다름) 또는 서버, 클라우드, DB 등 외부 저장소
'유니티 공부 > Unity' 카테고리의 다른 글
Unity - 'TMPro.TMP_Text'에서 'string'(으)로 변환할 수 없습니다 오류 (0) | 2023.06.16 |
---|---|
Unity - 텍스트에 타이핑 효과(typingEffect) 적용하는 방법 (1) | 2023.06.16 |
Unity - RectTransform, anchoredPosition (0) | 2023.06.13 |
Unity - LayoutUtility.GetPreferredHeight (0) | 2023.06.13 |
Unity - scrollRect.normalizedPosition 사용해서 맨 위로 스크롤 하기 (0) | 2023.06.13 |
댓글