TimelineProjectSettings.cs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. using System;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEditor;
  5. using UnityEngine.Timeline;
  6. using UnityEngine.UIElements;
  7. /// <summary>
  8. /// Store the settings for Timeline that will be stored with the Unity Project.
  9. /// </summary>
  10. [FilePath("ProjectSettings/TimelineSettings.asset", FilePathAttribute.Location.ProjectFolder)]
  11. public class TimelineProjectSettings : ScriptableSingleton<TimelineProjectSettings>
  12. {
  13. /// <summary>
  14. /// Define the default framerate when a Timeline asset is created.
  15. /// </summary>
  16. [SerializeField]
  17. public float assetDefaultFramerate = TimelineAsset.EditorSettings.kDefaultFps;
  18. internal static string[] framerateLabels = new string[]
  19. {
  20. "Film (24)",
  21. "PAL (25)",
  22. "NTSC (29.97)",
  23. "Film (30)",
  24. "Film (50)",
  25. "Film (60)",
  26. "Custom"
  27. };
  28. internal static float[] framerateValues = new float[]
  29. {
  30. 24.0f,
  31. 25.0f,
  32. 29.97f,
  33. 30.0f,
  34. 50.0f,
  35. 60.0f
  36. };
  37. void OnDisable()
  38. {
  39. Save();
  40. }
  41. /// <summary>
  42. /// Save the timeline project settings file in the project directory.
  43. /// </summary>
  44. public void Save()
  45. {
  46. Save(true);
  47. }
  48. internal SerializedObject GetSerializedObject()
  49. {
  50. return new SerializedObject(this);
  51. }
  52. }
  53. class TimelineProjectSettingsProvider : SettingsProvider
  54. {
  55. SerializedObject m_SerializedObject;
  56. SerializedProperty m_Framerate;
  57. bool m_customFramerate;
  58. private class Styles
  59. {
  60. public static readonly GUIContent DefaultFramerateLabel = EditorGUIUtility.TrTextContent("Default Framerate", "Framerate value used for new Timeline Assets.");
  61. public static readonly GUIContent CustomFramerateLabel = EditorGUIUtility.TrTextContent("Custom Framerate", "Custom framerate value used for new Timeline Assets.");
  62. public static readonly GUIContent TimelineAssetLabel = EditorGUIUtility.TrTextContent("Timeline Asset", "");
  63. }
  64. public TimelineProjectSettingsProvider(string path, SettingsScope scopes, IEnumerable<string> keywords = null)
  65. : base(path, scopes, keywords) {}
  66. public override void OnActivate(string searchContext, VisualElement rootElement)
  67. {
  68. TimelineProjectSettings.instance.Save();
  69. m_SerializedObject = TimelineProjectSettings.instance.GetSerializedObject();
  70. m_Framerate = m_SerializedObject.FindProperty("assetDefaultFramerate");
  71. }
  72. public override void OnGUI(string searchContext)
  73. {
  74. using (new SettingsWindow.GUIScope())
  75. {
  76. m_SerializedObject.Update();
  77. EditorGUI.BeginChangeCheck();
  78. EditorGUILayout.LabelField(Styles.TimelineAssetLabel , EditorStyles.boldLabel);
  79. int framerateIdx = Array.IndexOf(TimelineProjectSettings.framerateValues, m_Framerate.floatValue);
  80. if (m_customFramerate || framerateIdx == -1)
  81. {
  82. framerateIdx = TimelineProjectSettings.framerateValues.Length;
  83. }
  84. framerateIdx = EditorGUILayout.Popup(Styles.DefaultFramerateLabel, framerateIdx, TimelineProjectSettings.framerateLabels);
  85. if (framerateIdx == TimelineProjectSettings.framerateValues.Length || framerateIdx == -1)
  86. {
  87. m_customFramerate = true;
  88. float newFramerate = EditorGUILayout.FloatField(Styles.CustomFramerateLabel, m_Framerate.floatValue);
  89. m_Framerate.floatValue = TimelineAsset.GetValidFramerate(newFramerate);
  90. }
  91. else
  92. {
  93. m_customFramerate = false;
  94. m_Framerate.floatValue = TimelineProjectSettings.framerateValues[framerateIdx];
  95. }
  96. if (EditorGUI.EndChangeCheck())
  97. {
  98. m_SerializedObject.ApplyModifiedProperties();
  99. TimelineProjectSettings.instance.Save();
  100. }
  101. }
  102. }
  103. [SettingsProvider]
  104. public static SettingsProvider CreateTimelineProjectSettingProvider()
  105. {
  106. var provider = new TimelineProjectSettingsProvider("Project/Timeline", SettingsScope.Project, GetSearchKeywordsFromGUIContentProperties<Styles>());
  107. return provider;
  108. }
  109. }