Brak opisu
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.

AnimationClipActions.cs 3.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using JetBrains.Annotations;
  4. using UnityEditor.Timeline.Actions;
  5. using UnityEngine;
  6. using UnityEngine.Timeline;
  7. using UnityEngine.Playables;
  8. namespace UnityEditor.Timeline
  9. {
  10. [ApplyDefaultUndo("Match Offsets")]
  11. [MenuEntry("Match Offsets To Previous Clip", MenuPriority.CustomClipActionSection.matchPrevious), UsedImplicitly]
  12. class MatchOffsetsPreviousAction : ClipAction
  13. {
  14. public override bool Execute(IEnumerable<TimelineClip> clips)
  15. {
  16. if (clips == null || !clips.Any())
  17. return false;
  18. AnimationOffsetMenu.MatchClipsToPrevious(clips.Where(x => IsValidClip(x, TimelineEditor.inspectedDirector)).ToArray());
  19. return true;
  20. }
  21. static bool IsValidClip(TimelineClip clip, PlayableDirector director)
  22. {
  23. return clip != null &&
  24. clip.GetParentTrack() != null &&
  25. (clip.asset as AnimationPlayableAsset) != null &&
  26. clip.GetParentTrack().clips.Any(x => x.start < clip.start) &&
  27. TimelineUtility.GetSceneGameObject(director, clip.GetParentTrack()) != null;
  28. }
  29. public override ActionValidity Validate(IEnumerable<TimelineClip> clips)
  30. {
  31. if (!clips.All(TimelineAnimationUtilities.IsAnimationClip))
  32. return ActionValidity.NotApplicable;
  33. var director = TimelineEditor.inspectedDirector;
  34. if (TimelineEditor.inspectedDirector == null)
  35. return ActionValidity.NotApplicable;
  36. if (clips.Any(c => IsValidClip(c, director)))
  37. return ActionValidity.Valid;
  38. return ActionValidity.NotApplicable;
  39. }
  40. }
  41. [ApplyDefaultUndo("Match Offsets")]
  42. [MenuEntry("Match Offsets To Next Clip", MenuPriority.CustomClipActionSection.matchNext), UsedImplicitly]
  43. class MatchOffsetsNextAction : ClipAction
  44. {
  45. public override bool Execute(IEnumerable<TimelineClip> clips)
  46. {
  47. AnimationOffsetMenu.MatchClipsToNext(clips.Where(x => IsValidClip(x, TimelineEditor.inspectedDirector)).ToArray());
  48. return true;
  49. }
  50. static bool IsValidClip(TimelineClip clip, PlayableDirector director)
  51. {
  52. return clip != null &&
  53. clip.GetParentTrack() != null &&
  54. (clip.asset as AnimationPlayableAsset) != null &&
  55. clip.GetParentTrack().clips.Any(x => x.start > clip.start) &&
  56. TimelineUtility.GetSceneGameObject(director, clip.GetParentTrack()) != null;
  57. }
  58. public override ActionValidity Validate(IEnumerable<TimelineClip> clips)
  59. {
  60. if (!clips.All(TimelineAnimationUtilities.IsAnimationClip))
  61. return ActionValidity.NotApplicable;
  62. var director = TimelineEditor.inspectedDirector;
  63. if (TimelineEditor.inspectedDirector == null)
  64. return ActionValidity.NotApplicable;
  65. if (clips.Any(c => IsValidClip(c, director)))
  66. return ActionValidity.Valid;
  67. return ActionValidity.NotApplicable;
  68. }
  69. }
  70. [ApplyDefaultUndo]
  71. [MenuEntry("Reset Offsets", MenuPriority.CustomClipActionSection.resetOffset), UsedImplicitly]
  72. class ResetOffsets : ClipAction
  73. {
  74. public override bool Execute(IEnumerable<TimelineClip> clips)
  75. {
  76. AnimationOffsetMenu.ResetClipOffsets(clips.Where(TimelineAnimationUtilities.IsAnimationClip).ToArray());
  77. return true;
  78. }
  79. public override ActionValidity Validate(IEnumerable<TimelineClip> clips)
  80. {
  81. if (!clips.All(TimelineAnimationUtilities.IsAnimationClip))
  82. return ActionValidity.NotApplicable;
  83. return ActionValidity.Valid;
  84. }
  85. }
  86. }