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;
}
반응형