[Unity] C# 및 Unity 어트리뷰트(Attribute)

Jongmin Kim·2025년 5월 12일

Unity

목록 보기
4/19
post-thumbnail

서론

어트리뷰트(Attribute)는 코드 요소에 메타 데이터를 첨부하는 데 사용되는 클래스다. 이를 활용하면 Unity로 작업을 할 때 좀 더 직관적이고 편하게 할 수 있다.


인스펙터 노출과 관련된 어트리뷰트

[HideInInspector]

HideInInspectorpublic으로 선언된 필드를 인스펙터에서 숨기고 싶을 때 사용한다.
만약 HideInInspector를 설정하기 전에 인스펙터에서 값을 변경한 적이 있다면 그 값이 여전히 저장된다.

[System.Nonserialized]

System.NonSerializedpublic으로 선언된 필드를 인스펙터에서 숨기고 싶을 때 사용한다.
HideInInspector와 기능이 거의 동일하지만 인스펙터에서 변경한 값 대신 초기값이 설정된다.

[SerializeField]

SerializeField데이터를 직렬화할 때 사용한다. 부가적으로, private으로 선언된 필드를 인스펙터에 노출시키고 싶을 때 사용한다.

public class Test : MonoBehaviour
{
	[SerializeField] private int value = 2;
}

[System.Serializable]

System.Serializable은 인스펙터에 보이지 않는 classstruct로 선언된 데이터를 인스펙터에 노출 및 수정하고 싶을 때 사용한다.

[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)]

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)]

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)]

Tooltip(string)인스펙터에서 필드명에 마우스 커서를 올려뒀을 때 필드에 대한 설명 문구를 출력하고 싶을 때 사용한다.

public class Enemy : MonoBehaviour
{
	[Tooltip("몬스터에게 부여하고 싶은 체력을 float 타입에 맞춰서 입력해주세요.")]
	[Header("몬스터의 체력")]
    [SerializeField] private float m_hp;
}

HelpURL(string)

HelpURL(string)인스펙터에서 도움말로 연결된 링크를 연동하는 데 사용한다.
연결된 링크는 컴포넌트의 우상단에 위치한 물음표 버튼을 누르면 열리게 된다.

[HelpURL("https://velog.io/@jxng-min/posts")]
public class Test : MonoBehaviour
{
	...
}




인스펙터 필드 커스텀과 관련된 어트리뷰트

[Range(min, max)]

Range(min, max)intfloat 필드에만 사용할 수 있으며, 인스펙터에서 슬라이더를 통해 값을 제한적으로 변경하고 싶을 때 사용한다.

public class Enemy : MonoBehaviour
{
	[Range(3f, 5f)]
    [SerializeField] private float m_move_spd = 4f;
}

[Multiline(int)]

Multiline(int)인스펙터에 텍스트 박스를 생성하고 싶을 때 사용한다. 매개변수로 행의 개수를 입력받는다.

public class Test : MonoBehaviour
{
	[Multiline(5)]
    [SerializeField] private string m_string;
}

[TextArea(min, max)]

TextArea(min, max)인스펙터에 텍스트 박스를 생성하고 싶을 때 사용한다. 매개변수로 최소, 최대 행의 개수를 입력받으며, 내용의 길이에 따라 범위 내에서 유동적으로 변한다.

public class Test : MonoBehaviour
{
	[TextArea(2, 5)]
    [SerializeField] private string m_string;
}



에디터 커스텀 관련 어트리뷰트

[AddComponentMenu(string)]

AddComponentMenu(string)인스펙터에서 Add Component의 카테고리를 분류할 때 사용한다.

[AddComponentMenu(Custom/ThisIsTest)]
public class Test : MonoBehaviour
{
	...
}



컴포넌트 관련 어트리뷰트

[System.Obsolete]

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

[System.Obsolete]
public class Test : MonoBehaviour
{
	...
}

[RequireComponent(typeof(Component))]

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

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

[DisallowMultipleComponent]

DisallowMultipleComponent는 이 컴포넌트가 2개 이상 중복으로 Add Component되지 않도록 설정하고 싶을 때 사용한다.

[DisallowMultipleComponent]
public class Test : MonoBehaviour
{
	...
}

[CreateAssetMenu(fileName = string, menuName = string, order = int)]

CreateAssetMenu는 특정 스크립트에서 새로운 에셋을 생성할 수 있는 메뉴 옵션을 제공하고 싶을 때 사용한다.

  • fileName: 생성되는 에셋의 이름
  • menuName: 에셋을 생성하는 메뉴의 이름, "/"로 경로를 설정
  • order: 메뉴 중에서 몇 번째 위치에 표시될 지 정하는 값, 값이 클 수록 마지막에 표기
[CreateAssetMenu(fileName = "New Item", menuName = "Scriptable Object/Create Item")]
public class Item : ScriptableObject
{
	...
}

profile
Game Client Programmer

0개의 댓글