ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 유니티...11
    일지 2021. 5. 10. 19:17

    프로퍼티 드로어

    스크립트에서 속성을 사용하거나 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();
        }
    }

     

     

    댓글

Designed by Tistory.