Unity 공부

[Unity] 속성(Attribute)

때류기 2024. 8. 24. 00:25

Unity에서 Attribute(속성)클래스, 메서드, 변수 등의 요소에 메타데이터를 추가하여, 특정 기능을 부여하거나 Unity 에디터에서의 동작을 제어하는 데 사용됩니다. 이 글에서는 Unity에서 자주 사용되는 Attribute에 대해 설명하며, 각각의 사용 방법과 예제를 통해 알아보겠습니다.

 

 

 


1. Attribute(속성)란?

Attribute클래스, 메서드, 필드 또는 프로퍼티에 추가되는 메타데이터입니다. 이 메타데이터는 런타임 또는 컴파일 타임에 특정 기능을 적용하거나, Unity 에디터에서의 동작을 변경하는 역할을 합니다. 예를 들어, Unity에서 SerializeField, Range, Tooltip과 같은 Attribute는 에디터에서 변수를 시각화하고 편집하는 방식을 제어합니다.

 

Attribute는 대괄호([])로 둘러싸여 사용되며, 대개 클래스, 필드, 메서드 위에 위치합니다.

 

예제:

[Tooltip("This is a player's health value.")]
[SerializeField]
private int _playerHealth = 100;

위 코드에서 TooltipSerializeField는 Unity에서 자주 사용되는 Attribute입니다. Tooltip은 해당 변수를 마우스 오버할 때 설명을 표시하고, SerializeField는 비공개 변수라도 Unity 에디터에서 직렬화할 수 있게 만들어, 인스펙터 창에 표기가 되도록 합니다. Attribute 명령어 설명은 아래에서 진행하겠습니다.

 

 

 


2. 특징

 

1)메타데이터 역할

Attruibute는 클래스, 메서드 또는 필드에 메타데이터를 추가하여, 런타임이나 컴파일 타임에 특정 기능을 부여하거나 동작을 제어하는 데 사용됩니다. 이를 통해 코드의 동작 방식을 유연하게 설정할 수 있습니다.

 

2) 에디터에서의 시각적 컨트롤

Unity에서 Attribute는 주로 에디터에서 변수의 표시 방식을 제어하는 데 사용됩니다. Range, Tooltip, Header와 같은 Attribute는 Unity 에디터에서 변수를 더 직관적으로 표시하도록 도와줍니다.

 

3) 코드의 유지보수와 가독성 향상

Attribute를 사용하면 코드의 특정 부분에 대해 설명을 추가하거나 동작을 제어할 수 있기 때문에, 코드의 가독성과 유지보수성을 향상시킬 수 있습니다.

 

4) 사용자 정의 Attribute

Unity에서는 내장된 Attribute 외에도 사용자 정의 Attribute를 만들어 특정한 기능을 구현할 수 있습니다. 이를 통해 특정 요구 사항에 맞는 메타데이터를 코드에 추가할 수 있습니다.

 

 

 


3. 사용 이유

Unity에서 Attribute를 사용하는 이유는 다양하지만, 주된 이유는 에디터에서의 직관적인 변수 제어코드의 가독성 및 유지보수성을 높이기 위해서입니다. 몇 가지 주요 이유를 살펴보겠습니다.

 

 

1) 직관적인 변수 제어

Unity에서는 변수가 에디터에서 어떻게 표시될지 제어할 수 있습니다. 예를 들어, Range를 사용하면 슬라이더를 통해 변수를 조정할 수 있고, Tooltip을 통해 변수의 용도를 설명할 수 있습니다. 이는 개발 중 에디터 작업을 더욱 효율적으로 만들어 줍니다.

 

2) 비공개 변수의 직렬화

SerializeField와 같은 Attribute를 사용하면 비공개 변수를 직렬화하여 에디터에서 값을 설정할 수 있습니다. 이는 클래스 내부의 캡슐화를 유지하면서도 에디터에서 값 조정이 가능하게 만들어줍니다.

 

3) 특정 동작을 제어

RequireComponent와 같은 Atrribute를 사용하면, 스크립트가 특정 컴포넌트를 반드시 필요로 하도록 강제할 수 있습니다. 이처럼 Attribute를 통해 런타임 시 특정 동작을 제어할 수 있습니다.

 

4) 코드의 유지보수성 향상

Attribute를 통해 코드에 메타데이터를 추가하면, 다른 개발자나 미래의 자신이 코드를 읽을 때 더 쉽게 이해할 수 있습니다. 설명이나 경고를 추가하는 Attribute는 코드의 유지보수성을 향상시킬 수 있습니다.

 

 

 


4. 자주 사용되는 Attribute

 

1) SerializeField

SerializeField비공개(private) 변수를 Unity 에디터에서 직렬화할 수 있게 해줍니다. 기본적으로 비공개 변수는 에디터에서 표시되지 않지만, SerializeField를 사용하면 이를 가능하게 만들어 줍니다.

