152 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
		
		
			
		
	
	
			152 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
|  | using System.Collections.Generic; | ||
|  | using JetBrains.Annotations; | ||
|  | using UnityEngine; | ||
|  | using UnityEngine.Timeline; | ||
|  | 
 | ||
|  | namespace UnityEditor.Timeline | ||
|  | { | ||
|  |     static class AnimatedParameterExtensions | ||
|  |     { | ||
|  |         public static bool HasAnyAnimatableParameters(this ICurvesOwner curvesOwner) | ||
|  |         { | ||
|  |             return AnimatedParameterUtility.HasAnyAnimatableParameters(curvesOwner.asset); | ||
|  |         } | ||
|  | 
 | ||
|  |         public static IEnumerable<SerializedProperty> GetAllAnimatableParameters(this ICurvesOwner curvesOwner) | ||
|  |         { | ||
|  |             return AnimatedParameterUtility.GetAllAnimatableParameters(curvesOwner.asset); | ||
|  |         } | ||
|  | 
 | ||
|  |         public static bool IsParameterAnimatable(this ICurvesOwner curvesOwner, string parameterName) | ||
|  |         { | ||
|  |             return AnimatedParameterUtility.IsParameterAnimatable(curvesOwner.asset, parameterName); | ||
|  |         } | ||
|  | 
 | ||
|  |         public static bool IsParameterAnimated(this ICurvesOwner curvesOwner, string parameterName) | ||
|  |         { | ||
|  |             return AnimatedParameterUtility.IsParameterAnimated(curvesOwner.asset, curvesOwner.curves, parameterName); | ||
|  |         } | ||
|  | 
 | ||
|  |         public static EditorCurveBinding GetCurveBinding(this ICurvesOwner curvesOwner, string parameterName) | ||
|  |         { | ||
|  |             return AnimatedParameterUtility.GetCurveBinding(curvesOwner.asset, parameterName); | ||
|  |         } | ||
|  | 
 | ||
|  |         public static string GetUniqueRecordedClipName(this ICurvesOwner curvesOwner) | ||
|  |         { | ||
|  |             return AnimationTrackRecorder.GetUniqueRecordedClipName(curvesOwner.assetOwner, curvesOwner.defaultCurvesName); | ||
|  |         } | ||
|  | 
 | ||
|  |         public static AnimationCurve GetAnimatedParameter(this ICurvesOwner curvesOwner, string bindingName) | ||
|  |         { | ||
|  |             return AnimatedParameterUtility.GetAnimatedParameter(curvesOwner.asset, curvesOwner.curves, bindingName); | ||
|  |         } | ||
|  | 
 | ||
|  |         public static bool AddAnimatedParameterValueAt(this ICurvesOwner curvesOwner, string parameterName, float value, float time) | ||
|  |         { | ||
|  |             if (!curvesOwner.IsParameterAnimatable(parameterName)) | ||
|  |                 return false; | ||
|  | 
 | ||
|  |             if (curvesOwner.curves == null) | ||
|  |                 curvesOwner.CreateCurves(curvesOwner.GetUniqueRecordedClipName()); | ||
|  | 
 | ||
|  |             var binding = curvesOwner.GetCurveBinding(parameterName); | ||
|  |             var curve = AnimationUtility.GetEditorCurve(curvesOwner.curves, binding) ?? new AnimationCurve(); | ||
|  | 
 | ||
|  |             var serializedObject = AnimatedParameterUtility.GetSerializedPlayableAsset(curvesOwner.asset); | ||
|  |             var property = serializedObject.FindProperty(parameterName); | ||
|  | 
 | ||
|  |             bool isStepped = property.propertyType == SerializedPropertyType.Boolean || | ||
|  |                 property.propertyType == SerializedPropertyType.Integer || | ||
|  |                 property.propertyType == SerializedPropertyType.Enum; | ||
|  | 
 | ||
|  |             TimelineUndo.PushUndo(curvesOwner.curves, "Set Key"); | ||
|  |             CurveEditUtility.AddKeyFrameToCurve(curve, time, curvesOwner.curves.frameRate, value, isStepped); | ||
|  |             AnimationUtility.SetEditorCurve(curvesOwner.curves, binding, curve); | ||
|  | 
 | ||
|  |             return true; | ||
|  |         } | ||
|  | 
 | ||
|  |         public static void SanitizeCurvesData(this ICurvesOwner curvesOwner) | ||
|  |         { | ||
|  |             var curves = curvesOwner.curves; | ||
|  |             if (curves == null) | ||
|  |                 return; | ||
|  | 
 | ||
|  |             // Remove any 0-length curves | ||
|  |             foreach (var binding in AnimationUtility.GetCurveBindings(curves)) | ||
|  |             { | ||
|  |                 var curve = AnimationUtility.GetEditorCurve(curves, binding); | ||
|  |                 if (curve.length == 0) | ||
|  |                     AnimationUtility.SetEditorCurve(curves, binding, null); | ||
|  |             } | ||
|  | 
 | ||
|  |             // If no curves remain, delete the curves asset | ||
|  |             if (curves.empty) | ||
|  |             { | ||
|  |                 var track = curvesOwner.targetTrack; | ||
|  |                 var timeline = track != null ? track.timelineAsset : null; | ||
|  |                 TimelineUndo.PushDestroyUndo(timeline, track, curves); | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         public static bool AddAnimatedParameter(this ICurvesOwner curvesOwner, string parameterName) | ||
|  |         { | ||
|  |             var newBinding = new EditorCurveBinding(); | ||
|  | 
 | ||
|  |             SerializedProperty property; | ||
|  |             if (!InternalAddParameter(curvesOwner, parameterName, ref newBinding, out property)) | ||
|  |                 return false; | ||
|  | 
 | ||
|  |             var duration = (float)curvesOwner.duration; | ||
|  |             CurveEditUtility.AddKey(curvesOwner.curves, newBinding, property, 0); | ||
|  |             CurveEditUtility.AddKey(curvesOwner.curves, newBinding, property, duration); | ||
|  |             return true; | ||
|  |         } | ||
|  | 
 | ||
|  |         public static bool RemoveAnimatedParameter(this ICurvesOwner curvesOwner, string parameterName) | ||
|  |         { | ||
|  |             if (!curvesOwner.IsParameterAnimated(parameterName) || curvesOwner.curves == null) | ||
|  |                 return false; | ||
|  | 
 | ||
|  |             var binding = curvesOwner.GetCurveBinding(parameterName); | ||
|  |             AnimationUtility.SetEditorCurve(curvesOwner.curves, binding, null); | ||
|  |             return true; | ||
|  |         } | ||
|  | 
 | ||
|  |         // Set an animated parameter. Requires the field identifier 'position.x', but will add default curves to all fields | ||
|  |         public static bool SetAnimatedParameter(this ICurvesOwner curvesOwner, string parameterName, AnimationCurve curve) | ||
|  |         { | ||
|  |             // this will add a basic curve for all the related parameters | ||
|  |             if (!curvesOwner.IsParameterAnimated(parameterName) && !curvesOwner.AddAnimatedParameter(parameterName)) | ||
|  |                 return false; | ||
|  | 
 | ||
|  |             var binding = curvesOwner.GetCurveBinding(parameterName); | ||
|  |             AnimationUtility.SetEditorCurve(curvesOwner.curves, binding, curve); | ||
|  |             return true; | ||
|  |         } | ||
|  | 
 | ||
|  |         static bool InternalAddParameter([NotNull] ICurvesOwner curvesOwner, string parameterName, ref EditorCurveBinding binding, out SerializedProperty property) | ||
|  |         { | ||
|  |             property = null; | ||
|  | 
 | ||
|  |             if (curvesOwner.IsParameterAnimated(parameterName)) | ||
|  |                 return false; | ||
|  | 
 | ||
|  |             var serializedObject = AnimatedParameterUtility.GetSerializedPlayableAsset(curvesOwner.asset); | ||
|  |             if (serializedObject == null) | ||
|  |                 return false; | ||
|  | 
 | ||
|  |             property = serializedObject.FindProperty(parameterName); | ||
|  |             if (property == null || !AnimatedParameterUtility.IsTypeAnimatable(property.propertyType)) | ||
|  |                 return false; | ||
|  | 
 | ||
|  |             if (curvesOwner.curves == null) | ||
|  |                 curvesOwner.CreateCurves(curvesOwner.GetUniqueRecordedClipName()); | ||
|  | 
 | ||
|  |             binding = curvesOwner.GetCurveBinding(parameterName); | ||
|  |             return true; | ||
|  |         } | ||
|  |     } | ||
|  | } |