102 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			102 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System.Collections.Generic;
 | |
| using System.Linq;
 | |
| using JetBrains.Annotations;
 | |
| using UnityEditor.Timeline.Actions;
 | |
| using UnityEngine;
 | |
| using UnityEngine.Timeline;
 | |
| using UnityEngine.Playables;
 | |
| 
 | |
| namespace UnityEditor.Timeline
 | |
| {
 | |
|     [ApplyDefaultUndo("Match Offsets")]
 | |
|     [MenuEntry("Match Offsets To Previous Clip", MenuPriority.CustomClipActionSection.matchPrevious), UsedImplicitly]
 | |
|     class MatchOffsetsPreviousAction : ClipAction
 | |
|     {
 | |
|         public override bool Execute(IEnumerable<TimelineClip> clips)
 | |
|         {
 | |
|             if (clips == null || !clips.Any())
 | |
|                 return false;
 | |
|             AnimationOffsetMenu.MatchClipsToPrevious(clips.Where(x => IsValidClip(x, TimelineEditor.inspectedDirector)).ToArray());
 | |
|             return true;
 | |
|         }
 | |
| 
 | |
|         static bool IsValidClip(TimelineClip clip, PlayableDirector director)
 | |
|         {
 | |
|             return clip != null &&
 | |
|                 clip.GetParentTrack() != null &&
 | |
|                 (clip.asset as AnimationPlayableAsset) != null &&
 | |
|                 clip.GetParentTrack().clips.Any(x => x.start < clip.start) &&
 | |
|                 TimelineUtility.GetSceneGameObject(director, clip.GetParentTrack()) != null;
 | |
|         }
 | |
| 
 | |
|         public override ActionValidity Validate(IEnumerable<TimelineClip> clips)
 | |
|         {
 | |
|             if (!clips.All(TimelineAnimationUtilities.IsAnimationClip))
 | |
|                 return ActionValidity.NotApplicable;
 | |
| 
 | |
|             var director = TimelineEditor.inspectedDirector;
 | |
|             if (TimelineEditor.inspectedDirector == null)
 | |
|                 return ActionValidity.NotApplicable;
 | |
| 
 | |
|             if (clips.Any(c => IsValidClip(c, director)))
 | |
|                 return ActionValidity.Valid;
 | |
| 
 | |
|             return ActionValidity.NotApplicable;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     [ApplyDefaultUndo("Match Offsets")]
 | |
|     [MenuEntry("Match Offsets To Next Clip", MenuPriority.CustomClipActionSection.matchNext), UsedImplicitly]
 | |
|     class MatchOffsetsNextAction : ClipAction
 | |
|     {
 | |
|         public override bool Execute(IEnumerable<TimelineClip> clips)
 | |
|         {
 | |
|             AnimationOffsetMenu.MatchClipsToNext(clips.Where(x => IsValidClip(x, TimelineEditor.inspectedDirector)).ToArray());
 | |
|             return true;
 | |
|         }
 | |
| 
 | |
|         static bool IsValidClip(TimelineClip clip, PlayableDirector director)
 | |
|         {
 | |
|             return clip != null &&
 | |
|                 clip.GetParentTrack() != null &&
 | |
|                 (clip.asset as AnimationPlayableAsset) != null &&
 | |
|                 clip.GetParentTrack().clips.Any(x => x.start > clip.start) &&
 | |
|                 TimelineUtility.GetSceneGameObject(director, clip.GetParentTrack()) != null;
 | |
|         }
 | |
| 
 | |
|         public override ActionValidity Validate(IEnumerable<TimelineClip> clips)
 | |
|         {
 | |
|             if (!clips.All(TimelineAnimationUtilities.IsAnimationClip))
 | |
|                 return ActionValidity.NotApplicable;
 | |
| 
 | |
|             var director = TimelineEditor.inspectedDirector;
 | |
|             if (TimelineEditor.inspectedDirector == null)
 | |
|                 return ActionValidity.NotApplicable;
 | |
| 
 | |
|             if (clips.Any(c => IsValidClip(c, director)))
 | |
|                 return ActionValidity.Valid;
 | |
| 
 | |
|             return ActionValidity.NotApplicable;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     [ApplyDefaultUndo]
 | |
|     [MenuEntry("Reset Offsets", MenuPriority.CustomClipActionSection.resetOffset), UsedImplicitly]
 | |
|     class ResetOffsets : ClipAction
 | |
|     {
 | |
|         public override bool Execute(IEnumerable<TimelineClip> clips)
 | |
|         {
 | |
|             AnimationOffsetMenu.ResetClipOffsets(clips.Where(TimelineAnimationUtilities.IsAnimationClip).ToArray());
 | |
|             return true;
 | |
|         }
 | |
| 
 | |
|         public override ActionValidity Validate(IEnumerable<TimelineClip> clips)
 | |
|         {
 | |
|             if (!clips.All(TimelineAnimationUtilities.IsAnimationClip))
 | |
|                 return ActionValidity.NotApplicable;
 | |
| 
 | |
|             return ActionValidity.Valid;
 | |
|         }
 | |
|     }
 | |
| }
 |