TransitionAssetBase.cs 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. // Animancer // https://kybernetik.com.au/animancer // Copyright 2018-2024 Kybernetik //
  2. using System;
  3. using System.Collections.Generic;
  4. using UnityEngine;
  5. namespace Animancer
  6. {
  7. /// <summary>A <see cref="ScriptableObject"/> based <see cref="ITransition"/>.</summary>
  8. /// <remarks>
  9. /// <strong>Documentation:</strong>
  10. /// <see href="https://kybernetik.com.au/animancer/docs/manual/transitions/assets">
  11. /// Transition Assets</see>
  12. /// <para></para>
  13. /// When adding a <see cref="CreateAssetMenuAttribute"/> to any derived classes, you can use
  14. /// <see cref="Strings.MenuPrefix"/> and <see cref="Strings.AssetMenuOrder"/>.
  15. /// </remarks>
  16. /// https://kybernetik.com.au/animancer/api/Animancer/TransitionAssetBase
  17. [AnimancerHelpUrl(typeof(TransitionAssetBase))]
  18. public abstract partial class TransitionAssetBase : ScriptableObject,
  19. ITransition,
  20. ITransitionDetailed,
  21. IWrapper,
  22. IAnimationClipSource
  23. {
  24. /************************************************************************************************************************/
  25. /// <summary>The name of the serialized backing field of <see cref="GetTransition"/>.</summary>
  26. public const string TransitionField = "_Transition";
  27. /************************************************************************************************************************/
  28. /// <summary>Returns the <see cref="ITransitionDetailed"/> wrapped by this <see cref="ScriptableObject"/>.</summary>
  29. public abstract ITransitionDetailed GetTransition();
  30. /// <inheritdoc/>
  31. object IWrapper.WrappedObject
  32. => this != null
  33. ? GetTransition()
  34. : null;
  35. /************************************************************************************************************************/
  36. /// <inheritdoc/>
  37. public virtual float FadeDuration => GetTransition().FadeDuration;
  38. /// <inheritdoc/>
  39. public virtual object Key => GetTransition().Key;
  40. /// <inheritdoc/>
  41. public virtual FadeMode FadeMode => GetTransition().FadeMode;
  42. /// <inheritdoc/>
  43. public virtual AnimancerState CreateState() => GetTransition().CreateState();
  44. /// <inheritdoc/>
  45. public virtual void Apply(AnimancerState state)
  46. {
  47. GetTransition().Apply(state);
  48. state.SetDebugName(this);
  49. }
  50. /************************************************************************************************************************/
  51. /// <summary>Can this transition create a valid <see cref="AnimancerState"/>?</summary>
  52. /// <remarks>
  53. /// Use <see cref="AnimancerUtilities.IsValid(ITransition)"/>
  54. /// to also null check this reference, i.e: <c>transition.IsValid()</c>.
  55. /// </remarks>
  56. public virtual bool IsValid
  57. => this != null
  58. && GetTransition().IsValid();
  59. /// <inheritdoc/>
  60. public bool IsLooping => GetTransition().IsLooping;
  61. /// <inheritdoc/>
  62. public float NormalizedStartTime
  63. {
  64. get => GetTransition().NormalizedStartTime;
  65. set => GetTransition().NormalizedStartTime = value;
  66. }
  67. /// <inheritdoc/>
  68. public float MaximumDuration => GetTransition().MaximumDuration;
  69. /// <inheritdoc/>
  70. public float Speed
  71. {
  72. get => GetTransition().Speed;
  73. set => GetTransition().Speed = value;
  74. }
  75. /************************************************************************************************************************/
  76. /// <summary>[<see cref="IAnimationClipSource"/>]
  77. /// Calls <see cref="AnimancerUtilities.GatherFromSource(ICollection{AnimationClip}, object)"/>.
  78. /// </summary>
  79. public virtual void GetAnimationClips(List<AnimationClip> clips)
  80. => clips.GatherFromSource(GetTransition());
  81. /************************************************************************************************************************/
  82. #if UNITY_EDITOR
  83. /// <summary>[Editor-Only] Creates an instance of the main non-abstract inheritor of this class.</summary>
  84. /// <remarks><c>TransitionAsset</c> sets this to use itself by default.</remarks>
  85. public static new Func<ITransitionDetailed, TransitionAssetBase> CreateInstance { get; set; }
  86. #endif
  87. /************************************************************************************************************************/
  88. }
  89. }