using System; using UnityEngine; using UnityEngine.Timeline; using TimelineEditorSettings = UnityEngine.Timeline.TimelineAsset.EditorSettings; #if TIMELINE_FRAMEACCURATE using UnityEngine.Playables; #endif namespace UnityEditor.Timeline { [CustomPropertyDrawer(typeof(FrameRateFieldAttribute), true)] class FrameRateDrawer : PropertyDrawer { public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) { var frameRateAttribute = attribute as FrameRateFieldAttribute; if (frameRateAttribute == null) return; EditorGUI.BeginProperty(position, label, property); property.doubleValue = FrameRateField(property.doubleValue, label, position, out bool frameRateIsValid); EditorGUI.EndProperty(); #if TIMELINE_FRAMEACCURATE if (!frameRateIsValid && TimelinePreferences.instance.playbackLockedToFrame) EditorGUILayout.HelpBox( L10n.Tr("Locking playback cannot be enabled for this frame rate."), MessageType.Warning); #endif } public static double FrameRateField(double frameRate, GUIContent label, Rect position, out bool isValid) { double frameRateDouble = FrameRateDisplayUtility.RoundFrameRate(frameRate); FrameRate frameRateObj = TimeUtility.GetClosestFrameRate(frameRateDouble); isValid = frameRateObj.IsValid(); TimeUtility.ToStandardFrameRate(frameRateObj, out StandardFrameRates option); position = EditorGUI.PrefixLabel(position, label); Rect posPopup = new Rect(position.x, position.y, position.width / 2, position.height); Rect posFloatField = new Rect(posPopup.xMax, position.y, position.width / 2, position.height); using (var checkOption = new EditorGUI.ChangeCheckScope()) { option = (StandardFrameRates)EditorGUI.Popup(posPopup, (int)option, FrameRateDisplayUtility.GetDefaultFrameRatesLabels(option)); if (checkOption.changed) { isValid = true; return TimeUtility.ToFrameRate(option).rate; } } using (var checkFrame = new EditorGUI.ChangeCheckScope()) { frameRateDouble = Math.Abs(EditorGUI.DoubleField(posFloatField, frameRateDouble)); frameRateObj = TimeUtility.GetClosestFrameRate(frameRateDouble); if (checkFrame.changed) { isValid = frameRateObj.IsValid(); return isValid ? frameRateObj.rate : frameRateDouble; } } return frameRateDouble; } } }