컴포넌트를 내가원하는 이름으로 변경하기 유니티에셋추천

유니티 게임개발을 하면서 컴포넌트가 많아지다보면 각각의 컴포넌트가 어떤 목적으로 붙였는지 잊곤합니다. 이름들이 모두 같아서 말이죠. Collider 컴포넌트가 여러개 붙는다면 어느게 무엇을 위한 것인지 이름을 서로 다르게 지어줄 수 있다면 좋겠죠.

에셋스토어 Component Names 에셋을 사용하면 컴포넌트에 알맞은 이름으로 변경할 수 있게해줍니다.

에셋스토어 페이지보기: Component Names

기능 소개

일반적인 기능

이름변경 :
게임오브젝트에 붙이는 컴포넌트 마다 좀더 의미있는 이름으로 변경할 수 있습니다.

본래이름 함께표시(접미사) :
이름(커스텀 컴포넌트 네임)을 변경해주고도 본래이름을 함께 표시할 수 있습니다(디폴트 동작).

이벤트에 표시:
이렇게 지어준 이름은 Object 클래스 필드에서 참조할 수 있으며 UnityEvent 드랍다운에서도 볼 수 있습니다.

코드로 제어:
이름 옆에 클래스의 필드값을 표시할 수 있습니다. 이렇게하면 진행도, 현재 체력등의 상태를 컴포넌트를 펼쳐보지 않고도 쉽게 알 수 있습니다.

툴팁 표시:
컴포넌트 헤더에 마우스를 가져다대면 나오는 툴팁에서 컴포넌트에대한 짧은 설명을 볼 수 있습니다(기본컴포넌트: 영어). 커스텀 툴팁은 코딩기능 API 참고.

빌드에서 제외:
컴포넌트에 지어준 모든 이름은 프로젝트에 저장되지만, 실제 게임 빌드에서는 그런 데이터는 전혀 포함되지 않습니다.

코딩기능

  • Component.GetName: 컴포넌트 이름을 코드로 가져올 수 있어서 디버깅할때 유용할 것입니다.
  • Compopnent.SetName: OnValidate() 에서 Compopnent.SetName 을 호출하며 코드로 이름이나 커스텀 툴팁을 작성해줄 수 있으며 인스턴스의 현재상태를 포함하여 컴포넌트 이름을 지어줄 수 있습니다.
  • Component.name 및 Component.ToSting 이 커스컴 컴포넌트 이름을 반환합니다.

호환성

Powr InspectorOdin Inpector 또는 다른 커스텀 에디터와 호환됩니다.

에셋 패키지 설치방법

에셋스토어에서 구매하고나면 유니티 에디터 ‘패키지 매니저’에서 찾아볼 수 있습니다.

에셋스토어 페이지보기: Component Names

Download 하고나면 프로젝트에 Import 하는데 전체 파일 혹은 아래 파일만 임포트 하면됩니다.

그러면 아래처럼 Assets > Sisus 폴더가 생깁니다.

Component Names 에셋 사용방법

컴포넌트의 이름을 변경하려면

  • 컴포너트 헤더에 마우스우클릭해서 Rename 선택 
  • 또는
  • 컴포넌트를 선택하고 F2 버튼 

참고: 다른에셋과 단축키 충돌이 있다면 [에디터 단축키 충돌 해결하기] 글을 참고하세요.

이름형식

커스텀이름 (본래이름)
기본적으로 새로지어준 이름 뒤에는 자동으로 본래의 컴포넌트 이름이 접미사로 괄호안에 붙습니다.

기본이름 (커스텀접미사)
본래이름을 바꾸지 않고 커스텀 접미사만 추가하고 싶다면 괄호로 감싼 접미사만 입력해줍니다.

커스텀이름 (커스텀 접미사)
이름과 점미사 모두 커스텀 하고 싶다면 나의이름(나의접미사) 형태로 입력해주면 됩니다.

커스텀이름
접미사없이 이름만 변경하고 싶다면 이름뒤에 빈괄호 ()만 붙여주면 됩니다.

API: 프로그래머를 위한 코딩 기능

Assembly Definition

자신의 커스텀 클래스 코드에서 컴포넌트의 이름을 가져오거나 세팅하는 확장 메서드를 사용할 수 있으려면  ‘어셈블리 정의 (assembly definition assets)’ 를 생성하고 Sisus.ComponentNames 어셈블리(using 네임스페이스)에대한 참조를 추가해야합니다.

