AnimationClipPreview.cs 3.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. // Animancer // https://kybernetik.com.au/animancer // Copyright 2018-2024 Kybernetik //
  2. #if UNITY_EDITOR && UNITY_IMGUI
  3. #pragma warning disable CS0618 // Type or member is obsolete.
  4. using System;
  5. using System.Collections.Generic;
  6. using UnityEditor;
  7. using UnityEngine;
  8. namespace Animancer.Editor.Previews
  9. {
  10. /// <summary>[Editor-Only] A minimal <see cref="ITransitionDetailed"/> to preview an <see cref="AnimationClip"/>.</summary>
  11. /// <remarks>
  12. /// <strong>Documentation:</strong>
  13. /// <see href="https://kybernetik.com.au/animancer/docs/manual/transitions#previews">
  14. /// Previews</see>
  15. /// </remarks>
  16. /// https://kybernetik.com.au/animancer/api/Animancer.Editor.Previews/AnimationClipPreview
  17. ///
  18. [AnimancerHelpUrl(typeof(AnimationClipPreview))]
  19. internal class AnimationClipPreview : ScriptableObject
  20. {
  21. /************************************************************************************************************************/
  22. [SerializeField]
  23. private Transition _Transition;
  24. /************************************************************************************************************************/
  25. [Serializable]
  26. [Obsolete("Only intended for internal use.")]// Prevent this type from showing up in [SerializeReference] fields.
  27. private class Transition : ITransitionDetailed, IAnimationClipCollection
  28. {
  29. /************************************************************************************************************************/
  30. [SerializeField]
  31. private AnimationClip _Clip;
  32. public ref AnimationClip Clip => ref _Clip;
  33. /************************************************************************************************************************/
  34. public object Key => _Clip;
  35. public float FadeDuration => 0;
  36. public FadeMode FadeMode => default;
  37. public AnimancerState CreateState() => new ClipState(_Clip);
  38. public void Apply(AnimancerState state) { }
  39. public bool IsValid => _Clip != null;
  40. public bool IsLooping => _Clip.isLooping;
  41. public float NormalizedStartTime { get => float.NaN; set => throw new NotSupportedException(); }
  42. public float MaximumDuration => _Clip.length;
  43. public float Speed { get => 1; set => throw new NotSupportedException(); }
  44. /************************************************************************************************************************/
  45. public void GatherAnimationClips(ICollection<AnimationClip> clips) => clips.Add(_Clip);
  46. /************************************************************************************************************************/
  47. }
  48. /************************************************************************************************************************/
  49. [MenuItem("CONTEXT/" + nameof(AnimationClip) + "/Preview")]
  50. private static void Preview(MenuCommand command)
  51. {
  52. var preview = FindObjectOfType<AnimationClipPreview>();
  53. if (preview == null)
  54. {
  55. preview = CreateInstance<AnimationClipPreview>();
  56. preview.hideFlags = HideFlags.HideInHierarchy | HideFlags.DontSave;
  57. }
  58. preview._Transition = new Transition
  59. {
  60. Clip = (AnimationClip)command.context
  61. };
  62. var serializedObject = new SerializedObject(preview);
  63. var property = serializedObject.FindProperty(nameof(_Transition));
  64. TransitionPreviewWindow.OpenOrClose(property);
  65. }
  66. /************************************************************************************************************************/
  67. }
  68. }
  69. #endif