Unity - [어트리뷰트(Attribute)]

윤형·2024년 12월 11일
1

Unity

목록 보기
2/8

유니티를 사용하다보면 [Header] 혹은 [SerializeField]와 같은 것을 볼 수 있다. 무언가 기능을 하는데, 어떻게 이게 동작하는지 지금부터 알아보도록 하겠다.

Attribute(어트리뷰트)

코드에 부가 정보를 기록하고 읽을 수 있는 기능

이렇게 보면 이해가 잘 안될 수 도 있다. 먼저, 메타데이터가 무엇인지 알아야 한다.

Metadata란 데이터의 데이터를 의미한다. 예를들어 c#코드도 데이터지만, 이 코드에 대한 정보, 데이터가 존재할 수 있다. 이를 메타데이터 라고 하는것이다.
리플렉션이나 어트리뷰트를 통해 얻는 정보들도 C# 코드의 메타데이터라고 할 수 있다.

CustomAttribute 사용 방법

[어트리뷰트_이름(어트리뷰트 매개변수)]
public coid TestMethod(){
	//,,,
}
using System;

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class Custom : Attribute
{
	public string Name {get;}
    public double Version {get;}
    
    public Custom(string name, double version){
    	Name = name;
        Version = version;
    }
    
    public void DisplayInfo(){
    	Console.WriteLine($"Author: {Name}, version: {Version}");
    }
}

AttributeUsage

AttributeUsage는 C#에서 어트리뷰트 적용될 수 있는 대상을 지정하는 특성이다.

AttributeUsage의 주요 속성

  • AttributeTargets: 어트리뷰트를 적용할 수 있는 대상을 지정한다. 여러 대상을 지정할 수 있고, 클래스, 메서드, 속성, 필드등이 있다.

  • AllowMultiple : 이 속성이 true로 설정되면, 동일한 요소에 어트리뷰트를 여러번 적용할 수 있다. 기본값은 false다.

  • Inherited : 이 속성이 true로 설정되면, 해당 어트리뷰트가 상속된 클래스에서도 사용할 수 있다. 기본값은 false다.


[Custom("John Doe", 1.0)]
class Program
{
    static void Main(string[] args)
    {
        var classAttributes = (Custom[])typeof(Program).GetCustomAttributes(typeof(Custom), false);
        foreach (var atter in classAttributes)
        {
            atter.DisplayInfo();
        }
    }
}
  • attribute이름을 만약 CustomArrtibute로 했을시, 접미사인 Attribute가 없어도 c#에서 알아서 인식해 Custom이라고 호출 가능하다.

  • GetCustomAttributes()는 특정 타입에 적용된 어트리뷰트를 가져오는 메서드이다. 첫번째 인자로는 가져오려는 어트리뷰트의 타입을 지정하고 두번째로는 상속된 어트리뷰트를 포함할지 여부를 지정한다.

  • GetCustomAttributes는 object[]타입의 배열을 반환하기 때문에 Custom[] 타입으로 캐스팅하여 Custom 어트리뷰트 배열로 변환한다.

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true)]
public class Custom : Attribute
{
	public string Name {get;}
    public double Version {get;}
        
    public Custom(string name, double version){
    	Name = name;
        Version = version;
    }
    
    public void DisplayInfo(){  
    	Console.WriteLine($"Author: {Name}, version: {Version}");
    }
}

[Custom("John Doe", 1.0)]
[Custom("John Doe", 2.0)]
class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Hello World!");
        var classAttributes = (Custom[])typeof(Program).GetCustomAttributes(typeof(Custom), false);
        foreach (var atter in classAttributes)
        {
            atter.DisplayInfo();
        }

        var program = new Program();
        program.DisplayAttributes();
    }
    public void DisplayAttributes(){
        var attributes = (Custom[])this.GetType().GetCustomAttributes(typeof(Custom), false);
        foreach (var attr in attributes)
        {
            attr.DisplayInfo();
        }
    }
}
  • AllowMultiful을 true로 하면 어트리뷰트를 중복 적용이 가능해진다.

  • 또한 typeof(Program) 부분은 this.GetType()으로 대체 가능하다.

유니티에서 자주 사용하는 Attribute 정리

이름설명
SerializeFieldprivate, protected 변수를 인스펙터에 표시
Serializable커스텀 클래스를 인스펙터에 표시
Header변수위에 타이틀을 설정해 카테고리 분류 가능, 인스펙터 외관 정리에 사용
HideInInspectorpublic 변수를 인스펙터에서 숨길수 있음
RequireComponent필수 컴포넌트를 추가 할 수 있음
Rangeint, float 변수를 슬라이드바로 표시하고 범위를 제한함
Space변수와 변수 사이에 간격 주기
CreateAssetMenuScriptableObject Asset을 생성할때 사용하는 메뉴를 추가 할 때 사용
MenuItem임의의 함수 ( static ) 실행을 메뉴 항목으로 추가
ContextMenu임의의 함수 ( non-static ) 실행을 컴포넌트 톱니 메뉴에 추가
AddComponentMenu인스펙터의 AddComponent 메뉴 항목으로 컴포넌트를 추가 할때 사용
ExecuteInEditMode에디터가 플레이 모드가 아니더라도 컴포넌트가 동작하도록 할때 사용
Multilinestring 변수를 여러줄 입력 가능하게 만들때 사용
TextAreaMultiline과 비슷, 폭에 맞춰 자동으로 줄바꿈과 슬라이드바 표시
Tooltip인스펙터에 표시되는 변수에 설명을 추가 할때 사용

상세설명 : kalute's Blog:티스토리


<참고 자료>
kalute's Blog:티스토리
scii's Blog:티스토리

본 포스팅은 상업적 목적을 포함하지 않습니다.

profile
제가 관심있고 공부하고 싶은걸 정리하는 저만의 노트입니다.

0개의 댓글