ComponentNames 어셈블리의 코드를 참조하려면 아래처럼 using 지시문을 작성해주고 사용하세요.

using Sisus.ComponentNames;

GetName

이름을 가져오려면 Component.GetName() 확장메서드를 사용하세요.

using Sisus.ComponentNames;

public class NamePrinter : MonoBehaviour
{
    public Component component;
    private void PrintName() => component.GetName(name);
}

에디터에서 GetName()은 컴포넌트에  커스텀 이름이 있다면 반환하고 없다면 기본이름을 반환합니다. 모든 커스텀 이름 데이터는 빌드 시엔 빠집니다. 빌드버전에서는 GenName 은 컴포넌트의 클래스 이름을 반환합니다.

Set Name

컴포넌트의 이름을 Set 하려면 확장메서드 Component.SetName(string name) 을 사용하세요.

using UnityEngine;
using Sisus.ComponentNames;

public class ProgressBar : MonoBehaviour
{
    [Range(0, 100)]
    public int progress;

#if UNITY_EDITOR
    private void OnValidate() => this.SetName($"Progress: {progress}%");
#endif

}

위 예제에서 OnValidate() 메서드가 실행할 때마다 SetName()이 호출되는데, 이것은 해당스크립트가 최초 로드될 때와 멤버의 값이 수정될 때마다 호출되는 것입니다. 이렇게하면 컴포넌트는 언제나 “Progress: X%” 라는 이름을 표시하며 여기에서 X는 progress 필드의 현재 값을 반영하게됩니다.

이런 OnValidate 에서의 SetName 패턴은 컴포넌트 상태에 기반한 다이나믹 헤더를 생성하는 편리한 방법입니다.

SetName() 메서드는 6개의 오버로드 버전이 있습니다. UNITY_EDITOR가 아닌 환경(프로덕트 빌드버전)에서의 호출은 무시됩니다.

public static void SetName([NotNull] this Component component, string name)
public static void SetName([NotNull] this Component component, string name, bool classNameSuffix)
public static void SetName([NotNull] this Component component, string name, [CanBeNull] string suffix)
public static void SetName([NotNull] this Component component, GUIContent nameAndTooltip)
public static void SetName([NotNull] this Component component, GUIContent nameAndTooltip, bool classNameSuffix)
public static void SetName([NotNull] this Component component, string name, bool classNameSuffix, string tooltip)
public static void SetName([NotNull] this Component component, string name, [CanBeNull] string suffix, string tooltip)

예를들어, 이름과 툴팁을 함께 작성해주려면 SetName() 네번째 오버로드를 사용하여 GUIContent 클래스 객체를 인자로 전달하면 됩니다.

#if UNITY_EDITOR
    private void OnValidate() => this.SetName(new GUIContent("씬촬영 스트립트","씬촬영 시작부분으로 오브젝트를 위치시키는 스크립트"));
#endif

더 자세한 내용은 각각의 메서드 문서주석을 읽어보거나 ComponentExtension.cs 파일을 열어 각 메서드 주석을 참고해주세요. 

BaseBehaviour

Component Name은 BaseBehaviour 라는 base 클래스를 제공합니다.  당신의 클래스가 MonoBehaviour 대신 이 클래스를 상속받도록 하면 커스텀 컴포넌트 이름을 다루는데 편리한 몇가지 방법이 생깁니다.

BaseBehaviour 클래스정의를 보자면, 다음과 같습니다:

public abstract class BaseBehaviour : MonoBehaviour
{
    public virtual new string name
    {
        get => this.GetName();
        set => this.SetName(value);
    }

    public override string ToString() => this.GetName();
}

코드에서 볼 수 있듯이, name 프로퍼티는 더이상 컴포넌트가 붙어있는 GameObject의 이름을 반환하지 않고 컴포넌트 자신의 이름을 반환하게 됩니다.

두번째로 ToString() 메서든 또한 디버깅이 쉽도록 컴포넌트의 이름을 반환합니다.

커스텀 base 클래스를 상속받을 수 없거나 원하지 않는다면, 당신의 base 클래스에서 위처럼 두 오버라이드를 직접 구현할 수 있겠습니다.

에셋스토어 페이지보기: Component Names

현재글 목차