[SerializeField]
private int _playerHealth = 100;

 

 

2) Tooltip

Tooltip은 Unity에디터에서 변수 위에 마우스를 올렸을 때 설명을 보여줍니다. 이 Attribute는 변수의 의미나 용도를 쉽게 설명할 수 있도록 도와줍니다.

[Tooltip("This is the player's health.")]
[SerializeField]
private int _playerHealth = 100;

 

 

3) Range

Range는 숫자형 변수에 범위를 설정하여, 에디터에서 슬라이더를 통해 값을 설정할 수 있게 합니다. 이 Attribute는 주로 float 또는 int 변수에 사용됩니다.

[Range(0, 100)]
public int _playerHealth = 50;

 

 

4)Header

Header는 에디터에서 변수들 위에 제목을 표시하여, 변수들을 그룹화하고 설명할 수 있습니다. 이를 통해 에디터에서 변수를 더 깔끔하게 정리할 수 있습니다.

[Header("Player Settings")]
public int _playerHealth = 100;

[Header("Enemy Settings")]
public int _enemyHealth = 50;

 

 

5)RequireComponent

RequireComponent특정 컴포넌트가 해당 스크립트에 필요할 때 사용하는 Attribute입니다. 이 Attribute를 사용하면, 컴포넌트가 없는 오브젝트에 스크립트를 추가할 때 자동으로 해당 컴포넌트가 추가됩니다.

[RequireComponent(typeof(Rigidbody))]
public class PlayerController : MonoBehaviour
{
    // Rigidbody가 자동으로 추가됩니다.
}

 

 

6) HideInInspector

HideInInspector 공개(public)된 변수를 에디터에서 숨길 때 사용됩니다. 이 Attribute를 사용하면 변수는 외부 클래스에서 접근할 수 있지만, 에디어에서는 보이지 않게 할 수 있습니다.

[HideInInspector]
public int _hiddenValue = 42;

 

 

7) ContextMenu

ContextMenu는 에디터의 인스펙터 창에서 특정 메서드를 오른쪽 클릭 메뉴로 실행할 수 있게 해줍니다. 디버깅하거나 테스트 목적으로 유용합니다.

public class Player : MonoBehaviour
{
    [ContextMenu("Reset Player Health")]
    public void ResetHealth()
    {
        Debug.Log("Player health reset!");
    }
}

 

 

8) ExecuteInEditMode

ExecuteInEditModeMonoBehaviour가 에디터 모드에서도 실행되도록 만듭니다. 일반적으로 MonoBehaviour는 플레이 모드에서만 실행되지만, 이 Attribute를 사용하면 에디터 모드에서도 Update, Start와 같은 메서드가 호출됩니다.

[ExecuteInEditMode]
public class EditorScript : MonoBehaviour
{
    private void Update()
    {
        Debug.Log("Running in Edit Mode");
    }
}

 

 

9) Space

Space는 매개변수 없이 사용될 수 있으며, 기본적으로 고정된 크기의 간격을 추가합니다.

아래의 코드에서는 인스펙터에 표기된 _playerHealth, _playerScore, _playerLevel 사이의 기본 간격이 추가됩니다. 이는 인스펙터에서 변수를 보다 구분하기 쉽게 만들어 줍니다. 

public class SpaceExample : MonoBehaviour
{
    public int _playerHealth;

    [Space]  // 기본 간격 추가
    public int _playerScore;

    [Space]  // 또 다른 간격 추가
    public int _playerLevel;
}

 

 

 


결론

Unity에서 Attribute는 매우 강력한 도구로, 에디터에서의 변수 제어부터 런타임 동작에 이르기까지 다양한 용도로 사용됩니다. SerializeField, Range, Tooltip과 같은 내장 Attribute는 에디터에서 변수를 더 직관적으로 관리하게 해주며, RequireComponent나 ExecuteInEditMode 같은 Attribute는 코드의 동작을 제어하는 데 유용합니다.

 

또한, 사용자 정의 Attribute를 만들어 특정한 동작을 추가하거나 기능을 확장할 수도 있습니다. 이러한 Attribute는 개발을 더욱 효율적이고 직관적으로 만들어 주며, 코드의 유지보수성과 가독성 또한 향상시킵니다.

 

이 글에서 소개한 Attribute들을 잘 활용하면, Unity에서의 개발 작업을 훨씬 더 원활하고 생산적으로 진행할 수 있습니다.

 

 

 


지금까지 Unity Attribute(속성)에 대해 알아보았습니다.

현재 글의 내용 중 틀린 부분이나, 지적하실 내용이 있으시다면 언제든지 알려주세요! 읽어주셔서 감사합니다.