67 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			67 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| 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;
 | |
|         }
 | |
|     }
 | |
| }
 |