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;
}
다음과 같이 스크립트를 작성하면
해당 데이터를 여러 줄로 편집할 수 있습니다.