AnimationClipPreview.cs 3.8 KB

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