유니티를 사용하다보면 [Header] 혹은 [SerializeField]와 같은 것을 볼 수 있다. 무언가 기능을 하는데, 어떻게 이게 동작하는지 지금부터 알아보도록 하겠다.
코드에 부가 정보를 기록하고 읽을 수 있는 기능
이렇게 보면 이해가 잘 안될 수 도 있다. 먼저, 메타데이터가 무엇인지 알아야 한다.
Metadata란 데이터의 데이터를 의미한다. 예를들어 c#코드도 데이터지만, 이 코드에 대한 정보, 데이터가 존재할 수 있다. 이를 메타데이터 라고 하는것이다.
리플렉션이나 어트리뷰트를 통해 얻는 정보들도 C# 코드의 메타데이터라고 할 수 있다.
[어트리뷰트_이름(어트리뷰트 매개변수)]
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는 C#에서 어트리뷰트 적용될 수 있는 대상을 지정하는 특성이다.
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()으로 대체 가능하다.
이름 | 설명 |
---|---|
SerializeField | private, protected 변수를 인스펙터에 표시 |
Serializable | 커스텀 클래스를 인스펙터에 표시 |
Header | 변수위에 타이틀을 설정해 카테고리 분류 가능, 인스펙터 외관 정리에 사용 |
HideInInspector | public 변수를 인스펙터에서 숨길수 있음 |
RequireComponent | 필수 컴포넌트를 추가 할 수 있음 |
Range | int, float 변수를 슬라이드바로 표시하고 범위를 제한함 |
Space | 변수와 변수 사이에 간격 주기 |
CreateAssetMenu | ScriptableObject Asset을 생성할때 사용하는 메뉴를 추가 할 때 사용 |
MenuItem | 임의의 함수 ( static ) 실행을 메뉴 항목으로 추가 |
ContextMenu | 임의의 함수 ( non-static ) 실행을 컴포넌트 톱니 메뉴에 추가 |
AddComponentMenu | 인스펙터의 AddComponent 메뉴 항목으로 컴포넌트를 추가 할때 사용 |
ExecuteInEditMode | 에디터가 플레이 모드가 아니더라도 컴포넌트가 동작하도록 할때 사용 |
Multiline | string 변수를 여러줄 입력 가능하게 만들때 사용 |
TextArea | Multiline과 비슷, 폭에 맞춰 자동으로 줄바꿈과 슬라이드바 표시 |
Tooltip | 인스펙터에 표시되는 변수에 설명을 추가 할때 사용 |
상세설명 : kalute's Blog:티스토리
<참고 자료>
kalute's Blog:티스토리
scii's Blog:티스토리
본 포스팅은 상업적 목적을 포함하지 않습니다.