낑깡의 게임 프로그래밍 도전기

Unity C# [System.Serializable] 본문

카테고리 없음

Unity C# [System.Serializable]

낑깡겜플밍 2023. 10. 27. 21:43
반응형
SMALL

[System.Serializable]은 C#에서 클래스를 직렬화(Serialization)할 수 있도록 해주는 속성(Attribute) 입니다.
**직렬화(Serialization)**란 데이터를 저장하거나 네트워크로 전송할 수 있도록 바이트 형태로 변환하는 과정을 의미합니다.


1. 직렬화가 필요한 이유

  • 유니티에서 인스펙터(Inspector)에 표시할 수 있도록 하기 위해
  • 파일(JSON, XML 등)로 저장하거나 불러오기 위해
  • 네트워크로 데이터를 주고받을 때 활용하기 위해

 

2. 사용 예시

using UnityEngine;

[System.Serializable] 
public class Item
{
    public string itemName;
    public int price;
}

이 클래스는 무엇을 하는가?

  • Item 클래스를 직렬화 가능하게 만들어 유니티 인스펙터에서 볼 수 있도록 합니다.
  • 이 클래스의 데이터를 JSON이나 파일로 쉽게 저장하고 불러올 수 있습니다.

 

3. 유니티 인스펙터에서 사용 예시

using UnityEngine;

public class Inventory : MonoBehaviour
{
    public Item[] items; // 인스펙터에서 편집 가능
}
  • Item 클래스에 [System.Serializable]을 추가했기 때문에,
    Inventory 클래스의 items 배열이 유니티 인스펙터에서 보이고 수정 가능합니다.

 

4. JSON 직렬화 사용 예시

using UnityEngine;

public class SaveLoadExample : MonoBehaviour
{
    public Item item = new Item { itemName = "포션", price = 50 };

    private void Start()
    {
        string json = JsonUtility.ToJson(item); // JSON으로 변환
        Debug.Log("저장된 JSON 데이터: " + json);
    }
}

실행 결과

저장된 JSON 데이터: {"itemName":"포션","price":50}
  • JsonUtility.ToJson(item)을 사용하면 Item 객체를 JSON 문자열로 변환할 수 있습니다.

 

5. [System.Serializable]을 안 쓰면?

public class Item
{
    public string itemName;
    public int price;
}
  • 유니티 인스펙터에서 보이지 않습니다.
  • JSON 변환이 불가능합니다. (JsonUtility.ToJson() 사용 시 에러 발생)

 

6. [System.Serializable] 정리

특징 설명
목적 객체를 JSON, 파일 저장, 네트워크 전송 등에 사용할 수 있도록 변환
유니티 활용 인스펙터에서 클래스 필드 표시 가능
필수 조건 class가 public이어야 하며, 내부 필드도 public이거나 [SerializeField]이어야 보임
제한 사항 MonoBehaviour에는 사용할 수 없음

 

7. [System.Serializable] vs [SerializeField] 차이점

속성 메일
[System.Serializable] 클래스 전체를 직렬화 가능하도록 설정
[SerializeField] **개별 필드(변수)**를 직렬화 가능하도록 설정 (private 변수도 인스펙터에서 보이게 함)

 

예제

[System.Serializable]
public class Item
{
    [SerializeField] private string itemName;
    [SerializeField] private int price;
}
  • Item 클래스는 직렬화 가능
  • itemName, price는 private이지만 인스펙터에서 보이도록 설정

요약

  • [System.Serializable]은 클래스를 직렬화 가능하도록 설정.
  • 유니티 인스펙터에서 클래스 필드를 편집할 수 있도록 함.
  • JSON 변환 및 데이터 저장, 네트워크 전송 등에 필수.
  • MonoBehaviour에는 사용할 수 없음.
  • 개별 필드는 [SerializeField]로 설정 가능.
반응형
LIST