★ 8. Unity Editor 확장 입문 - [2] 표준에서 사용할 수 있는 에디터 확장 기능
[2] 표준에서 사용할 수 있는 에디터 확장 기능
2.1 인스펙터 창의 외관 변경
(1) Range
[ 좌측 : Range 사용 X, 우측 : Range 사용 O ]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | using UnityEngine; using System.Collections; public class NewBehaviourScript : MonoBehaviour { [Range(1, 10)] public int num1; [Range(1, 10)] public float num2; [Range(1, 10)] public long num3; [Range(1, 10)] public double num4; } | cs |
(2) Multiline / TextArea
기본적으로 1줄의 TextField이지만 여러 줄의 TextArea로 변경할 수 있습니다.
Multiline도 TextArea랑 별 차이가 없는데, Multiline은 폭에 맞춰 자동적으로 줄바꿈되지 않고
스크롤 바를 표시하지 않습니다. 특별한 이유가 없다면 TextArea를 사용하는 것을 추천합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 | using UnityEngine; using System.Collections; public class NewBehaviourScript : MonoBehaviour { public string defaultString; [Multiline(5)] public string multiline; [TextArea(3,5)] public string textArea; } | cs |
2.2 인스펙터에서 다루는 기능을 추가
(1) ContextMenuItem
인스펙터에 표시되어 있는 변수에 콘텍스트 메뉴를 추가합니다. 다른 변수들도 일제히 수치를 변경하지 않으면 안되거나, 순서가 필요한 요소를 자동화하는 용도로 사용하면 좋을 것 같습니다.
컴포넌트 단위로 수치를 리셋시키는 Reset 기능은 있지만 각 변수에 대한 리셋 기능은 없으므로 이 것으로 추가하면 됩니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | using UnityEngine; using System.Collections; public class NewBehaviourScript : MonoBehaviour { [ContextMenuItem("Random", "RandomNumber")] [ContextMenuItem("Reset", "ResetNumber")] public int number; void RandomNumber() { number = Random.Range(0, 100); } void ResetNumber() { number = 0; } } | cs |
(2) ColorUsage
색의 변경을 위한 컬러 픽커를 사용합니다.
알파 값 사용/미사용, HDR용 등으로 설정합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 | using UnityEngine; using System.Collections; public class NewBehaviourScript : MonoBehaviour { public Color color1; [ColorUsage(false)] public Color color2; [ColorUsage(true, true, 0, 8, 0.125f, 3)] public Color color3; } | cs |
2.3 인스펙터의 외관 정리
프로퍼티에 직접 작용하지는 않지만, 외관 정리용으로 사용하는 것이 있습니다.
(1) Header
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | using UnityEngine; using System; public class NewBehaviourScript : MonoBehaviour { [Header("Player Settings")] public Player player; [Serializable] public class Player { public string name; [Range(1, 100)] public int hp; } [Header("Game Settings")] public Color background; } | cs |
(2) Space
말 그대로 공백입니다. 줄을 띄울 때 사용합니다.
1 2 3 4 5 6 7 8 9 10 | using UnityEngine; public class NewBehaviourScript : MonoBehaviour { [Space(16)] public string str1; [Space(48)] public string str2; } | cs |
(3) Tooltip
프로퍼티에 대한 설명을 인스펙터상에서 확인하게 만들고 싶을 때 사용합니다.
1 2 3 4 5 6 7 | using UnityEngine; public class NewBehaviourScript : MonoBehaviour { [Tooltip("툴 팁 입 니 다.")] public long tooltip; } | cs |
(4) HideInInspector
본래 public인 변수는 인스턴스에 표시되지만 HideInInspector를 사용하면 표시되지 않습니다.
1 2 3 4 5 6 7 8 9 10 11 | using UnityEngine; public class NewBehaviourScript : MonoBehaviour { public string str111; [HideInInspector] public string str222; public string str333; } | cs |
2.4 인스펙터를 더 편리하게
(1) RequireComponent
[특정 컴포넌트가 최소 1개는 Attach되어 있어야 한다]고 하는 제약을 거는 속성입니다.
Animator와 관련된 스크립트를 작성할 때, Animator 컴포넌트가 붙어 있어야 한다고 제약을 걸 수 있습니다. RequireComponent가 사용된 스크립트를 Attach하면 자동으로 RequireComponent로 지정한 컴포넌트도 Attach되게 하고 이미 Attach가 되어 있으면 아무것도 하지 않습니다. 그리고 지정된 컴포넌트를 삭제하려면 하지 못한다고 표시합니다.
1 2 3 4 5 6 7 8 9 10 11 12 | using UnityEngine; [RequireComponent(typeof(Animator))] public class NewBehaviourScript : MonoBehaviour { Animator animator; void Awake() { animator = GetComponent<Animator>(); } } | cs |
(2) DisallowMultipleComponent
하나의 게임 오브젝트에 같은 컴포넌트를 여러개 Attach 하는 것을 금지하는 속성입니다.
2개 이상 같은 컴포넌트를 넣고 게임을 실행하면 못한다고 표시하며 이 속성이 설정된 클래스를 상속한 클래스에도 이 속성이 똑같이 적용됩니다.
1 2 3 4 5 6 | using UnityEngine; public class NewBehaviourScript : Base { } | cs |
1 2 3 4 5 6 7 | using UnityEngine; [DisallowMultipleComponent] public class Base : MonoBehaviour { } | cs |
(3) FormerlySerializedAs
변수명을 변경했을 때에 새로운 변수명에 데이터를 이동시키기 위한 속성입니다. 인스펙터에 표시되듯이, Serialized된 데이터는 변수명을 경로로써 보존합니다. 이런 상태에서 변수명을 바꾸면 변수의 데이터는 초기화됩니다. 그래서 이런 문제를 회피하기 위한 속성입니다.
(using UnityEngine.Serialization; 을 추가해야합니다.)
1 2 3 4 5 6 7 8 9 | using UnityEngine; using UnityEngine.Serialization; public class NewBehaviourScript : MonoBehaviour { [SerializeField] [FormerlySerializedAs("hoge")] string fuga; } | cs |
1 2 3 4 5 6 7 | using UnityEngine; [AddComponentMenu("MyUI/Tween color")] public class NewBehaviourScript : MonoBehaviour { } | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | using UnityEngine; [ExecuteInEditMode] public class NewBehaviourScript : MonoBehaviour { [Range(0, 10)] public int number; void Awake() { Debug.Log("Awake"); } void Start() { Debug.Log("Start"); } void Update() { Debug.Log("Update"); } } | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | using UnityEngine; public class NewBehaviourScript : MonoBehaviour { [Range(0, 10)] public int number; [ContextMenu ("RandomNumber")] void RandomNumber() { number = Random.Range(0, 100); } [ContextMenu ("ResetNumber")] void ResetNumber() { number = 0; } } | cs |
Unity Editor 확장에 사용될 폴더에 대해서 알아보았습니다.
다음 강좌에서는 표준 에디터 확장 기능에 대해서 알아보겠습니다.