고현우
개발 일지
고현우
전체 방문자
오늘
어제
  • 분류 전체보기 (14)
    • Unity (7)
      • 작업 (1)
      • 지식 (6)
    • DirectX (0)
      • 작업 (0)
      • 지식 (0)
    • C# (3)
      • 디자인 패턴 (0)
      • 알고리즘 (1)
      • 자료구조 (0)
      • 지식 (2)
    • C++ (0)
      • 디자인 패턴 (0)
      • 알고리즘 (0)
      • 자료구조 (0)
      • 지식 (0)
    • 필수 지식 (4)
      • 물리 (0)
      • 선형대수학 (0)
      • 셰이더 (3)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • Unity
  • .NET
  • 버텍스 셰이더
  • 로컬좌표
  • VertexShader
  • 비동기
  • 렌더링파이프라인
  • Shader
  • 래스터라이저
  • 월드좌표
  • 메모리 계층
  • Z-Up
  • 셰이더
  • Y-Up
  • 선형 탐색 알고리즘
  • 스크린좌표
  • RenderingPipeline
  • 그래픽스API
  • 프래그먼트셰이더
  • 뷰포트좌표

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
고현우

개발 일지

[Unity] Attribute 에 대해 알아보자
Unity/지식

[Unity] Attribute 에 대해 알아보자

2021. 12. 21. 13:42

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
    'Unity/지식' 카테고리의 다른 글
    • [Unity] 메인 루틴과 서브루틴, 코루틴(Co-routine) 에 대해 알아보자
    • [Unity] 쿼터니언과 짐벌락 현상에 대해 알아보자
    • [Unity] 라이프 사이클(Life Cycle) 에 대해 알아보자
    • [Unity] Delta Time 에 대해 알아보자
    고현우
    고현우
    Unity / DirectX 게임 개발

    티스토리툴바