Unity

[Unity][개념] 유니티 프로퍼티 (인스펙터 정리) PropertyAttribute

usingsystem 2022. 8. 22. 17:41
728x90

유니티 최대 장점중 하나는 스크립트를 통해서 유니티 자체를 확장해 나갈 수 있다는 것입니다.

에셋 스토어(Asset Store)에서 판매되고 있는 유용한 유틸리티들도

바로 이 속성(Attribute)들을 잘 활용해서 사용자가 편리하게 사용할 수 있도록 도와주고 있습니다.

개인 프로젝트를 진행함에 있어서도 인스펙터에서의 작업이 편리해질 수 있다면

이를 사용하지 않을 이유는 없을 것입니다.

 

유니티는 이 속성을 지정할 수 있는 기능을 많이 있습니다.

오늘은 인스펙터에서 주로 사용되는 기능들만 소개해 드리겠습니다.

보다 자세한 내용은 아래 링크를 참고하시면 됩니다.

첨부된 파일에는 여기서 소개하는 모든 기능을 샘플로 만들어서 담아두었습니다.

그리고 바로 사용하실 수 있도록 소스코드를 통해서 소개해 드리겠습니다.

 

Unity Attributes

 

속성은 유니티 버전에 따라서 지원하는 내용에 차이가 있습니다.

혹시나 작동은 안하는 기능이 있다면 버전을 확인해 보시기 바랍니다.

여기서 소개하는 기능들은 최신 버전인 5.3을 기준으로 작성되었으니 참고하시기 바랍니다.

 

 

1. AddComponentMenu

 



이름 그대로 AddComponent 메뉴에 해당 스크립트를 추가해 줍니다.

그룹을 따로 지정할 수 있어서 관리가 편리합니다.

using UnityEngine;
using System.Collections;
 
[AddComponentMenu("devchanho/AddComponentMenu")]
public class AddComponentMenuTest : MonoBehaviour {
    
}

 


2. ContextMenu, ContextMenuItem



ContextMenu는 컴포넌트 옆에 있는 톱니바퀴를 눌렀을 때 나타나는 메뉴를 말합니다.

이 메뉴에 항목을 추가할 수 있습니다.



ContextMenuItem은 컴포넌트에 추가되어 있는 멤버 변수에서 마우스 오른쪽 버튼을 누르면

나타나는 메뉴를 말합니다.

멤버 변수별로 기능을 만들어줄 때 유용합니다.

using UnityEngine;
using System.Collections;
 
public class ContextMenuTest : MonoBehaviour {
    
    [ContextMenu("Do Something")]
    void DoSomething()
    {
        Debug.Log("Do Something");
    }
 
    [ContextMenuItem("String Reset", "StringReset")]
    public string test_string = "";
    void StringReset()
    {
        test_string = "";
    }
}



3. ExecuteInEditMode

 



ExecuteInEditMode로 지정된 스크립트는 EditMode. 즉, 실행 상태가 아닌

편집 상태에서도 동작을 하게됩니다.

예제에서는 스케일 값을 Update 메소드에서 갱신시켜 주고 있는데

EditMode에서도 값을 변경하면 적용되는 것을 확인할 수 있습니다.

using UnityEngine;
using System.Collections;
 
[ExecuteInEditMode]
public class ExecuteInEditModeTest : MonoBehaviour {
 
    public float scale = 1.0f;
 
    void Update () {
        Debug.Log("ExecuteInEditMode");
 
        this.transform.localScale = new Vector3(scale, scale, scale);
    }
}
 

 


4. Head Attribute



멤버 변수위에 구분을 위한 주제를 달아줄 수 있습니다.

문자열이기 때문에 얼마든지 원하시는대로 적용해줄 수 있습니다.

using UnityEngine;
using System.Collections;
 
public class HeadAttrinuteTest : MonoBehaviour {
 
    [Header("- Health Point")]
    public int max_hp;
    public int current_hp;
    
    [Header("- Magic Point")]
    public int max_mp;
    public int current_mp;
}
 



