using System; using UI_Spline_Renderer; using UnityEditor; using UnityEditor.UIElements; using UnityEngine; using UnityEngine.Splines; using UnityEngine.UIElements; namespace UISplineRendererEditor { [CustomEditor(typeof(UISplineRenderer))] [CanEditMultipleObjects] public class UISplineRendererEditor : UnityEditor.Editor { UISplineRenderer _target; ObjectField _splineContainerField; ObjectField _materialField; ObjectField _textureField; Button _defaultLineTextureButton; Button _uvTestLineTextureButton; Button _customLineTextureButton; Toggle _keepZeroZField; Toggle _keepBillboardField; EnumField _uvModeField; SliderInt _resolutionSlider; Label _vertexCountField; ObjectField _startImageSpriteField; FloatField _startImageSizeField; FloatField _startImageOffsetField; Button _noneStartImageButton; Button _triangleStartImageButton; Button _arrowStartImageButton; Button _emptyCircleStartImageButton; Button _filledCircleStartImageButton; Button _customStartImageButton; ObjectField _endImageSpriteField; FloatField _endImageSizeField; FloatField _endImageOffsetField; Button _noneEndImageButton; Button _triangleEndImageButton; Button _arrowEndImageButton; Button _emptyCircleEndImageButton; Button _filledCircleEndImageButton; Button _customEndImageButton; bool _shouldUpdateStartEndImages; UISplineRendererSettings settings => UISplineRendererSettings.Instance; void OnEnable() { if (_target == null) _target = target as UISplineRenderer; Spline.Changed += SplineChangeCallback; SplineContainer.SplineAdded += SplineContainerChangeCallback; SplineContainer.SplineRemoved += SplineContainerChangeCallback; EditorApplication.update += _delayed_update_vertex_count; void _delayed_update_vertex_count() { UpdateVertexCount(); EditorApplication.update -= UpdateVertexCount; } } void OnDisable() { Spline.Changed -= SplineChangeCallback; SplineContainer.SplineAdded -= SplineContainerChangeCallback; SplineContainer.SplineRemoved -= SplineContainerChangeCallback; } public override void OnInspectorGUI() { serializedObject.Update(); EditorGUI.BeginChangeCheck(); EditorGUILayout.PropertyField(serializedObject.FindProperty("_splineContainer")); EditorGUI.indentLevel++; EditorGUILayout.PropertyField(serializedObject.FindProperty("_fitPosition")); EditorGUI.indentLevel--; EditorGUILayout.PropertyField(serializedObject.FindProperty("m_Material")); EditorGUI.indentLevel++; EditorGUILayout.PropertyField(serializedObject.FindProperty("_recursiveMaterial")); EditorGUI.indentLevel--; EditorGUILayout.PropertyField(serializedObject.FindProperty("m_Color")); EditorGUILayout.PropertyField(serializedObject.FindProperty("_colorGradient")); EditorGUI.indentLevel++; EditorGUILayout.PropertyField(serializedObject.FindProperty("_recursiveColor")); EditorGUI.indentLevel--; EditorGUILayout.PropertyField(serializedObject.FindProperty("m_RaycastTarget")); EditorGUI.indentLevel++; EditorGUILayout.PropertyField(serializedObject.FindProperty("m_RaycastPadding")); EditorGUI.indentLevel--; EditorGUILayout.PropertyField(serializedObject.FindProperty("m_Maskable")); EditorGUILayout.Space(); EditorGUILayout.PropertyField(serializedObject.FindProperty("_width")); EditorGUILayout.PropertyField(serializedObject.FindProperty("_widthCurve")); EditorGUILayout.PropertyField(serializedObject.FindProperty("_keepZeroZ")); EditorGUILayout.PropertyField(serializedObject.FindProperty("_keepBillboard")); EditorGUILayout.Space(); EditorGUI.BeginChangeCheck(); var lineTexturePreset = EnumButtonField("Line Texture Preset", Enum.GetNames(typeof(LineTexturePreset)), (int)_target.lineTexturePreset); if(EditorGUI.EndChangeCheck()) { _target.lineTexturePreset = (LineTexturePreset)lineTexturePreset; } EditorGUI.indentLevel++; EditorGUILayout.PropertyField(serializedObject.FindProperty("m_Texture")); EditorGUI.indentLevel--; EditorGUILayout.PropertyField(serializedObject.FindProperty("_smooth")); EditorGUILayout.PropertyField(serializedObject.FindProperty("_roundEnds")); EditorGUI.BeginChangeCheck(); var resolution = serializedObject.FindProperty("_resolution"); EditorGUILayout.IntSlider(resolution, 1, 20); if (EditorGUI.EndChangeCheck()) { _target.resolution = resolution.intValue; } EditorGUI.indentLevel++; EditorGUILayout.LabelField("Vertex Count", _target.vertexCount.ToString()); EditorGUI.indentLevel--; var clipRangeSP = serializedObject.FindProperty("_clipRange"); var clipRange = clipRangeSP.vector2Value; EditorGUILayout.MinMaxSlider("Clip Range", ref clipRange.x, ref clipRange.y, 0, 1); clipRangeSP.vector2Value = clipRange; EditorGUILayout.LabelField($"min: {clipRange.x} | max: {clipRange.y}"); EditorGUILayout.PropertyField(serializedObject.FindProperty("_uvMode")); EditorGUILayout.Space(); EditorGUILayout.PropertyField(serializedObject.FindProperty("_uvMultiplier")); EditorGUILayout.PropertyField(serializedObject.FindProperty("_uvOffset")); EditorGUILayout.Space(); EditorGUI.BeginChangeCheck(); var startImagePreset = EnumButtonField("Start Image Preset", Enum.GetNames(typeof(StartEndImagePreset)), (int)_target.startImagePreset, 3); if (EditorGUI.EndChangeCheck()) { _target.startImagePreset = (StartEndImagePreset)startImagePreset; } EditorGUI.indentLevel++; EditorGUILayout.PropertyField(serializedObject.FindProperty("_startImageSprite")); EditorGUILayout.PropertyField(serializedObject.FindProperty("_startImageSize")); EditorGUILayout.PropertyField(serializedObject.FindProperty("_startImageOffsetMode")); if(_target.startImageOffsetMode == OffsetMode.Distance) EditorGUILayout.PropertyField(serializedObject.FindProperty("_startImageOffset")); else if(_target.startImageOffsetMode == OffsetMode.Normalized) EditorGUILayout.PropertyField(serializedObject.FindProperty("_normalizedStartImageOffset")); EditorGUI.indentLevel--; EditorGUILayout.Space(); EditorGUI.BeginChangeCheck(); var endImagePreset = EnumButtonField("End Image Preset", Enum.GetNames(typeof(StartEndImagePreset)), (int)_target.endImagePreset, 3); if(EditorGUI.EndChangeCheck()) { _target.endImagePreset = (StartEndImagePreset)endImagePreset; } EditorGUI.indentLevel++; EditorGUILayout.PropertyField(serializedObject.FindProperty("_endImageSprite")); EditorGUILayout.PropertyField(serializedObject.FindProperty("_endImageSize")); EditorGUILayout.PropertyField(serializedObject.FindProperty("_endImageOffsetMode")); if(_target.endImageOffsetMode == OffsetMode.Distance) EditorGUILayout.PropertyField(serializedObject.FindProperty("_endImageOffset")); else if(_target.endImageOffsetMode == OffsetMode.Normalized) EditorGUILayout.PropertyField(serializedObject.FindProperty("_normalizedEndImageOffset")); EditorGUI.indentLevel--; if (EditorGUI.EndChangeCheck()) { EditorUtility.SetDirty(target); serializedObject.ApplyModifiedProperties(); _target.UpdateRaycastTargetRect(); foreach (var o in targets) { var renderer = o as UISplineRenderer; renderer.UpdateStartEndImages(true); renderer.UpdateStartEndImages(false); } } } int EnumButtonField(string label, string[] names, int selected, int lineChange = 0) { EditorGUILayout.BeginHorizontal(); GUILayout.Label(label); EditorGUILayout.BeginVertical(); EditorGUILayout.BeginHorizontal(); for(var i = 0; i < names.Length; i ++) { if (i > 0 && lineChange > 0 && i % lineChange == 0) { EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); } if (i == selected) GUI.color = new Color(2,2,2); if (GUILayout.Button(names[i], GUILayout.Height(30))) { selected = i; } GUI.color = Color.white; } EditorGUILayout.EndHorizontal(); EditorGUILayout.EndVertical(); EditorGUILayout.EndHorizontal(); return selected; } // public override VisualElement CreateInspectorGUI() // { // var asset = Resources.Load("UISplineRenderer Inspector"); // var tree = asset.CloneTree(); // // _splineContainerField = tree.Q("splineContainer"); // _splineContainerField.SetEnabled(false); // // _materialField = tree.Q("material"); // _materialField.RegisterValueChangedCallback(e => // { // _target.material = e.newValue as Material; // }); // // _keepZeroZField = tree.Q("keepZeroZ"); // _keepZeroZField.RegisterValueChangedCallback(e => // { // _target.UpdateStartEndImages(true); // _target.UpdateStartEndImages(false); // }); // _keepBillboardField = tree.Q("keepBillboard"); // _keepBillboardField.RegisterValueChangedCallback(e => // { // _target.UpdateStartEndImages(true); // _target.UpdateStartEndImages(false); // }); // // var lineTextureArea = tree.Q("lineTextureArea"); // _textureField = lineTextureArea.Q("texture"); // // var textureButtons = tree.Q("presetButtons"); // _defaultLineTextureButton = textureButtons.Q