using System; using System.Collections.Generic; using UnityEngine; using UnityEditor; using UnityEditor.Timeline; using UnityEngine.Serialization; using UnityEngine.Timeline; using UnityEngine.UIElements; #if !UNITY_2020_2_OR_NEWER using L10n = UnityEditor.Timeline.L10n; #endif /// /// Store the settings for Timeline that will be stored with the Unity Project. /// [FilePath("ProjectSettings/TimelineSettings.asset", FilePathAttribute.Location.ProjectFolder)] public class TimelineProjectSettings : ScriptableSingleton { /// /// Define the default framerate when a Timeline asset is created. /// [HideInInspector, Obsolete("assetDefaultFramerate has been deprecated. Use defaultFrameRate instead.")] public float assetDefaultFramerate = (float)TimelineAsset.EditorSettings.kDefaultFrameRate; [SerializeField, FrameRateField, FormerlySerializedAs("assetDefaultFramerate")] private double m_DefaultFrameRate = TimelineAsset.EditorSettings.kDefaultFrameRate; /// /// Defines the default frame rate when a Timeline asset is created from the project window. /// public double defaultFrameRate { #pragma warning disable 0618 get { if (m_DefaultFrameRate != assetDefaultFramerate) { return assetDefaultFramerate; } return m_DefaultFrameRate; } set { m_DefaultFrameRate = value; assetDefaultFramerate = (float)value; } #pragma warning restore 0618 } void OnDisable() { Save(); } /// /// Save the timeline project settings file in the project directory. /// public void Save() { Save(true); } internal SerializedObject GetSerializedObject() { return new SerializedObject(this); } private void OnValidate() { #pragma warning disable 0618 assetDefaultFramerate = (float)m_DefaultFrameRate; #pragma warning restore 0618 } } class TimelineProjectSettingsProvider : SettingsProvider { SerializedObject m_SerializedObject; SerializedProperty m_Framerate; private class Styles { public static readonly GUIContent DefaultFramerateLabel = L10n.TextContent("Default frame rate", "The default frame rate for new Timeline assets."); public static readonly GUIContent TimelineAssetLabel = L10n.TextContent("Timeline Asset", ""); public static readonly string WarningString = L10n.Tr("Locking playback cannot be enabled for this frame rate."); } public TimelineProjectSettingsProvider(string path, SettingsScope scopes, IEnumerable keywords = null) : base(path, scopes, keywords) { } public override void OnActivate(string searchContext, VisualElement rootElement) { TimelineProjectSettings.instance.Save(); m_SerializedObject = TimelineProjectSettings.instance.GetSerializedObject(); m_Framerate = m_SerializedObject.FindProperty("m_DefaultFrameRate"); } public override void OnGUI(string searchContext) { using (new SettingsWindow.GUIScope()) { m_SerializedObject.Update(); EditorGUILayout.LabelField(Styles.TimelineAssetLabel, EditorStyles.boldLabel); EditorGUI.BeginChangeCheck(); m_Framerate.doubleValue = FrameRateDrawer.FrameRateField(m_Framerate.doubleValue, Styles.DefaultFramerateLabel, EditorGUILayout.GetControlRect(), out bool frameRateIsValid); if (EditorGUI.EndChangeCheck()) { m_SerializedObject.ApplyModifiedProperties(); TimelineProjectSettings.instance.Save(); } #if TIMELINE_FRAMEACCURATE if (!frameRateIsValid && TimelinePreferences.instance.playbackLockedToFrame) EditorGUILayout.HelpBox(Styles.WarningString, MessageType.Warning); #endif } } [SettingsProvider] public static SettingsProvider CreateTimelineProjectSettingProvider() { var provider = new TimelineProjectSettingsProvider("Project/Timeline", SettingsScope.Project, GetSearchKeywordsFromGUIContentProperties()); return provider; } }