5. HideInInspector



public으로 지정된 변수라고 할지라도 인스펙터에 표시되지 않도록 해줍니다.

하지만 이미 인스펙터에서 값이 설정되었다면 그 값이 유지됩니다.

using UnityEngine;
using System.Collections;
 
public class HideInInspectorTest : MonoBehaviour {
 
    public int visible_value = 0;
 
    [HideInInspector]
    public int hide_value = 0;
}
 



6. Multiline Attribute



장문의 문자열, 특히 줄 수가 많은 문자열을 작성하는데 유용한 속성입니다.

줄 수는 얼마든지 변경할 수 있습니다.

using UnityEngine;
using System.Collections;
 
public class MultilineAttributeTest : MonoBehaviour {
 
    [Multiline(3)]
    public string test_string = "";
}
 



7. Range Attribute



인스펙터에서 변수 값을 변경할 때 값을 직접 입력하는 방식이 아닌

슬라이드 바를 이용해서 변결할 수 있도록 도와줍니다.

슬라이드 바를 이용할 경우 범위도 제한할 수 있기 때문에 꽤나 유용합니다.

 

using UnityEngine;
using System.Collections;
 
public class RangeAttributeTest : MonoBehaviour {
 
    [Range(0, 10)]
    public int range_value_int = 0;
    [Range(0.0f, 10.0f)]
    public float range_value_float = 0;
}​



8. RequireComponent



지정된 컴포넌트를 강제로 추가해 줍니다.

이렇게 추가된 컴포넌트는 호출한 컴포넌트가 제거되기 전까진 제거할 수 없습니다.

using UnityEngine;
using System.Collections;
 
[RequireComponent(typeof(Rigidbody))]
public class RequireComponentTest : MonoBehaviour {
 
    // Use this for initialization
    void Start () {
    
    }
    
    // Update is called once per frame
    void Update () {
    
    }
}
 

 

 

9. SerializeField



private으로 지정된 변수들을 인스펙터에 표시해 줍니다.

스크립트 내부에서는 클래스들의 접근권한이 보호되는 것이 좋기 때문에

개인적으로 private으로 변수들을 선언하고 SerializeField를 적용하는 편입니다.

using UnityEngine;
using System.Collections;
 
public class SerializeFieldTest : MonoBehaviour {
 
    [SerializeField]
    private int private_value = 0;
 
    [SerializeField]
    protected int protected_value = 0;
}
 



10. Space Attribute

 



변수들 간의 간격을 조절해서 보기좋게 배치할 수 있습니다. 

using UnityEngine;
using System.Collections;
 
public class SpaceAttributeTest : MonoBehaviour {
 
    public int max_hp;
    public int current_hp;
 
    [Space(20)]
    public int max_mp;
    public int current_mp;
}
 



11. Text Area



Multiline과 비슷한 속성입니다.

장문의 텍스트를 작성할 수 있는 공간을 마련해 줍니다.

인자로 최소크기와 최대크기가 전달됩니다.

using UnityEngine;
using System.Collections;
 
public class TextAreaAttributeTest : MonoBehaviour {
 
    [TextArea(3, 10)]
    publi
 



12. Tooltip Attribute



변수에 마우스 커서를 올렸을 때 표시되는 팁을 직접 작성해줄 수 있습니다.

에셋 패키지를 만들거나할 때 유용하게 사용할 수 있습니다.

using UnityEngine;
using System.Collections;
 
public class TooltipAttributeTest : MonoBehaviour {
 
    [Tooltip("Tooltip Attribute Test")]
    public int value = 0;
}
 



13. System.Serializable



기본적으로 인스펙터에는 구조체나 클래스를 표시할 수 없습니다.

하지만 System.Serializable을 설정하면 구조체 또는 클래스 별로 편집이 가능합니다.

using UnityEngine;
using System.Collections;
 
public class SystemSerializableTest : MonoBehaviour {
 
    [System.Serializable]
    public struct HpPack
    {
        public int max_hp;
        public int current_hp;
    }
 
