143 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
		
		
			
		
	
	
			143 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
|  | using System; | ||
|  | using System.Collections.Generic; | ||
|  | #if UNITY_EDITOR | ||
|  | using UnityEditor; | ||
|  | #endif | ||
|  | 
 | ||
|  | namespace UnityEngine.Timeline | ||
|  | { | ||
|  |     static class TimelineCreateUtilities | ||
|  |     { | ||
|  |         // based off of ObjectNames.GetUniqueName, but can exist in runtime | ||
|  |         public static string GenerateUniqueActorName(List<ScriptableObject> tracks, string name) | ||
|  |         { | ||
|  |             if (!tracks.Exists(x => ((object)x) != null && x.name == name)) | ||
|  |                 return name; | ||
|  | 
 | ||
|  |             int numberInParentheses = 0; | ||
|  |             string baseName = name; | ||
|  | 
 | ||
|  |             if (!string.IsNullOrEmpty(name) && name[name.Length - 1] == ')') | ||
|  |             { | ||
|  |                 int index = name.LastIndexOf('('); | ||
|  |                 if (index > 0) | ||
|  |                 { | ||
|  |                     string numberString = name.Substring(index + 1, name.Length - index - 2); | ||
|  |                     if (int.TryParse(numberString, out numberInParentheses)) | ||
|  |                     { | ||
|  |                         numberInParentheses++; | ||
|  |                         baseName = name.Substring(0, index); | ||
|  |                     } | ||
|  |                 } | ||
|  |             } | ||
|  | 
 | ||
|  |             baseName = baseName.TrimEnd(); | ||
|  | 
 | ||
|  |             for (int i = numberInParentheses; i < numberInParentheses + 5000; i++) | ||
|  |             { | ||
|  |                 if (i > 0) | ||
|  |                 { | ||
|  |                     string result = string.Format("{0} ({1})", baseName, i); | ||
|  |                     if (!tracks.Exists(x => ((object)x) != null && x.name == result)) | ||
|  |                         return result; | ||
|  |                 } | ||
|  |             } | ||
|  | 
 | ||
|  |             // Fallback | ||
|  |             return name; | ||
|  |         } | ||
|  | 
 | ||
|  |         public static void SaveAssetIntoObject(Object childAsset, Object masterAsset) | ||
|  |         { | ||
|  |             if (childAsset == null || masterAsset == null) | ||
|  |                 return; | ||
|  | 
 | ||
|  |             if ((masterAsset.hideFlags & HideFlags.DontSave) != 0) | ||
|  |             { | ||
|  |                 childAsset.hideFlags |= HideFlags.DontSave; | ||
|  |             } | ||
|  |             else | ||
|  |             { | ||
|  |                 childAsset.hideFlags |= HideFlags.HideInHierarchy; | ||
|  | #if UNITY_EDITOR | ||
|  |                 if (!AssetDatabase.Contains(childAsset) && AssetDatabase.Contains(masterAsset)) | ||
|  |                     AssetDatabase.AddObjectToAsset(childAsset, masterAsset); | ||
|  | #endif | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         public static void RemoveAssetFromObject(Object childAsset, Object masterAsset) | ||
|  |         { | ||
|  |             if (childAsset == null || masterAsset == null) | ||
|  |                 return; | ||
|  | 
 | ||
|  | #if UNITY_EDITOR | ||
|  |             if (AssetDatabase.Contains(childAsset) && AssetDatabase.Contains(masterAsset)) | ||
|  |                 AssetDatabase.RemoveObjectFromAsset(childAsset); | ||
|  | #endif | ||
|  |         } | ||
|  | 
 | ||
|  |         public static AnimationClip CreateAnimationClipForTrack(string name, TrackAsset track, bool isLegacy) | ||
|  |         { | ||
|  |             var timelineAsset = track != null ? track.timelineAsset : null; | ||
|  |             var trackFlags = track != null ? track.hideFlags : HideFlags.None; | ||
|  | 
 | ||
|  |             var curves = new AnimationClip | ||
|  |             { | ||
|  |                 legacy = isLegacy, | ||
|  | 
 | ||
|  |                 name = name, | ||
|  | 
 | ||
|  |                 frameRate = timelineAsset == null | ||
|  |                     ? (float)TimelineAsset.EditorSettings.kDefaultFrameRate | ||
|  |                     : (float)timelineAsset.editorSettings.frameRate | ||
|  |             }; | ||
|  | 
 | ||
|  |             SaveAssetIntoObject(curves, timelineAsset); | ||
|  |             curves.hideFlags = trackFlags & ~HideFlags.HideInHierarchy; // Never hide in hierarchy | ||
|  | 
 | ||
|  |             TimelineUndo.RegisterCreatedObjectUndo(curves, "Create Curves"); | ||
|  | 
 | ||
|  |             return curves; | ||
|  |         } | ||
|  | 
 | ||
|  |         public static bool ValidateParentTrack(TrackAsset parent, Type childType) | ||
|  |         { | ||
|  |             if (childType == null || !typeof(TrackAsset).IsAssignableFrom(childType)) | ||
|  |                 return false; | ||
|  | 
 | ||
|  |             // no parent is valid for any type | ||
|  |             if (parent == null) | ||
|  |                 return true; | ||
|  | 
 | ||
|  |             // A track supports layers if it implements ILayerable. Only supported for parents that are | ||
|  |             // the same exact type as the child class, and 1 level of nesting only | ||
|  |             if (parent is ILayerable && !parent.isSubTrack && parent.GetType() == childType) | ||
|  |                 return true; | ||
|  | 
 | ||
|  |             var attr = Attribute.GetCustomAttribute(parent.GetType(), typeof(SupportsChildTracksAttribute)) as SupportsChildTracksAttribute; | ||
|  |             if (attr == null) | ||
|  |                 return false; | ||
|  | 
 | ||
|  |             // group track case, accepts all | ||
|  |             if (attr.childType == null) | ||
|  |                 return true; | ||
|  | 
 | ||
|  |             // specific case. Specifies nesting level | ||
|  |             if (childType == attr.childType) | ||
|  |             { | ||
|  |                 int nestCount = 0; | ||
|  |                 var p = parent; | ||
|  |                 while (p != null && p.isSubTrack) | ||
|  |                 { | ||
|  |                     nestCount++; | ||
|  |                     p = p.parent as TrackAsset; | ||
|  |                 } | ||
|  | 
 | ||
|  |                 return nestCount < attr.levels; | ||
|  |             } | ||
|  |             return false; | ||
|  |         } | ||
|  |     } | ||
|  | } |