using UnityEditor; using UnityEngine; using UnityEngine.UI; using VketCloudGUITools.Runtime; namespace VketCloudGUITools.Editor { [CustomEditor(typeof(VCSlider))] public class VCSliderInspector : UnityEditor.Editor { private const string PREFS_KEY_HEADER = "VCGUISliderInspector_"; private const string EMULATE_ON_SLIDER_CHANGED_IN_INSPECTOR_KEY = PREFS_KEY_HEADER + "EmulateOnSliderChangedInInspector"; private VCStateToggleReordableList _toggleReordableList = new VCStateToggleReordableList(); private SerializedProperty _unityBaseImageProperty; private SerializedProperty _unityFrontImageProperty; private SerializedProperty _unityHandleImageProperty; private SerializedProperty _offHandleSpriteProperty; private SerializedProperty _driveFieldProperty; private SerializedProperty _toggleListProperty; private SerializedProperty _sliderEnableProperty; private bool _emulateOnSliderChangedInInspector = false; protected void OnEnable() { _unityBaseImageProperty = serializedObject.FindProperty("unityBaseImage"); _unityFrontImageProperty = serializedObject.FindProperty("unityFrontImage"); _unityHandleImageProperty = serializedObject.FindProperty("unityHandleImage"); _offHandleSpriteProperty = serializedObject.FindProperty("OffHandleSprite"); _driveFieldProperty = serializedObject.FindProperty("DriveField"); _toggleListProperty = serializedObject.FindProperty("_toggleList"); _sliderEnableProperty = serializedObject.FindProperty("_sliderEnable"); _emulateOnSliderChangedInInspector = EditorPrefs.GetBool(EMULATE_ON_SLIDER_CHANGED_IN_INSPECTOR_KEY); } protected void OnDisable() { EditorPrefs.SetBool(EMULATE_ON_SLIDER_CHANGED_IN_INSPECTOR_KEY, _emulateOnSliderChangedInInspector); } static Selectable.Transition GetTransition(SerializedProperty transition) { return (Selectable.Transition)transition.enumValueIndex; } public override void OnInspectorGUI() { var slider = (target as Runtime.VCSlider); DrawPropertyScript(); serializedObject.Update(); EditorGUILayout.Space(); // Spriteパーツ参照 EditorGUILayout.PropertyField(_unityBaseImageProperty, new GUIContent("Base Image")); EditorGUILayout.PropertyField(_unityFrontImageProperty, new GUIContent("Front Image")); EditorGUILayout.PropertyField(_unityHandleImageProperty, new GUIContent("Handle Image")); EditorGUILayout.Space(); // Sprite直接指定 if (slider.unityBaseImage != null) { EditorGUI.BeginChangeCheck(); var newBaseImageSprite = (Sprite)EditorGUILayout.ObjectField("Base Sprite", slider.BaseSprite, typeof(Sprite), allowSceneObjects: true, GUILayout.Height(EditorGUIUtility.singleLineHeight)); if (EditorGUI.EndChangeCheck() || slider.BaseSprite != newBaseImageSprite) { Undo.RecordObject(slider.unityBaseImage, "Base Image"); slider.BaseSprite = newBaseImageSprite; } } else { EditorGUILayout.LabelField("Base Sprite", "(Missing Base Image)"); } if (slider.unityFrontImage != null) { EditorGUI.BeginChangeCheck(); var newFrontImageSprite = (Sprite)EditorGUILayout.ObjectField("Front Sprite", slider.FrontSprite, typeof(Sprite), allowSceneObjects: true, GUILayout.Height(EditorGUIUtility.singleLineHeight)); if (EditorGUI.EndChangeCheck() || slider.FrontSprite != newFrontImageSprite) { Undo.RecordObject(slider.unityFrontImage, "Front Image"); slider.FrontSprite = newFrontImageSprite; } } else { EditorGUILayout.LabelField("Front Sprite", "(Missing Front Image)"); } if (slider.unityHandleImage != null) { EditorGUI.BeginChangeCheck(); var newOnImageSprite = (Sprite)EditorGUILayout.ObjectField("On Handle Sprite", slider.OnHandleSprite, typeof(Sprite), allowSceneObjects: true, GUILayout.Height(EditorGUIUtility.singleLineHeight)); if (EditorGUI.EndChangeCheck() || slider.OnHandleSprite != newOnImageSprite) { Undo.RecordObject(slider.unityHandleImage, "Handle Image"); slider.OnHandleSprite = newOnImageSprite; } } else { EditorGUILayout.LabelField("On Handle Sprite", "(Missing Handle Image)"); } EditorGUILayout.PropertyField(_offHandleSpriteProperty, new GUIContent("Off Handle Sprite")); EditorGUILayout.Space(); DrawPropertyDriveField(); EditorGUILayout.Space(); EditorGUI.BeginChangeCheck(); _toggleReordableList.OnInspectorGUI(serializedObject, _toggleListProperty); if (EditorGUI.EndChangeCheck()) { EditorApplication.delayCall += () => { slider.UpdateVisible(); }; } EditorGUILayout.Space(); EditorGUI.BeginChangeCheck(); EditorGUILayout.PropertyField(_sliderEnableProperty); if (EditorGUI.EndChangeCheck()) { EditorApplication.delayCall += () => { slider.OnVisualStateChanged(); }; } EditorGUILayout.Space(); EditorGUILayout.BeginVertical(GUI.skin.box); { EditorGUI.BeginDisabledGroup(!Application.isPlaying); if (_emulateOnSliderChangedInInspector) { slider.Value = EditorGUILayout.Slider("Value", slider.Value, 0f, 1f); if (!Application.isPlaying) { EditorGUILayout.HelpBox("[Value] is Runtime Only.\nWorks with OnSliderValueChanged event.\nSlider component's Value slider is not invoke event.", MessageType.Info); } } EditorGUI.EndDisabledGroup(); } EditorGUILayout.EndVertical(); EditorGUILayout.Space(); DrawPropertyShow(); DrawPropertyPos(); DrawPropertySize(); DrawPropertyZ(); serializedObject.ApplyModifiedProperties(); } public void DrawPropertyScript() { var itemBehaviour = target as VCSlider; var propScript = serializedObject.FindProperty("m_Script"); EditorGUI.BeginDisabledGroup(true); var newShow = EditorGUILayout.PropertyField(propScript); EditorGUI.EndDisabledGroup(); } public void DrawPropertyShow() { var itemBehaviour = target as VCSlider; EditorGUI.BeginChangeCheck(); var newShow = EditorGUILayout.Toggle(nameof(VCSlider.Show), itemBehaviour.Show); if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(itemBehaviour.gameObject, "Show"); itemBehaviour.Show = newShow; } } public void DrawPropertyPos() { var itemBehaviour = target as VCSlider; EditorGUI.BeginChangeCheck(); var newPos = EditorGUILayout.Vector2IntField(nameof(VCSlider.Pos), itemBehaviour.Pos); if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(itemBehaviour.gameObject, "Pos"); itemBehaviour.Pos = newPos; } } public void DrawPropertySize() { var itemBehaviour = target as VCSlider; EditorGUI.BeginChangeCheck(); var newSize = EditorGUILayout.Vector2IntField(nameof(VCSlider.Size), itemBehaviour.Size); if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(itemBehaviour.VcTransform, "Size"); itemBehaviour.Size = newSize; } } public void DrawPropertyZ() { var itemBehaviour = target as VCSlider; EditorGUI.BeginChangeCheck(); var newZ = EditorGUILayout.IntField(nameof(VCSlider.Z), itemBehaviour.Z); if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(itemBehaviour.VcTransform, "Z"); itemBehaviour.Z = newZ; } } public void DrawPropertyDriveField() { EditorGUILayout.PropertyField(_driveFieldProperty); } } }