본문 바로가기
유니티 최고/유니티 개념

유니티(Unity) 인스펙터창 관리 / [HideInInspector] ? , [SerializeField] ?

by Lee_story_.. 2023. 6. 8.
728x90

라이브러리 파일들을 보고 있으면

SerializeField .... HideInInspector 등의 키워드가 많이 보입니다.

 

 

이번엔 이것들이 무엇이고 다른 것들은 어떻게 사용되는지에 대해 정리해 보겠습니다. 

 

 

먼저 위의 것들을 인스펙터 속성 이라고 합니다. 

 

Inspector Attribute?


이것에 앞서 인스펙터란?

유니티를 실행해서 아무 오브젝트를 클릭하게되면 아래처럼 뜨게 되는데 

이것이 인스펙터, 즉 속성창 입니다!

 

인스펙터를 이용해서 오브젝트의 상태, 위치, 컴포넌트 제거/추가/수정 할 수있으며

스크립의 내부 변수를 설정 할 수도 있습니다.

 

 

 

HideInInspector, SerializeField  등등 여러 인스펙터 어트리뷰트들은

 

스크립 컴포넌트의 변수들을 어떤식으로 표현할까, 입력 받을까에 대해

설정 할 수 있도록 도와주는 키워드들입니다. 

 

 

그럼 이제 종류에 대해 알아보고 사용해 봅시다.

 

차례대로 위에서부터 보도록 하겠습니다. 

 

 

 

[Header]

먼저 헤더 입니다.  변수들의 구분이 필요할때 사용되는 키워드로 약간 큰 글씨로 강조느낌을 줍니다. 

[Header ("헤더")]
public string Header_1;
public string Header_2;

 

 

[Ragnge]

다음은 슬라이더를 위한 Range 키워드입니다. 아래처럼 선언 후 숫자형 변수를 넣어주면 끝!

최댓값과 최솟값을 선언해줄 수 있습니다.

[Range(0f, 1f)]
public float mySlider_Range;

 

 

만약 string 형을 선언한다면 아래처럼 오류가 발생합니다!

 

 

 

[Space]

다음은 공간의 여백을 위한 space 키워드로 아래처럼 단일로 사용됩니다. 

[Space(100)]

 

 

 

 

[Multiline]

다음은 multiline 키워드, 말그대로 여러줄을 입력할 수 있는 텍스트창을 제공해줍니다 .

    [Multiline(10)]
    public string Multiline_ins;

 

[TextArea ]

비슷한 기능으로 TextArea 키워드가 있습니다. 

    [TextArea]
    public string TextArea_ins1;

가로가 차이 나는것 말고는 동일한것 같습니다.

마찬가지로 string형 char 형 변수를 선언하지 않으면 오류가 발생합니다. 

 

 

 

 

[Tooltip]

다음은 툴팁 입니다.

    [Tooltip("This is my tooltip")] // 툴팁
    public string myString;

변수의 이름에 마우스를 가져다 놓으면 간단한 툴팁이 나오게 됩니다

 

 

여기까지 코드   ------------------

    [Header ("헤더")]
    public string Header_1;
    public string Header_2;



    [Range(0f, 1f)]
    public int mySlider_Range;



    [Space(100)]
    public string space_100="스페이스 후";



    [Multiline(10)]
    public string Multiline_ins;

    [TextArea]
    public string TextArea_ins1;

    [TextArea(1,10)]
    public string TextArea_ins2;
    
    [Tooltip("This is my tooltip")] // 툴팁
    public string myString;

 

여기까지가 일반적인 인스펙터 키워드들이 였고, 변수의 종류에 따라 달라지는 부분도 존재합니다

 

 

 

 

 

변수를 게임 오브젝트로 선언하면 아래처럼 참조할 수 있도록 생성되고 

 

 

enum으로 변수형을 선언해주면 Team처럼 콤보박스로 표현해 줍니다.

public enum Team
{
    Blue,
    Red
}
public Team team;

 

 

배열 선언시에도 갯수만큼 참조할수 있게끔 변형되어 표현됩니다. 

 public GameObject[] Array = new GameObject[10];

 

 

 

 

 

이제 남은 부분은 SerializeField    \  HideInInspector

 

여기서부터는 단순 UI부분이 아닌 약간의 개념으로 시작됩니다 

 

 

SerializeField .... HideInInspector


단순 코드만 사용해본다면

아래처럼 된 코드로 이해 할 수 있습니다. 

public GameObject public_inspector;
private GameObject private_inspector;


[HideInInspector]
public GameObject HideInInspector_public_inspector;


[SerializeField]
private GameObject SerializeField_private_inspector;

 

먼저 Public으로 선언을 하게되면 그 변수에 대해 참조 하는 모든 스크립트에서

공동으로 사용하겠다는 것으로  인스펙터창에서도 조정이 가능하도록 표현됩니다. 

 

반대로 private로 선언을 하게되면

다른 스크립에서도, 인스펙터창에서도 수정할 수 없는 상태로 선언되기에  인스펙터 ui에 뜨지 않습니다. 

 

 

 

하지만 이부분에서 [SerializeField] 를 사용하게 되면 private 변수도 인스펙터창에서 수정가능하게 바꿀 수 있습니다.

반대로 [HideInInspector]을 이용하면 public 변수를 인스펙터창에서 숨길 수 있게 해줍니다. 

 

 

 

그럼 위의 코드를 통해 아래처럼만 표시되는것을 볼 수 있습니다. 

 

 

 

 

그렇다면 [SerializeField]을 이용해서 다른 스크립에서 private변수를 불러올 수 있나? 

     >>> 아닙니다.

 

 

마찬가지로  [HideInInspector] 을 사용한다고 해서 다른 스크립에서 사용하지 못하게 되는것은 아닙니다. 

인스펙터창에서의 숨김 유무를결정한다고 보면 될 것 같습니다.

 

 

단지 그런 역할만 하나?

     >>> 아닙니다.

 

++중요

여기서 하나 더 추가 [SerializeField] 의 경우 사용하므로써 변수에 대해 직렬화 되게끔하는 역할도 수행합니다. 

 

유니티에서 직렬화란 추상적인 데이터를 전송,저장 가능한 형태로 바꾸는 것을 의미합니다. 

public 변수의 경우는 직렬화가 되어있는 상태이지만 private의 경우는 직렬화 되어 있지 않기에 

 

[SerializeField] 를 직렬화를 위해서만 사용하기도 합니다. 

네트워크를 통해 데이터를 전달해야 하는 상황이라면 무조건 직렬화가 되어 있어야 합니다!

 

 

 

 

직렬화에 대해서 다음에 더 자세히 알아보도록 하겠습니다.

 

 

 

이번글은 여기서 끝!

 

 

 

 

 

틀린점이 있다면 댓 달아주세요!

댓글