본문 바로가기
유니티/커스텀 에디터

[유니티] 자주 사용하는 애트리뷰트(Attribute) 정리

by 칼루트 2020. 11. 12.

[유니티] 자주 사용하는 애트리뷰트(Attribute) 정리

 

유니티를 이용하다 보면 에디터를 커스텀 하고 싶을때가 있습니다.

하지만 에디터 코드를 작성하는건 쉽지가 않죠

그럴때 유니티에서 제공하는 Attribute를 이용하면 에디터를 커스텀하는데 있어 편하게 할 수 있습니다.

그 중에 자주 이용되는 Attribute를 정리해보았습니다.

 

요약 정리

애트리뷰트 설명
SerializeField private, protected 변수를 인스펙터에 표시
Serializable 커스텀 클래스를 인스펙터에 표시
Header 변수위에 타이틀을 설정해 카테고리 분류 가능, 인스펙터 외관 정리에 사용
HideInInspector public 변수를 인스펙터에서 숨길수 있음
RequireComponent 필수 컴포넌트를 추가 할 수 있음
Range int, float 변수를 슬라이드바로 표시하고 범위를 제한함
Space 변수와 변수 사이에 간격 주기
CreateAssetMenu ScriptableObject Asset을 생성할때 사용하는 메뉴를 추가 할 때 사용
MenuItem 임의의 함수 ( static ) 실행을 메뉴 항목으로 추가
ContextMenu 임의의 함수 ( non-static ) 실행을 컴포넌트 톱니 메뉴에 추가
AddComponentMenu 인스펙터의 AddComponent 메뉴 항목으로 컴포넌트를 추가 할때 사용
ExecuteInEditMode 에디터가 플레이 모드가 아니더라도 컴포넌트가 동작하도록 할때 사용
Multiline string 변수를 여러줄 입력 가능하게 만들때 사용
TextArea Multiline과 비슷, 폭에 맞춰 자동으로 줄바꿈과 슬라이드바 표시
Tooltip 인스펙터에 표시되는 변수에 설명을 추가 할때 사용

 


상세 설명

 

SerializeField

인스펙터에 비공개 ( privat, protected ) 변수를 노출시키는데 사용됨

적용시 표시됨

public class AttributeExample : MonoBehaviour
{

    [SerializeField]
    private int TestA;
    [SerializeField]
    protected float TestB;
    
}

Serializable

커스텀 클래스,구조체를 인스펙터에 표시하고 편집 가능하도록 만듬 ( 직렬화 되어야 표시되고 편집이 가능해짐 )

public class AttributeExample : MonoBehaviour
{
    public TestClassA ClassA;
}


// 커스텀 클래스
[Serializable]
public class TestClassA
{
    public int A;
    public float B;
    public string C;
}

Header

인스펙터의 외관을 정리하는데 사용

인스펙터 변수위에 타이틀을 설정 할 수 있고 인스펙터에 타이틀을 설정해 변수들을 정리 할 수 있음

 

티가 잘 안나서 붉은색 박스로 표시했다.

public class AttributeExample : MonoBehaviour
{
	[Header("Field")]
	[SerializeField]
	private int TestA;
	[SerializeField]
	protected float TestB;

	[Header("Class")]
	public TestClassA ClassA;
	public TestClassA ClassB;
    
}

HideInInspector

public 변수를 인스펙터에 표시되지 않도록 숨김

인스펙터에 표시되는 변수를 더이상 표시되지 않도록 지정하는데 사용됨

public class AttributeExample : MonoBehaviour
{
	[HideInInspector]
	public string HideA;
    
}

RequireComponent

클래스위에 사용되는 Attribute로 지정한 컴포넌트와 종속 관계를 만들어 이 Attribute를 사용한 클래스를 추가 할때 자동으로 지정한 컴포넌트가 추가되도록함

특정 컴포넌트가 꼭 필요한 스크립트를 작성할때 사용

컴포넌트를 게임오브젝트에 추가 할때 같이 추가되도록 설정 할 수 있음

컴포넌트 추가시
필수 컴포넌트를 제거시 발생하는 경고박스

필수 설정한 컴포넌트를 Attribute 적용된 컴포넌트가 남아 있는 상태에서 제거하려고 하면 위와 같은 메세지가 뜬다.

[RequireComponent(typeof(Rigidbody))]
public class RequireExample : MonoBehaviour
{
}

Range

int, float 등의 타입 변수에 사용되고 변수의 범위를 제한하고 인스펙터에 슬라이드 바로 표시되도록함

전                                                                                                       후

