AnimancerGraphControls.cs 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. // Animancer // https://kybernetik.com.au/animancer // Copyright 2018-2024 Kybernetik //
  2. #if UNITY_EDITOR && UNITY_IMGUI
  3. using Animancer.Units;
  4. using System;
  5. using UnityEditor;
  6. using UnityEngine;
  7. using static Animancer.Editor.AnimancerGUI;
  8. using Object = UnityEngine.Object;
  9. namespace Animancer.Editor
  10. {
  11. /// <summary>[Editor-Only] Draws manual controls for the <see cref="AnimancerGraph.PlayableGraph"/>.</summary>
  12. /// https://kybernetik.com.au/animancer/api/Animancer.Editor/AnimancerGraphControls
  13. [Serializable, InternalSerializableType]
  14. public class AnimancerGraphControls : AnimancerSettingsGroup
  15. {
  16. /************************************************************************************************************************/
  17. /// <summary>Draws manual controls for the <see cref="AnimancerGraph.PlayableGraph"/>.</summary>
  18. public static void DoGraphGUI(AnimancerGraph graph, out Rect area)
  19. {
  20. GUILayout.BeginVertical();
  21. DoSpeedSliderGUI(graph);
  22. DoAddAnimationGUI(graph);
  23. GUILayout.EndVertical();
  24. area = GUILayoutUtility.GetLastRect();
  25. }
  26. /************************************************************************************************************************/
  27. /// <summary>Draws the <see cref="AnimancerGraphSpeedSlider"/>.</summary>
  28. private static void DoSpeedSliderGUI(AnimancerGraph graph)
  29. {
  30. if (!AnimancerGraphSpeedSlider.Instance.IsOn)
  31. return;
  32. var area = LayoutSingleLineRect();
  33. area = area.Expand(StandardSpacing, 0);
  34. AnimancerGraphSpeedSlider.Instance.Graph = graph;
  35. AnimancerGraphSpeedSlider.Instance.DoSpeedSlider(ref area, null);
  36. }
  37. /************************************************************************************************************************/
  38. /// <summary>Draws a toggle to play and pause the graph.</summary>
  39. public static void DoPlayPauseToggle(Rect area, AnimancerGraph graph, GUIStyle style = null)
  40. {
  41. graph.IsGraphPlaying = AnimancerGUI.DoPlayPauseToggle(
  42. area,
  43. graph.IsGraphPlaying,
  44. style);
  45. }
  46. /************************************************************************************************************************/
  47. /// <summary>Draws a button to step time forward.</summary>
  48. public static void DoFrameStepButton(Rect area, AnimancerGraph graph, GUIStyle style)
  49. {
  50. if (GUI.Button(area, AnimancerIcons.StepForwardIcon, style))
  51. graph.Evaluate(FrameStep);
  52. }
  53. /************************************************************************************************************************/
  54. #region Add Animation
  55. /************************************************************************************************************************/
  56. private static void DoAddAnimationGUI(AnimancerGraph graph)
  57. {
  58. if (!AnimancerGraphDrawer.ShowAddAnimation)
  59. return;
  60. var label = "Add Animation";
  61. var area = LayoutSingleLineRect(SpacingMode.Before);
  62. var labelArea = StealFromLeft(ref area, EditorStyles.label.CalculateWidth(label), StandardSpacing);
  63. var objectArea = StealFromRight(ref area, area.width * 0.35f, StandardSpacing);
  64. var clipArea = area;
  65. var indentLevel = EditorGUI.indentLevel;
  66. EditorGUI.indentLevel = 0;
  67. GUI.Label(labelArea, label);
  68. var sourceClip = EditorGUI.ObjectField(clipArea, null, typeof(AnimationClip), false);
  69. var source = EditorGUI.ObjectField(objectArea, null, typeof(Object), false);
  70. EditorGUI.indentLevel = indentLevel;
  71. if (sourceClip is AnimationClip sourceClipTyped)
  72. {
  73. graph.Layers[0].Play(sourceClipTyped);
  74. return;
  75. }
  76. if (source == null)
  77. return;
  78. if (source is ITransition transition)
  79. {
  80. graph.Layers[0].Play(transition);
  81. return;
  82. }
  83. var transitionAsset = TryCreateTransitionAttribute.TryCreateTransitionAsset(source);
  84. if (transitionAsset != null)
  85. {
  86. var state = graph.Layers[0].Play(transitionAsset);
  87. if (!EditorUtility.IsPersistent(transitionAsset))
  88. {
  89. state.SetDebugName(source);
  90. Object.DestroyImmediate(transitionAsset);
  91. }
  92. return;
  93. }
  94. using (SetPool<AnimationClip>.Instance.Acquire(out var clips))
  95. {
  96. clips.GatherFromSource(source);
  97. foreach (var clip in clips)
  98. graph.Layers[0].Play(clip);
  99. }
  100. }
  101. /************************************************************************************************************************/
  102. #endregion
  103. /************************************************************************************************************************/
  104. #region Settings
  105. /************************************************************************************************************************/
  106. /// <inheritdoc/>
  107. public override string DisplayName
  108. => "Graph Controls";
  109. /// <inheritdoc/>
  110. public override int Index
  111. => 2;
  112. /************************************************************************************************************************/
  113. [SerializeField]
  114. [Seconds(Rule = Validate.Value.IsNotNegative)]
  115. [DefaultValue(0.02f)]
  116. [Tooltip("The amount of time that will be added by a single frame step")]
  117. private float _FrameStep = 0.02f;
  118. /// <summary>The amount of time that will be added by a single frame step (in seconds).</summary>
  119. public static float FrameStep
  120. => AnimancerSettingsGroup<AnimancerGraphControls>.Instance._FrameStep;
  121. /************************************************************************************************************************/
  122. #endregion
  123. /************************************************************************************************************************/
  124. }
  125. }
  126. #endif