-
프로퍼티 드로어
스크립트에서 속성을 사용하거나 Serializable 클래스가 인스펙터 창에 표시되도록 하기위해 사용한다.
가령 아래의 스크립트를 오브젝트에 넣은 경우 인스펙터 창은 다음과 같다.
Recipe.cs
using System; using UnityEngine; public enum IngredientUnit { Spoon, Cup, Bowl, Piece } // Custom serializable class [Serializable] public class Ingredient { public string name; public int amount = 1; public IngredientUnit unit; } public class Recipe : MonoBehaviour { public Ingredient potionResult; public Ingredient[] potionIngredients; }
이때, 새로운 스크립트로 프로퍼티 드로워를 작성 후 확인하면 다음과 같은 결과를 얻을 수 있다.
using UnityEditor; using UnityEngine; // IngredientDrawer [CustomPropertyDrawer(typeof(Ingredient))] public class IngredientDrawer : PropertyDrawer { // Draw the property inside the given rect public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) { // Using BeginProperty / EndProperty on the parent property means that // prefab override logic works on the entire property. EditorGUI.BeginProperty(position, label, property); // Draw label position = EditorGUI.PrefixLabel(position, GUIUtility.GetControlID(FocusType.Passive), label); // Don't make child fields be indented var indent = EditorGUI.indentLevel; EditorGUI.indentLevel = 0; // Calculate rects var amountRect = new Rect(position.x, position.y, 30, position.height); var unitRect = new Rect(position.x + 35, position.y, 50, position.height); var nameRect = new Rect(position.x + 90, position.y, position.width - 90, position.height); // Draw fields - passs GUIContent.none to each so they are drawn without labels EditorGUI.PropertyField(amountRect, property.FindPropertyRelative("amount"), GUIContent.none); EditorGUI.PropertyField(unitRect, property.FindPropertyRelative("unit"), GUIContent.none); EditorGUI.PropertyField(nameRect, property.FindPropertyRelative("name"), GUIContent.none); // Set indent back to what it was EditorGUI.indentLevel = indent; EditorGUI.EndProperty(); } }