public class AttributeExample : MonoBehaviour
{
	[Range(0, 10)]
	public int RangeA;
	[Range(-20.0f, 10.0f)]
	public float RangeB;
    
}

Space

인스펙터에 표시되는 변수들 사이에 간격을 설정할때 사용됨

수치가 작으면 티가 잘 안나는거 같아 극단적으로 표현해봤다

public class AttributeExample : MonoBehaviour
{
	[SerializeField]
	private int TestA;
	[SerializeField]
	protected float TestB;

	[Space(100)]

	public TestClassA ClassA;
	public TestClassA ClassB;

	[Space(300)]

	[Range(0, 10)]
	public int RangeA;
	[Range(-20.0f, 10.0f)]
	public float RangeB;
    
}

CreateAssetMenu

ScriptableObject에서 파생된 유형의 asset 파일을 만드는 메뉴를 추가 할때 사용함

메뉴는 에디터 상단의 Assets라는 메뉴의 Create 항목 안 부분을말함

이 항목은 아래의 항목과 같은 항목

생성된 SO 파일

[CreateAssetMenu(fileName ="Example", menuName ="Tools/Example")]
public class CreateAssetMenuExample : ScriptableObject
{
    public int AA;

    public string BB;
}

MenuItem

메뉴바를 추가하는 기능으로 static 함수를 메뉴바에 추가 시켜 실행 시키도록 할 수 있음

 

public class AttributeExample : MonoBehaviour
{
	[MenuItem("MyMenu/Test")]
	static void MenuTest()
	{
		Debug.Log("Test!!!");
	}
    
}

ContextMenu

컴포넌트 이름 부분을 오른쪽 마우스 클릭하거나 톱니모양(점3개) 버튼을 클릭해 나오는 목록에 함수를 실행 시키는 메뉴를 추가 할 수 있음

함수는 static 함수가 아니여도됨

빨간색이 추가한 메뉴, 노란색은 컴포넌트 이름부분 여기를 마우스 오른쪽 버튼을 누르면 나오는 메뉴가 컨텍스트 메뉴다, 아니면 맨 오른쪽에 보이는 점3개 아이콘(혹은 톱니)를 눌러도 나온다

public class AttributeExample : MonoBehaviour
{
	[ContextMenu("Context Test")]
	void ContextMenuTest()
	{
		Debug.Log("Context Test!!!");
	}
    
}

AddComponentMenu

인스펙터 창의 AddComponent 메뉴에 이 컴포넌트를 메뉴항목으로 추가 할때 사용

메뉴항목을 추가할때 자기가 원하는 카테고리로 분류해 항목을 추가 할 수 있다.

 

[AddComponentMenu("MyComponent/AttributeExample")]
public class AttributeExample : MonoBehaviour
{
}

ExecuteInEditMode

지정된 컴포넌트는 EditMode에서도 동작 되도록 할때 사용

에디터에서 플레이 시키지 않아도 지정된 컴포넌트의 주요 함수가 호출됨

Awake나 Start 함수는 컴포넌트가 부착될때, Update 함수는 컴포넌트가 부착된 게임 오브젝트에 변화가 생길때 호출되는 모습

[ExecuteInEditMode]
public class EditModeExample : MonoBehaviour
{

    void Awake()
    {
        Debug.Log("Awake");
    }

    void Start()
    {
        Debug.Log("Start");
    }

    void Update()
    {
        Debug.Log("Update");
    }
}

Mutiline

string 타입의 변수에 사용됨

기본적으로 TextField는 한줄짜리로 인스펙터에 표시되지만 이 Attribute를 사용하면 여러줄의 텍스트 박스로 표시합니다.

public class AttributeExample : MonoBehaviour
{
	public string NoMultilineText;
	[Multiline(5)]
	public string MultilineText;
    
}

TextArea

string 타입의 변수에 사용됨

Multiline과 크게 다르지 않지만 폭에 맞추어 자동으로 줄바꿈이 되고 스크롤바를 표시합니다.

멀티라인은 자동 줄바꿈과 슬라이드 바가 표시 되지 않고 라벨이 왼쪽에 위치한다.

public class AttributeExample : MonoBehaviour
{
	[TextArea(5, 7)]
	public string TextAreaText;
	[Multiline(5)]
	public string MultilineText;
}

Tooltip

변수, 프로퍼티 등에 설명을 인스펙터에서 확인 할 수 있도록 하기 위해 사용

설명은 변수명에 마우스 커서를 올렸을때 표시됨

public class AttributeExample : MonoBehaviour
{
	[Tooltip("Int형 변수")]
	public int AA;
}

 

 

댓글