
어트리뷰트(Attribute)는 코드 요소에 메타 데이터를 첨부하는 데 사용되는 클래스다. 이를 활용하면 Unity로 작업을 할 때 좀 더 직관적이고 편하게 할 수 있다.
HideInInspector는 public으로 선언된 필드를 인스펙터에서 숨기고 싶을 때 사용한다.
만약 HideInInspector를 설정하기 전에 인스펙터에서 값을 변경한 적이 있다면 그 값이 여전히 저장된다.
System.NonSerialized는 public으로 선언된 필드를 인스펙터에서 숨기고 싶을 때 사용한다.
HideInInspector와 기능이 거의 동일하지만 인스펙터에서 변경한 값 대신 초기값이 설정된다.
SerializeField는 데이터를 직렬화할 때 사용한다. 부가적으로, private으로 선언된 필드를 인스펙터에 노출시키고 싶을 때 사용한다.
public class Test : MonoBehaviour
{
[SerializeField] private int value = 2;
}

System.Serializable은 인스펙터에 보이지 않는 class나 struct로 선언된 데이터를 인스펙터에 노출 및 수정하고 싶을 때 사용한다.
[System.Serializable]
public struct UserData
{
public string m_user_id;
public int m_user_level;
}
public class Test : MonoBehaviour
{
[SerializeField] private UserData m_user_data;
}

Header(string)은 인스펙터에서 필드를 구분지어서 보고 싶을 때 사용한다.
public class Player : MonoBehaviour
{
[Header("플레이어의 트랜스폼")]
[SerializeField] private Transform m_transform;
[Header("플레이어의 강체")]
[SerializeField] private Rigidbody m_rigidbody;
[Header("플레이어의 애니메이터")]
[SerializeField] private Animator m_animator;
}

Space(float)은 인스펙터에 노출되는 필드들을 구분하기 쉽도록 공간을 분리하고 싶을 때 사용한다.float을 생략하면 기본 값으로 공간을 분리한다.
public class Enemy : MonoBehaviour
{
[Header("몬스터의 체력")]
[SerializeField] private float m_hp;
[Header("몬스터의 공격력")]
[SerializeField] private float m_atk;
}
public class RangedEnemy : Enemy
{
[Space(50f)][Header("몬스터의 사거리")]
[SerializeField] private float m_range;
}

Tooltip(string)은 인스펙터에서 필드명에 마우스 커서를 올려뒀을 때 필드에 대한 설명 문구를 출력하고 싶을 때 사용한다.
public class Enemy : MonoBehaviour
{
[Tooltip("몬스터에게 부여하고 싶은 체력을 float 타입에 맞춰서 입력해주세요.")]
[Header("몬스터의 체력")]
[SerializeField] private float m_hp;
}

HelpURL(string)은 인스펙터에서 도움말로 연결된 링크를 연동하는 데 사용한다.
연결된 링크는 컴포넌트의 우상단에 위치한 물음표 버튼을 누르면 열리게 된다.
[HelpURL("https://velog.io/@jxng-min/posts")]
public class Test : MonoBehaviour
{
...
}

Range(min, max)는 int와 float 필드에만 사용할 수 있으며, 인스펙터에서 슬라이더를 통해 값을 제한적으로 변경하고 싶을 때 사용한다.
public class Enemy : MonoBehaviour
{
[Range(3f, 5f)]
[SerializeField] private float m_move_spd = 4f;
}

Multiline(int)은 인스펙터에 텍스트 박스를 생성하고 싶을 때 사용한다. 매개변수로 행의 개수를 입력받는다.
public class Test : MonoBehaviour
{
[Multiline(5)]
[SerializeField] private string m_string;
}

TextArea(min, max)는 인스펙터에 텍스트 박스를 생성하고 싶을 때 사용한다. 매개변수로 최소, 최대 행의 개수를 입력받으며, 내용의 길이에 따라 범위 내에서 유동적으로 변한다.
public class Test : MonoBehaviour
{
[TextArea(2, 5)]
[SerializeField] private string m_string;
}

AddComponentMenu(string)은 인스펙터에서 Add Component의 카테고리를 분류할 때 사용한다.
[AddComponentMenu(Custom/ThisIsTest)]
public class Test : MonoBehaviour
{
...
}

System.Obsolete는 클래스 상단에 선언하며, 인스펙터에서 이 컴포넌트가 사용되지 않는다는 경고문을 노출하고 싶을 때 사용한다.
[System.Obsolete]
public class Test : MonoBehaviour
{
...
}

RequireComponent(typeof(Component))는 매개변수로 의존 컴포넌트의 형식을 입력하며, 이 컴포넌트를 Add Component할 때 자동으로 의존 컴포넌트를 추가할 때 사용한다.
[RequireComponent(typeof(Rigidbody))]
public class Enemy : MonoBehaviour
{
...
}

DisallowMultipleComponent는 이 컴포넌트가 2개 이상 중복으로 Add Component되지 않도록 설정하고 싶을 때 사용한다.
[DisallowMultipleComponent]
public class Test : MonoBehaviour
{
...
}

CreateAssetMenu는 특정 스크립트에서 새로운 에셋을 생성할 수 있는 메뉴 옵션을 제공하고 싶을 때 사용한다.
[CreateAssetMenu(fileName = "New Item", menuName = "Scriptable Object/Create Item")]
public class Item : ScriptableObject
{
...
}
