TimelineAssetInspector.cs 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. using System;
  2. using System.Linq;
  3. using UnityEngine;
  4. using UnityEngine.Timeline;
  5. using Object = UnityEngine.Object;
  6. namespace UnityEditor.Timeline
  7. {
  8. [CustomEditor(typeof(TimelineAsset)), CanEditMultipleObjects]
  9. class TimelineAssetInspector : Editor
  10. {
  11. const int k_MinWidth = 140;
  12. static class Styles
  13. {
  14. public static readonly GUIContent FrameRate = EditorGUIUtility.TrTextContent("Frame Rate", "The frame rate at which this sequence updates");
  15. public static readonly GUIContent DurationMode = EditorGUIUtility.TrTextContent("Duration Mode", "Specified how the duration of the sequence is calculated");
  16. public static readonly GUIContent Duration = EditorGUIUtility.TrTextContent("Duration", "The length of the sequence");
  17. public static readonly GUIContent HeaderTitleMultiselection = EditorGUIUtility.TrTextContent("Timeline Assets");
  18. public static readonly GUIContent IgnorePreviewWarning = EditorGUIUtility.TrTextContent("When ignoring preview, the Timeline window will modify the scene when this timeline is opened.");
  19. public static readonly GUIContent ScenePreviewLabel = EditorGUIUtility.TrTextContent("Scene Preview");
  20. }
  21. SerializedProperty m_FrameRateProperty;
  22. SerializedProperty m_DurationModeProperty;
  23. SerializedProperty m_FixedDurationProperty;
  24. SerializedProperty m_ScenePreviewProperty;
  25. void InitializeProperties()
  26. {
  27. var editorSettings = serializedObject.FindProperty("m_EditorSettings");
  28. m_FrameRateProperty = editorSettings.FindPropertyRelative("m_Framerate");
  29. m_DurationModeProperty = serializedObject.FindProperty("m_DurationMode");
  30. m_FixedDurationProperty = serializedObject.FindProperty("m_FixedDuration");
  31. m_ScenePreviewProperty = editorSettings.FindPropertyRelative("m_ScenePreview");
  32. }
  33. public void OnEnable()
  34. {
  35. InitializeProperties();
  36. }
  37. internal override bool IsEnabled()
  38. {
  39. return !FileUtil.HasReadOnly(targets) && base.IsEnabled();
  40. }
  41. protected override void OnHeaderGUI()
  42. {
  43. string headerTitle;
  44. if (targets.Length == 1)
  45. headerTitle = target.name;
  46. else
  47. headerTitle = targets.Length + " " + Styles.HeaderTitleMultiselection.text;
  48. DrawHeaderGUI(this, headerTitle, 0);
  49. }
  50. public override void OnInspectorGUI()
  51. {
  52. serializedObject.Update();
  53. EditorGUI.BeginChangeCheck();
  54. EditorGUILayout.PropertyField(m_FrameRateProperty, Styles.FrameRate, GUILayout.MinWidth(k_MinWidth));
  55. var frameRate = m_FrameRateProperty.doubleValue;
  56. EditorGUILayout.PropertyField(m_DurationModeProperty, Styles.DurationMode, GUILayout.MinWidth(k_MinWidth));
  57. var durationMode = (TimelineAsset.DurationMode)m_DurationModeProperty.enumValueIndex;
  58. var inputEvent = InputEvent.None;
  59. if (durationMode == TimelineAsset.DurationMode.FixedLength)
  60. TimelineInspectorUtility.TimeField(m_FixedDurationProperty, Styles.Duration, false, frameRate, double.Epsilon, TimelineClip.kMaxTimeValue * 2, ref inputEvent);
  61. else
  62. {
  63. var isMixed = targets.Length > 1;
  64. TimelineInspectorUtility.TimeField(Styles.Duration, ((TimelineAsset)target).duration, true, isMixed, frameRate, double.MinValue, double.MaxValue, ref inputEvent);
  65. }
  66. DrawIgnorePreviewProperty();
  67. var changed = EditorGUI.EndChangeCheck();
  68. serializedObject.ApplyModifiedProperties();
  69. if (changed)
  70. TimelineEditor.Refresh(RefreshReason.WindowNeedsRedraw);
  71. }
  72. void DrawIgnorePreviewProperty()
  73. {
  74. EditorGUI.BeginChangeCheck();
  75. {
  76. EditorGUILayout.PropertyField(m_ScenePreviewProperty, Styles.ScenePreviewLabel, GUILayout.MinWidth(k_MinWidth));
  77. }
  78. var changed = EditorGUI.EndChangeCheck();
  79. if (changed && TimelineWindow.instance && TimelineWindow.instance.state != null && ContainsMasterAsset(targets))
  80. ResetWindowState(TimelineWindow.instance.state);
  81. if (!m_ScenePreviewProperty.boolValue || m_ScenePreviewProperty.hasMultipleDifferentValues)
  82. EditorGUILayout.HelpBox(Styles.IgnorePreviewWarning.text, MessageType.Warning);
  83. }
  84. static void ResetWindowState(WindowState state)
  85. {
  86. state.Reset();
  87. state.Stop();
  88. state.masterSequence.viewModel.windowTime = 0.0;
  89. if (state.masterSequence.director != null) state.masterSequence.director.time = 0.0;
  90. }
  91. static bool ContainsMasterAsset(Object[] asset)
  92. {
  93. return asset != null && asset.Any(tl => tl == TimelineWindow.instance.state.masterSequence.asset);
  94. }
  95. }
  96. }