UNITY/Script

[UNITY C#] Unity Attribute 정리

HYEOKJUN 2022. 4. 9. 18:00
반응형


https://docs.unity3d.com/kr/2020.3/Manual/Attributes.html

 

속성 - Unity 매뉴얼

Attributes 는 스크립트에서 클래스, 프로퍼티 또는 함수 위에 명시하여 특별한 동작을 나타낼 수 있는 마커입니다. 예를 들어, 프로퍼티 선언 위에 HideInInspector 속성을 추가하여 인스펙터가 공용

docs.unity3d.com

2020.3.32f1 버전 기준


* 대부분의 필드 데이터에 대한 Unity Attribute는 속성을 추가할 필드 데이터에 public이나 [SerializableField] 속성을 추가하여 Inspector창에 표시되도록 해야 합니다.


AddComponentMenu

[AddComponentMenu("{메뉴 이름}")]
// 클래스

AddComponentMenu[Inspector 창 > Add Component] 대신 [Component 메뉴]에서 스크립트를 배치할 수 있는 속성입니다.
이를 통해 [Component 메뉴]를 더 직관적으로 구성할 수 있으며, 스크립트를 추가할 때 작업 속도가 향상됩니다.

using UnityEngine;

[AddComponentMenu("Test/TestScript")]
public class TestScript : MonoBehaviour
{
	//...
}

위와 같이 스크립트를 작성하면

오브젝트 선택 후 [Component 메뉴]를 통해 스크립트를 추가할 수 있습니다.


ColorUsage

[ColorUsage({Alpha 사용 여부}, {HDR 사용 여부}, ...)]
// Color 데이터

ColorUsage색 지정에 대한 색상 필드를 구성하는 데 사용되는 속성입니다.

using UnityEngine;

public class TestScript : MonoBehaviour
{
	public Color testColor0;
	[ColorUsage(false)] public Color testColor1;
}

위와 같이 스크립트를 작성하면

ColorUsage(false) 속성이 있는 변수는 Color의 Alpha 값을 변경할 수 없는 것을 확인할 수 있습니다.


ContextMenu

[ContextMenu("{명령 이름}")]
// 실행할 함수

ContextMenu[Inspector 창]의 해당 스크립트 Component 메뉴에 명령을 추가하는 속성입니다.
이 기능은 스크립트에서 데이터를 자동으로 설정할 때 유용합니다. 함수는 정적이지 않아야 합니다.

using UnityEngine;

public class TestScript : MonoBehaviour
{
	public string testString;
    
	[ContextMenu("Test")]
	void Test() {
		testString = "TEST TEXT";
	}
}

다음과 같이 스크립트를 작성하면

[Script Component > 우측 상단 메뉴]에서 해당 명령을 실행하여

다음과 같이 적용되는 것을 확인할 수 있습니다.


ContextMenuItem

[ContextMenuItem("{명령 이름}", "{실행할 함수 이름}")]
// 데이터
// 실행할 함수

ContextMenuItem필드 데이터에 함수를 호출하는 [컨텍스트 메뉴]를 추가하는 속성입니다.
이 기능 또한 스크립트에서 데이터를 자동으로 설정할 때 유용합니다.

using UnityEngine;

public class TestScript : MonoBehaviour
{
	[ContextMenuItem("Test", "TestFunction")]
	public string testString;
    
	void TestFunction() {
		testString = "TEST TEXT";
	}
}

다음과 같이 스크립트를 작성하면

해당 필드 데이터의 [오른쪽 클릭]에서 해당 명령을 실행하여

다음과 같이 적용되는 것을 확인할 수 있습니다.


CreateAssetMenu

[CreateAssetMenu(fileName = "{생성될 파일 이름 기본값}", menuName = "{메뉴 이름}", order = {순서})]
// 클래스

CreateAssetMenu는 ScriptableObject 객체를 [Asset > Create] 하위 메뉴에 표시하여 객체를 쉽게 만들고 프로젝트에 Asset 파일로 저장할 수 있도록 하는 속성입니다.

using UnityEngine;

[CreateAssetMenu(fileName = "TestScript0", menuName = "TestMenu/TestScript0", order = 1)]
public class TestScript0 : ScriptableObject
{
    public int testID;
    public string testString;
}

[CreateAssetMenu(fileName = "TestScript1", menuName = "TestMenu/TestScript1", order = 0)]
public class TestScript1 : ScriptableObject 
{
	//...
}

다음과 같이 스크립트를 작성하여

[Asset 창 > Create] 하위 메뉴에서 해당 ScriptableObject를 생성할 수 있습니다.


CustomGridBrushAttribute

[CustomGridBrushAttribute]
// 클래스

CustomGridBrushAttribute사용하여 클래스를 그리드 브러시로 정의하는 속성으로 [Pallette 창]에서 사용할 수 있습니다.


Delayed

[Delayed]
// 데이터

Delayed[Inspector 창]에서 필드 데이터 편집을 지연시키는 데 사용되는 속성입니다.

이 속성을 사용하면 사용자가 Enter 키를 누르거나 포커스를 필드에서 멀리 이동하기 전까지 데이터는 새 값을 반환하지 않습니다.

using UnityEngine;

public class TestScript : MonoBehaviour
{
	[Delayed] public string delayedTestString = "123";
	public string testString = "123";

	void Update() {
		Debug.Log("DelayedString : " + delayedTestString + " / NondelayedString : " + testString);
	}
}

다음과 같이 스크립트를 작성하여 실행했을 때

Delayed 속성이 없는 데이터는 값을 변경하자마자 바로 출력 결과가 바뀌지만

Delayed 속성이 있는 데이터는 값 변경 후 Enter를 입력해야 출력 결과가 바뀌는 것을 확인할 수 있습니다.


DisallowMultipleComponent

[DisallowMultipleComponent]
// 클래스

DisallowMultipleComponent는 MonoBehavior를 상속하는 동일한 클래스 또는 자식 클래스 스크립트를 하나의 GameObject에 두 개 이상 추가되지 않도록 하는 속성입니다.

using UnityEngine;

[DisallowMultipleComponent]
public class TestScript : MonoBehaviour
{
    // ...
}

다음과 같이 스크립트를 작성하여 두 개 이상의 같은 스크립트를 추가할 때

다음과 같은 오류가 발생합니다.


ExecuteAlways / ExecuteInEditMode

[ExecuteAlways]
// MonoBehavior를 상속하는 클래스
[ExecuteInEditMode]
// MonoBehavior를 상속하는 클래스

ExecuteAlways / ExecuteInEditMode스크립트가 Play 모드와 Edit 모드에서 항상 실행되도록 하는 속성입니다.
Play 모드에서 실행되는 모습과 Edit 모드에서 실행되는 모습이 크게 다를 수 있습니다.


Header

[Header("{해더 이름}")]
// 데이터 ...

Header필드 데이터의 제목을 정하는 속성입니다.

using UnityEngine;

public class TestScript : MonoBehaviour
{
	[Header("Test")] 
	public int testID;
	public string testString;
}

다음과 같이 스크립트를 작성하여 실행했을 때

다음과 같이 제목이 표시된 것을 알 수 있습니다.


HideInInspector

[HideInInspector]
// public 데이터

HideInInspector해당 데이터가 [Inspector 창]에 표시되지 않도록 하는 속성입니다.

using UnityEngine;

public class TestScript : MonoBehaviour
{
	[HideInInspector] 
	public string testString;
}

다음과 같이 스크립트를 작성하여 실행했을때

해당 데이터가 public임에도 [Inspector 창]의 해당 스크립트 Component에 표시되지 않습니다.


Multiline

[Multiline({줄 수})]
// string 데이터

Multiline다중 줄 텍스트 필드를 통해 문자열을 편집할 수 있는 속성입니다.

using UnityEngine;

public class TestScript : MonoBehaviour
{
	[Multiline(3)] 
	public string testString;
}

다음과 같이 스크립트를 작성하면

해당 데이터를 여러 줄로 편집할 수 있습니다.


NonReorderable

[NonReorderable]
// 배열 데이터

NonReorderable은 [Inspector 창]에서 배열 데이터의 순서를 변경할 수 없게 하는 속성입니다.

using UnityEngine;

public class TestScript : MonoBehaviour
{
	public int[] testArray;
	[NonReorderable] public int[] nonRecorderableTestArray;
}

다음과 같이 스크립트를 작성하면

일반 배열 데이터는 순서를 변경할 수 있지만 NonRecorderable 배열 데이터는 순서를 변경할 수 없는 것을 확인할 수 있습니다.


Range

[Range({최소값}, {최대값})]
// 정수 또는 실수 데이터

Range는 [Inspector 창]에서 최대, 최소 값이 정해진 슬라이더를 이용해 필드 데이터를 지정할 수 있는 속성입니다.

using UnityEngine;

public class TestScript : MonoBehaviour
{
	[Range(-10.0f, 10.0f)]
	public float testRange;
}

다음과 같이 스크립트를 작성하면

다음과 같이 슬라이더를 이용해 값을 지정할 수 있습니다.


RequireComponent

[RequireComponent(typeof({컴포넌트 타입}))]
// 클래스

RequireComponent해당 스크립트를 추가할 때 지정한 Component를 자동으로 추가하는 속성입니다.

using UnityEngine;

[RequireComponent(typeof(BoxCollider2D))]
public class TestScript : MonoBehaviour
{
	// ...
}

다음과 같이 스크립트를 작성하고 해당 스크립트를 추가할때

다음과 같이 지정한 컴포넌트가 자동으로 추가되는 것을 확인할 수 있습니다.


SerializeField

[SerializeField]
// private 데이터

SerializeField필드 데이터를 직렬화하는 속성입니다.

(private 데이터를 직렬화하면 [Inspector 창]에서 직접 편집할 수 있습니다.)

using UnityEngine;

public class TestScript : MonoBehaviour
{
	[SerializeField] string testString;
}

다음과 같이 스크립트를 작성하면

해당 데이터가 private이지만 [Inspector 창]에서 편집할 수 있습니다.


Space

[Space]
// 데이터 ...

Space[Inspector 창]에서 필드 데이터 간에 간격을 띄우는 속성입니다.

using UnityEngine;

public class TestScript : MonoBehaviour
{
	public int textID0;
	public int textID1;
	public int textID2;
	[Space] 
	public string testString0;
	public string testString1;
	public string testString2;
}

다음과 같이 스크립트를 작성하면

필드 데이터 사이에 간격이 생긴 것을 확인할 수 있습니다.


TextArea

[TextArea({최소 줄 수}, {최대 줄 수})]
// string 데이터

TextArea높이를 자유롭게 조정하고 스크롤할 수 있는 텍스트 필드를 사용하여 문자열을 편집할 수 있는 속성입니다.

using UnityEngine;

public class TestScript : MonoBehaviour
{
	[TextArea(3, 5)]
	public string testString;
}

다음과 같이 스크립트를 작성하면

해당 데이터를 여러 줄로 편집할 수 있습니다.

반응형