    [System.Serializable]
    public class MpPack
    {
        public int max_mp;
        public int current_mp;
    }
 
    public HpPack hp_pack = new HpPack();
    public MpPack mp_pack = new MpPack();
}



14. System.Nonserialized

 

 

System.Nonserialized는 HideInInspector 처럼 public으로 선언된 변수들을

인스펙터에서 숨겨주는 역활을 합니다.

다만 HideInInspector와는 달리 이전에 인스펙터에서 값을 수정했다고 하더라도

값을 유지하지 않고 스크립트에서 설정한 초기값이 적용됩니다.

using UnityEngine;
using System.Collections;
 
public class SystemNonSerializedTest : MonoBehaviour {
 
    public int visible_value = 0;
 
    [System.NonSerialized]
    public int hide_value = 5;
}

이 외에도 PropertyDrawer와 같은 조금 복잡한 기능들도 있습니다.

자세한 내용은 아래 링크를 참고하시면 됩니다.

 

1.[ConTextMenu("표기 이름")]

인스펙터창에서 함수를 실행할 수 있게 만들어줌

사용 법 : 실행 원하는 함수위에 쓰고 ("표기 이름")

[ContextMenu("ContextMenuTest")]
void ContextMenuTest()
{
    Debug.Log("ContextMenuTest실행");
}

 

2.[ConTextMenuItem("표기 이름", "실행시킬 함수")]

인스펙터 상에서 변수에서 등록된 함수 실행

사용 법 : 변수 위에 쓰고 ("표기 이름", "실행 함수") 

    [ContextMenuItem("랜덤 숫자 입력", "RandomNum")]
    public int Num;

    void RandomNum()
    {
        Num = Random.Range(0, 100);
    }
 
 

3.[Header("표기 이름")]

보기 편하게 변수위에 어떤 변수인지 표시를 나타낼 수 있음

사용 법 : public 변수 위에 쓰고 ("표기 이름") 

    [Header("테스트 변수")]
    public int TestNum;
    public string TestName;

    [Header("실제 변수")]
    public int Num;
    public int String;
 
 

4.[Space((int)간격 수)]

인스펙터 변수들을 원하는 간격만큼 띄울 수 있음

사용 법 : 변수 사이에 쓰고 원하는 간격 크기만큼 숫자 입력

 public int Num;
    public float Float;
    [Space(30)]

    public string Name;
 

 

4.[SerializeField]

private 변수도 인스펙터 상에서 보일 수 있게해줌

사용 법 : 원하는 변수 위에 쓰기(밑에 변수 하나만 보여짐)

    [SerializeField]
    private int HideNum;

 

5.[Serializable]

클래스나 구조체를 직렬화해서 인스펙터 상에서 보여지게 만들어 줌

-Joson화 하기위해서 자주 씀

사용 법 : MonoBegaviour 상속받지 않은 클래스 위에 쓰기

public class AttributeMng : MonoBehaviour
{
    public Unit TestUnit;
}

[System.Serializable]
public class Unit
{
    public int     Level;
    public string  Name;
}
 

 

6.[HideInInspector]

public 변수를 인스펙터 상에서 보이지 않게 숨김

사용법 : 원하는 변수 위에 쓰기

 [HideInInspector]
    public int publicNum;
 

 

7.[DisallowMultipleComponent]

한 게임오브젝트에 스크립트가 두개 이상 중복되지 않게 만듬

사용 법 : 클래스 위에 쓰기

[DisallowMultipleComponent]
public class AttributeMng : MonoBehaviour
{

}

 

8.[DisallowMultipleComponent(type of (추가 컴포넌트))]

게임 오브젝트에 스크립트 추가시 지정해 둔 컴포넌트 자동으로 같이 추가됌

사용 법 : 클래스 위에 쓰고 (type of(추가 컴포넌트 쓰기))

[RequireComponent(typeof(Rigidbody))]
public class AttributeMng : MonoBehaviour
{

}
 

https://shhouse.tistory.com/7?category=452932

728x90