AnimationClipActions.cs 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. using System.ComponentModel;
  2. using System.Linq;
  3. using JetBrains.Annotations;
  4. using UnityEngine;
  5. using UnityEngine.Timeline;
  6. using UnityEngine.Playables;
  7. using ClipAction = UnityEditor.Timeline.ItemAction<UnityEngine.Timeline.TimelineClip>;
  8. namespace UnityEditor.Timeline
  9. {
  10. [MenuEntry("Match Offsets To Previous Clip", MenuOrder.CustomClipAction.AnimClipMatchPrevious), UsedImplicitly]
  11. class MatchOffsetsPreviousAction : ClipAction
  12. {
  13. public override bool Execute(WindowState state, TimelineClip[] items)
  14. {
  15. AnimationOffsetMenu.MatchClipsToPrevious(state, items.Where(x => IsValidClip(x, TimelineEditor.inspectedDirector)).ToArray());
  16. return true;
  17. }
  18. private static bool IsValidClip(TimelineClip clip, PlayableDirector director)
  19. {
  20. return clip != null &&
  21. clip.parentTrack != null &&
  22. (clip.asset as AnimationPlayableAsset) != null &&
  23. clip.parentTrack.clips.Any(x => x.start < clip.start) &&
  24. TimelineUtility.GetSceneGameObject(director, clip.parentTrack) != null;
  25. }
  26. protected override MenuActionDisplayState GetDisplayState(WindowState state, TimelineClip[] items)
  27. {
  28. if (!items.All(TimelineAnimationUtilities.IsAnimationClip))
  29. return MenuActionDisplayState.Hidden;
  30. var director = TimelineEditor.inspectedDirector;
  31. if (TimelineEditor.inspectedDirector == null)
  32. return MenuActionDisplayState.Hidden;
  33. if (items.Any(c => IsValidClip(c, director)))
  34. return MenuActionDisplayState.Visible;
  35. return MenuActionDisplayState.Hidden;
  36. }
  37. }
  38. [MenuEntry("Match Offsets To Next Clip", MenuOrder.CustomClipAction.AnimClipMatchNext), UsedImplicitly]
  39. class MatchOffsetsNextAction : ClipAction
  40. {
  41. public override bool Execute(WindowState state, TimelineClip[] items)
  42. {
  43. AnimationOffsetMenu.MatchClipsToNext(state, items.Where(x => IsValidClip(x, TimelineEditor.inspectedDirector)).ToArray());
  44. return true;
  45. }
  46. private static bool IsValidClip(TimelineClip clip, PlayableDirector director)
  47. {
  48. return clip != null &&
  49. clip.parentTrack != null &&
  50. (clip.asset as AnimationPlayableAsset) != null &&
  51. clip.parentTrack.clips.Any(x => x.start > clip.start) &&
  52. TimelineUtility.GetSceneGameObject(director, clip.parentTrack) != null;
  53. }
  54. protected override MenuActionDisplayState GetDisplayState(WindowState state, TimelineClip[] items)
  55. {
  56. if (!items.All(TimelineAnimationUtilities.IsAnimationClip))
  57. return MenuActionDisplayState.Hidden;
  58. var director = TimelineEditor.inspectedDirector;
  59. if (TimelineEditor.inspectedDirector == null)
  60. return MenuActionDisplayState.Hidden;
  61. if (items.Any(c => IsValidClip(c, director)))
  62. return MenuActionDisplayState.Visible;
  63. return MenuActionDisplayState.Hidden;
  64. }
  65. }
  66. [MenuEntry("Reset Offsets", MenuOrder.CustomClipAction.AnimClipResetOffset), UsedImplicitly]
  67. class ResetOffsets : ClipAction
  68. {
  69. public override bool Execute(WindowState state, TimelineClip[] items)
  70. {
  71. AnimationOffsetMenu.ResetClipOffsets(state, items.Where(TimelineAnimationUtilities.IsAnimationClip).ToArray());
  72. return true;
  73. }
  74. protected override MenuActionDisplayState GetDisplayState(WindowState state, TimelineClip[] items)
  75. {
  76. if (!items.All(TimelineAnimationUtilities.IsAnimationClip))
  77. return MenuActionDisplayState.Hidden;
  78. return MenuActionDisplayState.Visible;
  79. }
  80. }
  81. }