ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 유니티...13
    일지 2021. 5. 12. 08:39

    커스텀 에디터

    자주 사용하는 컴포넌트에 대해 사용자가 더 편리하게 사용할 수 있도록 인스펙터를 조정해 주는 것이 커스텀 에디터이다. 이를 통해 게임 제작을 더 빠르고 효율적으로 할 수 있다.

     

    다음과 같은 스크립트는 아래의 기본적인 인스펙터를 가지게 된다.

     

    LookAtPoint.cs

    using UnityEngine;
    
    [ExecuteInEditMode]
    public class LookAtPoint : MonoBehaviour
    {
        public Vector3 lookAtPoint = Vector3.zero;
    
        public void Update()
        {
            transform.LookAt(lookAtPoint);
        }
    }

     

     

    이때, 새로운 스크립트로 커스텀 에디터를 작성하면 다음과 같이 변경해 줄 수 있다.

     

    LookAtPointEditor.cs

    using UnityEngine;
    using UnityEditor;
    
    [CustomEditor(typeof(LookAtPoint))]
    [CanEditMultipleObjects]
    public class LookAtPointEditor : Editor
    {
        SerializedProperty lookAtPoint;
    
        void OnEnable()
        {
            lookAtPoint = serializedObject.FindProperty("lookAtPoint");
        }
    
        public override void OnInspectorGUI()
        {
            serializedObject.Update();
            EditorGUILayout.PropertyField(lookAtPoint);
            serializedObject.ApplyModifiedProperties();
        }
    }

     

     

    ※ 커스텀 에디터를 만들 때는 항상 Editor를 상속받아야 하며 CustomEditor 속성으로 타겟을 지정해 줘야 한다.

     

     

    또, OnSceneGUI 함수를 통해 씬뷰에서 해당 오브젝트가 바라보는 위치를 핸들로 표시하고 핸들을 조정해 바라보는 위치를 업데이트하는 기능을 구현할 수도 있다.

     

    LookAtPointEditor.cs

    using UnityEngine;
    using UnityEditor;
    
    [CustomEditor(typeof(LookAtPoint))]
    [CanEditMultipleObjects]
    public class LookAtPointEditor : Editor
    {
        SerializedProperty lookAtPoint;
    
        void OnEnable()
        {
            lookAtPoint = serializedObject.FindProperty("lookAtPoint");
        }
    
        public override void OnInspectorGUI()
        {
            serializedObject.Update();
            EditorGUILayout.PropertyField(lookAtPoint);
            if (lookAtPoint.vector3Value.y > (target as LookAtPoint).transform.position.y)
            {
                EditorGUILayout.LabelField("(Above this object)");
            }
            if (lookAtPoint.vector3Value.y < (target as LookAtPoint).transform.position.y)
            {
                EditorGUILayout.LabelField("(Below this object)");
            }
            
                
            serializedObject.ApplyModifiedProperties();
        }
    
        public void OnSceneGUI()
        {
            var t = (target as LookAtPoint);
    
            EditorGUI.BeginChangeCheck();
            Vector3 pos = Handles.PositionHandle(t.lookAtPoint, Quaternion.identity);
            if (EditorGUI.EndChangeCheck())
            {
                Undo.RecordObject(target, "Move point");
                t.lookAtPoint = pos;
                t.Update();
            }
        }
    }

     

     

    댓글

Designed by Tistory.