• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

Serializable 사용 이유

21.09.15 00:19 작성 조회수 354

0

다른 강의들에서 보긴 했는데 아직까지 Serializable, Serialzed Field 같은 것의 정확한 용도와 목적을 모르겠습니다

강의에서 강사님께서, 인스펙터에서 해당 필드들을 보기 위함이라고 하셨는데

public으로 해도 인스펙터에 나오지 않나요?

 

그리고, 제가 처음 c#을 배울때, private, public 같은 접근 제한자에 대해서 가진 인상이, public을 써서 보여주는건 안좋은거다 이런거라 아직가지도 변수들을 public으로 정할 때, 좀 어색합니다

혹시 이 부분에 대해서 조언을 해주실 수 있을까요?

답변 1

답변을 작성해보세요.

0

일반적인 클래스의 안에있는 변수에서는 public 으로 하면 그대로 인스펙터가 보입니다.

그런데 구조체 안의 구조체나 구조체 안의 클래스 등과 같은 경우에 인스펙터가 보이지 않습니다. 

이건 직렬화가 가능한지 아닌지에 대한 내용인데 내부적인 구현은 저도 알지 못합니다. 

문법적으로 정수형이나 기본 자료형은 직렬화가 가능하고 구조체 안의 구조체나 구조체 안의 클래스 등의 경우에는 기본값으로 직렬화가 가능하지 않습니다.

우선 직렬화를 말씀드려보면 직렬화라는 것이 데이터를 Serial 하게 만든다라는 뜻이 있습니다.  통신상이나 데이터의 대입시 데이터가 직렬화, 다른 말로 하면 연속적인 형태로 늘어놓는다는 것입니다. 이렇게 해놓고 나서야 통신상에서 한바이트 한바이트가 차례차례보내지는 형태가 될 것입니다. 그래서 지금 상황과는 관계가 없지만 네트워크에 보낼때 데이터를 직렬화를 해서 보내는 의미가 있습니다. 

그래서 유니티에디터에서 직렬화가 필요한 이유는 실제 클래스나 구조체에 있는 데이터를 유니티의 에디터로 보내야합니다.  실제 클래스의 데이터를  유니티에디터로 통신으로 시리얼하게 전송을 하는 이미지를 생각하시면 될 것 같습니다.  (디버그 상태에서 계속 데이터를 보내야 하니까요)

그래서 구조체나 클래스의 선언쪽에서 Serializable 을 사용한다는 것은 자료형을 직렬화하겠다는 뜻입니다. 

그리고 실제 선언을 하는 부분의 변수에서 Serialzed Field 사용합니다. 이 두 동작이 이루어져야 유니티상의 인스펙터에 나타납니다. 

현재 상태에서 변수가 Wave 의 실제 레퍼런스 변수 Serialzed Field 가 되어 있지 않아서 나타나지 않을 것입니다. 변수 선언부에 [Serialzed Field] 넣어줘야 합니다. 

다시 한번 말씀드리면 Wave자체의 구조체에 Serializable 을 적용하고 Wave 의 변수 선언 부분위에 [Serialzed Field] 가 적용되어야 합니다. 현재 이것은 적용되지 않았습니다. 

감사합니다.