Нема описа
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

TimelineAssetInspector.cs 5.5KB

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