Unity | 유니티/Unity 개발 일지

[Unity] 스크립트 직렬화( SerializeField / Serializable )

maintain_H 2023. 3. 24. 19:16
반응형

 [SerializeField] 를 지금까지 사용했지만, 별다른 의미 없이 "private"로 선언한 변수를

인스펙터에서 볼 수 있게 해주는 기능으로만 알고 있었다.

그러다가 문득 궁금해져서 유니티 레퍼런스를 찾아보고,

정리할 겸 직렬화에 대해 작성한다.

 

[스크립트 직렬화 Script serialization]

 

 유니티에서 직렬화는 유니티 레퍼런스에 이렇게 설명되어 있다.

 직렬화는 데이터 구조 또는 게임 오브젝트 상태를 Unity가 보관하고 나중에 다시 복구할 수 있는 포맷으로 변환하는 자동 프로세스입니다.

 즉, 객체에 저장된 데이터를 전송을 위해 일련의 바이트 형태로 변형하는 작업이다.

직렬화란 유니티에만 있는 개념이 아닌 다른 프로그래밍 언어에서도 사용되는 개념이다.

유니티에서는 "private"을 통해 정보를 보호하고, 에디터의 인스펙터에서 값을 변경할 수 있도록 해주는 기능이다.

이게 진짜 은근 꿀인 기능이라고 생각한다.

 

"public"을 남발하다 보면 협업 또는 혼자 개발할 때 본인도 모르게 값이 변경되는 일이 있는데(내가 그런 거 아님) 

직렬화를 잘 활용하면 인스펙터에서 값을 보고 수정할 수 있다.

 

 

[SerializeFiled]

 

이제 유니티에서 직렬화를 사용하는 방법을 보자!

매우매우매우매우 간단하다.

 

private로 선언된 변수

먼저 이렇게 "private"로 변수를 선언하면 인스펙터에서는 아무것도 보이지 않는다.

 

[SerializeField] 사용

이렇게 [SerializeField]를 "private" 앞에 적어주기만 하면!

이렇게 보호된 변수도 인스펙터에서 확인할 수 있다.

나는 이 기능은 "private"로 보호된 변수를 변경할 때만 사용하는 게 아니라 

플레이 상태에서 변수가 변하는 것을 확인할 때 주로 사용하는데, 꽤 많이 편하고 좋다

 

 

 

[Serializable]

 

유니티 에디터에서는 사용자가 정의한 클래스나 구조체가 인스펙터에 나타나지 않는데,

[Serializable]를 사용하면 클래스 또는 구조체를 인스펙터에서 볼 수 있다.

 

public class Test : MonoBehaviour
{
    public PlayerInfo playerInfo;
    public Get get;
}

[Serializable]
public class PlayerInfo
{
    public int gold;
    public int hp;
}

[Serializable]
public class Get
{
    public int hp = 10;
    public int gold;
}

[Serializabe] 사용

이렇게 클래스 앞에 [Serializable]를 써주고, Test class 안에 선언해주면

인스펙터에 짠 하고 나온다!

 

 

[예시]

public class Test : MonoBehaviour
{
    public PlayerInfo playerInfo;
    public Get get;

    private void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            playerInfo.hp += get.hp;
            playerInfo.gold += get.gold;
        }
    }
}

[Serializable]
public class PlayerInfo
{
    public int gold;
    public int hp;
}

[Serializable]
public class Get
{
    public int hp = 10;
    public int gold;
}

 

이렇게 업데이트에 마우스 좌클릭을 하면 playerInfo의 값이 변하도록 해봤다.

 

이렇게 클릭할 때마다 값이 변하는 것을 볼 수 있고,

Get의 값을 플레이 중에 실시간으로 변경할 수 있다!

 

 

반응형