AnimationOffsetMenu.cs 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. using System.Linq;
  2. using UnityEngine;
  3. using UnityEngine.Timeline;
  4. namespace UnityEditor.Timeline
  5. {
  6. static class AnimationOffsetMenu
  7. {
  8. public static GUIContent MatchPreviousMenuItem = EditorGUIUtility.TrTextContent("Match Offsets To Previous Clip");
  9. public static GUIContent MatchNextMenuItem = EditorGUIUtility.TrTextContent("Match Offsets To Next Clip");
  10. public static string MatchFieldsPrefix = "Match Offsets Fields/";
  11. public static GUIContent ResetOffsetMenuItem = EditorGUIUtility.TrTextContent("Reset Offsets");
  12. static bool EnforcePreviewMode(WindowState state)
  13. {
  14. state.previewMode = true; // try and set the preview mode
  15. if (!state.previewMode)
  16. {
  17. Debug.LogError("Match clips cannot be completed because preview mode cannot be enabed");
  18. return false;
  19. }
  20. return true;
  21. }
  22. internal static void MatchClipsToPrevious(WindowState state, TimelineClip[] clips)
  23. {
  24. if (!EnforcePreviewMode(state))
  25. return;
  26. clips = clips.OrderBy(x => x.start).ToArray();
  27. foreach (var clip in clips)
  28. {
  29. var sceneObject = TimelineUtility.GetSceneGameObject(state.editSequence.director, clip.parentTrack);
  30. if (sceneObject != null)
  31. {
  32. TimelineUndo.PushUndo(clip.asset, "Match Clip");
  33. TimelineAnimationUtilities.MatchPrevious(clip, sceneObject.transform, state.editSequence.director);
  34. }
  35. }
  36. InspectorWindow.RepaintAllInspectors();
  37. TimelineEditor.Refresh(RefreshReason.ContentsModified);
  38. }
  39. internal static void MatchClipsToNext(WindowState state, TimelineClip[] clips)
  40. {
  41. if (!EnforcePreviewMode(state))
  42. return;
  43. clips = clips.OrderByDescending(x => x.start).ToArray();
  44. foreach (var clip in clips)
  45. {
  46. var sceneObject = TimelineUtility.GetSceneGameObject(state.editSequence.director, clip.parentTrack);
  47. if (sceneObject != null)
  48. {
  49. TimelineUndo.PushUndo(clip.asset, "Match Clip");
  50. TimelineAnimationUtilities.MatchNext(clip, sceneObject.transform, state.editSequence.director);
  51. }
  52. }
  53. InspectorWindow.RepaintAllInspectors();
  54. TimelineEditor.Refresh(RefreshReason.ContentsModified);
  55. }
  56. public static void ResetClipOffsets(WindowState state, TimelineClip[] clips)
  57. {
  58. foreach (var clip in clips)
  59. {
  60. if (clip.asset is AnimationPlayableAsset)
  61. {
  62. TimelineUndo.PushUndo(clip.asset, "Reset Offsets");
  63. var playableAsset = (AnimationPlayableAsset)clip.asset;
  64. playableAsset.ResetOffsets();
  65. }
  66. }
  67. state.rebuildGraph = true;
  68. InspectorWindow.RepaintAllInspectors();
  69. TimelineEditor.Refresh(RefreshReason.SceneNeedsUpdate);
  70. }
  71. }
  72. }