Unity/Programming

Unity EditorWindow SerializedProperty 활용 예제

CatDarkGame 2024. 12. 17. 20:31
반응형

 

용도

Editor 툴 개발 시, 별도의 EditorWindow를 띄워 툴 조작이 필요한 경우 SerializedProperty 객체를 참조하는 방식으로 구현.

 

 

 

EditorWindow

using UnityEditor;
using UnityEngine;

public class CustomGradientEditorWindow : EditorWindow
{
    public static void Open(SerializedProperty property, Object target)
    {
        CustomGradientEditorWindow window = CreateInstance<CustomGradientEditorWindow>();
        window.titleContent = new GUIContent("CustomGradientEditorWindow");
        window.gradientProperty = property;
        window.targetObject = target;
        
        window.ShowUtility();
    }
    
    private SerializedProperty gradientProperty; 
    private Object targetObject; 

    private void OnGUI()
    {
        if (gradientProperty == null || targetObject == null) return;
        
        EditorGUI.BeginChangeCheck();
        Gradient gradient = gradientProperty.gradientValue;
        gradient = EditorGUILayout.GradientField(gradient);

        if (EditorGUI.EndChangeCheck())
        {
            Undo.RecordObject(targetObject, "Edit Gradient");
            gradientProperty.gradientValue = gradient;
            
            gradientProperty.serializedObject.ApplyModifiedProperties();
            EditorUtility.SetDirty(targetObject);
        }
        
        if (Event.current.keyCode == KeyCode.Escape) 
        {
            Close();
        }
    }
    
    // 다른 Window 클릭 이벤트
    private void OnLostFocus()
    {
        // Close();
    }
}

 

CustomEditor - Monobehaviour

using System;
using UnityEditor;
using UnityEngine;

[CustomEditor(typeof(GradientObjectSample))]
public class GradientObject_Editor : Editor
{
    private SerializedProperty gradientProperty;
    private void OnEnable()
    {
        gradientProperty = serializedObject.FindProperty("gradient");
    }

    public override void OnInspectorGUI()
    {
        EditorGUILayout.PropertyField(gradientProperty);

        if (GUILayout.Button("Custom Editor"))
        {
            CustomGradientEditorWindow.Open(gradientProperty, target);
        }
    }
}

public class GradientObjectSample : MonoBehaviour
{
    [SerializeField] private Gradient gradient;
    
}

 

 

 

반응형