You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
101 lines
3.8 KiB
101 lines
3.8 KiB
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; |
|
} |
|
} |
|
}
|
|
|