123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- 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;
- }
- }
- }
|