using System; using UnityEngine.Splines; using UnityEditor.UIElements; using UnityEngine; using UnityEngine.UIElements; namespace UnityEditor.Splines { [CustomEditor(typeof(SplineAnimate))] [CanEditMultipleObjects] class SplineAnimateEditor : UnityEditor.Editor { VisualElement m_Root; Button m_PlayButton; Slider m_ProgressSlider; FloatField m_ElapsedTimeField; EnumField m_ObjectForwardField; EnumField m_ObjectUpField; SerializedProperty m_TargetProperty; SerializedProperty m_MethodProperty; SerializedProperty m_DurationProperty; SerializedProperty m_SpeedProperty; SerializedProperty m_ObjectForwardProperty; SerializedProperty m_ObjectUpProperty; SerializedObject m_TransformSO; SplineAnimate m_SplineAnimate; const string k_UxmlPath = "Packages/com.unity.splines/Editor/Resources/UI/UXML/splineanimate-inspector.uxml"; static VisualTreeAsset s_TreeAsset; static StyleSheet s_ThemeStyleSheet; void OnEnable() { m_SplineAnimate = target as SplineAnimate; m_SplineAnimate.onUpdated += OnSplineAnimateUpdated; m_TargetProperty = serializedObject.FindProperty("m_Target"); m_MethodProperty = serializedObject.FindProperty("m_Method"); m_DurationProperty = serializedObject.FindProperty("m_Duration"); m_SpeedProperty = serializedObject.FindProperty("m_MaxSpeed"); m_ObjectForwardProperty = serializedObject.FindProperty("m_ObjectForwardAxis"); m_ObjectUpProperty = serializedObject.FindProperty("m_ObjectUpAxis"); m_TransformSO = new SerializedObject(m_SplineAnimate.transform); EditorApplication.update += OnEditorUpdate; } void OnDisable() { if (m_SplineAnimate != null && m_SplineAnimate.splineContainer != null) { if (!EditorApplication.isPlaying) m_SplineAnimate.Restart(false); m_SplineAnimate.onUpdated -= OnSplineAnimateUpdated; } EditorApplication.update -= OnEditorUpdate; } void OnEditorUpdate() { if (m_SplineAnimate == null || m_SplineAnimate.splineContainer == null) return; if (m_SplineAnimate.isPlaying && !EditorApplication.isPlaying) m_SplineAnimate.Update(); RefreshProgressFields(); } public override VisualElement CreateInspectorGUI() { m_Root = new VisualElement(); if (s_TreeAsset == null) s_TreeAsset = (VisualTreeAsset)AssetDatabase.LoadAssetAtPath(k_UxmlPath, typeof(VisualTreeAsset)); s_TreeAsset.CloneTree(m_Root); if (s_ThemeStyleSheet == null) s_ThemeStyleSheet = AssetDatabase.LoadAssetAtPath($"Packages/com.unity.splines/Editor/Stylesheets/SplineAnimateInspector{(EditorGUIUtility.isProSkin ? "Dark" : "Light")}.uss"); m_Root.styleSheets.Add(s_ThemeStyleSheet); var splineField = m_Root.Q("spline-container"); splineField.RegisterValueChangeCallback((_) => { m_SplineAnimate.splineContainer = m_TargetProperty.objectReferenceValue as SplineContainer; }); var methodField = m_Root.Q("method"); methodField.RegisterValueChangeCallback((_) => { RefreshMethodParamFields((SplineAnimate.Method)m_MethodProperty.enumValueIndex); }); RefreshMethodParamFields((SplineAnimate.Method)m_MethodProperty.enumValueIndex); var durationField = m_Root.Q("duration"); durationField.RegisterValueChangeCallback((_) => { m_SplineAnimate.duration = m_DurationProperty.floatValue; }); var speedField = m_Root.Q("max-speed"); speedField.RegisterValueChangeCallback((_) => { m_SplineAnimate.maxSpeed = m_SpeedProperty.floatValue; }); m_ObjectForwardField = m_Root.Q("object-forward"); m_ObjectForwardField.RegisterValueChangedCallback((evt) => OnObjectAxisFieldChange(evt, m_ObjectForwardProperty, m_ObjectUpProperty)); m_ObjectUpField = m_Root.Q("object-up"); m_ObjectUpField.RegisterValueChangedCallback((evt) => OnObjectAxisFieldChange(evt, m_ObjectUpProperty, m_ObjectForwardProperty)); var playButton = m_Root.Q