Attribute 속성이란
유니티는 개발자가 작업을 좀 더 직관적이고 편하게 할 수 있도록
Unity 전용 Attribute 속성을 제공해주고 있다.
Attibute는 유니티뿐만 아닌 .NET 라이브러리에도 전용 속성이
정의되어있다 오늘은 그중 몇 가지 유용한 Unity와 .NET
어트리뷰트를 알아볼 것이다.
우선 아래 표부터 살펴보자
이름 | 속성 | 이점 |
CreateAssetMenu | 에셋 -> 메뉴 생성가능 | 주로 ScriptableObject 이용시 사용 |
ContextMenu | 컴포넌트 -> 함수 실행 | Debug, 동작 테스트에 활용 |
RequireComponent | 컴포넌트 누락 방지 | 컴포넌트 설정 오류 방지 |
ExecuteInEditMode | 스크립트 -> 에디터에서 실행 가능 | 에디터 모드에서도 Update |
HideInInspector | public 필드 -> 인스펙터에서 감추기 | 불필요한 Inspector 수정 방지 |
Serializable | 클래스, 구조체 직렬화 | 클래스, 구조체 Inspector 수정 가능 |
SerializeField | private 필드 -> 인스펙터 수정 가능 | 외부 스크립트 접근 방지 가능 |
Header | 인스펙터 카테고리 분류 | Inspector 가독성 높임 |
Space | 인스펙터 멤버 사이 간격 | Insepctor 가독성 높임 |
Range | 인스펙터 필드 셋팅 범위 | Insepctor 편의성 높임 |
Tooltip | 인스펙터에 부가적인 설명 가능 | Insepctor 가독성 높임 |
앞서 소개한 몇 가지 Attribute 들은 모두 실제로
내가 프로젝트를 진행하면서 자주 사용한
어트리뷰트 리스트라고 할 수 있다.
사용 예시
1. CreateAssetMenu
using UnityEngine;
[CreateAssetMenu(fileName = "TEST", menuName = "CreateMenu/TEST", order = int.MaxValue)]
public class CreateAssetMenuTest : ScriptableObject
{
}
스크립트는 위 방식으로 작성하면 된다 fileName은 생성 시 표시되는 파일의 이름,
menuName은 생성할 경로 이름 (Asset->Create->CreateMenu->TEST),
마지막으로 order는 생성할 경로의 위치를 뜻한다 (int.Max -> 맨 아래)
2. ContextMenu
public class ContextMenuTest : MonoBehaviour
{
[ContextMenu("PrintHello")]
private void PrintHello()
{
print("Hello");
}
}
선언한 멤버 함수 위에 ContextMenu 어트리뷰트를 추가해준다
소괄호 안에는 에디터에서 표시할 이름을 적으면 된다.
3. RequireComponent
using UnityEngine;
[RequireComponent(typeof(Rigidbody2D))]
[RequireComponent(typeof(BoxCollider2D))]
public class RequireComponentTest : MonoBehaviour
{
}
MonoBehavior을 상속받는 제어할 클래스 위에
[RequireComponent(typeof(컴포넌트 이름))] 형식을 작성하면
해당 컴포넌트는 스크립트가 부착된 게임 오브젝트에
무조건적으로 생성되게 된다
스크립트를 게임 오브젝트에 부착하는 순간
해당되는 컴포넌트가 없으면 기본 값을 가지는
컴포넌트를 생성하고 이미 해당하는 컴포넌트를
가지고 있다면 넘어가게 되니 설정한 값들이
초기화되는 염려는 하지 않아도 된다.
참고로 이렇게 해당하는 컴포넌트를 강제로 제거하려 하면
이런 식으로 경고 창이 뜨고 제거가 무시된다 따라서
제거하고자 한다면 스크립트를 수정하거나
스크립트 컴포넌트를 먼저 제거한 뒤 해당하는
컴포넌트를 제거하면 된다.
4. ExecuteInEditMode
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[ExecuteInEditMode]
public class ExecuteEditModeTest : MonoBehaviour
{
public float cubeSize = 1.0f;
void Update()
{
transform.localScale = Vector2.one * cubeSize;
}
}
해당되는 클래스 위에 [ExecuteInEditMode] 형식을 작성하면 된다
자세히 보면 플레이를 하지 않은 상태인걸 확인할 수 있다
이렇게 인스펙터 창에 있는 값을 변경하면 에디터 모드에서도
Update함수가 잘 동작하는 것을 확인할 수 있다.
5. HideInInspector
using UnityEngine;
public class HideInInspectorTest : MonoBehaviour
{
public float value00 = 5.0f;
[HideInInspector] public float value01 = 5.0f;
}
위 스크립트에서 볼 수 있듯이 자료형 float의 필드 2개가
있는 것을 확인할 수 있다. 둘 다 public 접근제어 지시자를
사용하고 있고, 한 가지 다른 점은 value01 필드 앞에 보면
[HideInInspector] 형식의 어트리뷰트가 작성된 것을 볼 수 있다
이름에서도 알 수 있듯이 public 필드를 인스펙터에서
안 보이도록 할 수 있는 기능을 제공한다.
6. Serializable
using UnityEngine;
public class SerializableTest : MonoBehaviour
{
[System.Serializable]
public class Info
{
public string name = "";
public int age = 0;
}
public Info info;
}
Custom Class 위에 System 네임스페이스 내부에 있는 Serializable를
어트리뷰트 형식으로 작성한 뒤 해당 클래스를 public 필드 변수로
생성해 주면 인스펙터에서 구조체나 클래스 등의 값을
아래 사진처럼 변경할 수 있다.
7. SerializeField
using UnityEngine;
public class SerializeFieldTest : MonoBehaviour
{
private float value00 = 5.0f;
[SerializeField] private float value01 = 5.0f;
}
HideInInspector와 반대 개념이라고 생각하면 된다
private으로 선언된 필드를 직렬화하여 인스펙터에서
작성 및 저장할 수 있게 해주는 기능이다
인스펙터 창에서 수정하기 위해 public으로 필드를
작성하면 외부 스크립트에서 접근이 가능하여
잘못 접근하게 되면 의도치 않은 오류를 발생하게
되어 되도록 인스펙터에서 수정하고자 한다면
SerializeField를 이용하면 된다
이렇게 하면 은닉성도 지키면서
인스펙터에서 수정도 할 수 있다.
8. Header, Space, Range, Tooltip
using UnityEngine;
public class Test : MonoBehaviour
{
[Header("PlayerInfo")]
[SerializeField] private string p_name = "";
[SerializeField] private float p_jumpForce = 10.0f;
[Header("EnemyInfo")]
[Space(50)]
[SerializeField] private string e_name = "";
[SerializeField] [Range(0.0f, 10.0f)] private float e_jumpForce = 10.0f;
[Tooltip("플레이어의 이미지")]
[SerializeField] private SpriteRenderer playerSpr2D;
}
이 기능들은 인스펙터의 가독성을 위해 존재한다
코드와 아래의 사진을 비교해보며 어떻게 변하는지
확인해보자 Tooltip 같은 경우 마우스 포인터를
해당되는 필드 위에 올리고 있으면 나오게 된다.
글을 마치며
이 외에도 PropertyDrawer와 같은 복잡한 기능들이 많이 있으며
여태까지 소개한 것은 그나마 작업하면서 유용하게 써왔던 것을
정리해본 것이니 더 많은 기능을 알아보고 싶다면
아래 사이트를 참고해주었으면 한다.
레퍼런스 사이트
https://docs.unity3d.com/kr/2019.4/Manual/Attributes.html
속성 - Unity 매뉴얼
Attributes 는 스크립트에서 클래스, 프로퍼티 또는 함수 위에 명시하여 특별한 동작을 나타낼 수 있는 마커입니다. 예를 들어, 프로퍼티 선언 위에 HideInInspector 속성을 추가하여 인스펙터가 공용
docs.unity3d.com
https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/attributes/
Attributes (C#)
Learn how to use attributes to associate metadata or declarative information with code in C#. An attribute can be queried at run time by using reflection.
docs.microsoft.com
'Unity > 지식' 카테고리의 다른 글
[Unity] 좌표계 에 대해 알아보자 (0) | 2022.01.13 |
---|---|
[Unity] 메인 루틴과 서브루틴, 코루틴(Co-routine) 에 대해 알아보자 (0) | 2022.01.11 |
[Unity] 쿼터니언과 짐벌락 현상에 대해 알아보자 (0) | 2022.01.05 |
[Unity] 라이프 사이클(Life Cycle) 에 대해 알아보자 (0) | 2021.12.20 |
[Unity] Delta Time 에 대해 알아보자 (0) | 2021.12.19 |