123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- // Animancer // https://kybernetik.com.au/animancer // Copyright 2018-2024 Kybernetik //
- using UnityEngine.Playables;
- namespace Animancer
- {
- /// <summary>A utility for re-assigning Animancer's <see cref="PlayableOutput"/>.</summary>
- ///
- /// <remarks>
- /// This should be totally useless, but for some reason it seems to fix an issue with Unity's
- /// Animation Rigging package. Normally, all of the Rig's parameters get reset to their
- /// starting values any time a playable is connected or disconnected (which Animancer does frequently),
- /// but using this utility effectively re-captures the starting values
- /// so any subsequent resets retain the values you set.
- /// <para></para>
- /// <strong>Example:</strong>
- /// <para></para><code>
- /// public class PlayableOutputRefresherExample : MonoBehaviour
- /// {
- /// [SerializeField] private AnimancerComponent _Animancer;
- /// [SerializeField] private Rig _Rig;
- ///
- /// // A field to store it in.
- /// private PlayableOutputRefresher _OutputRefresher;
- ///
- /// protected virtual void OnEnable()
- /// {
- /// // Initialize on startup.
- /// _OutputRefresher = new(_Animancer);
- /// }
- ///
- /// public void SetWeight(float weight)
- /// {
- /// // Change something that would be reset.
- /// _Rig.weight = weight;
- ///
- /// // Then call this afterwards.
- /// _OutputRefresher.Refresh();
- /// }
- /// }
- /// </code></remarks>
- ///
- /// https://kybernetik.com.au/animancer/api/Animancer/PlayableOutputRefresher
- ///
- public struct PlayableOutputRefresher
- {
- /************************************************************************************************************************/
- /// <summary>The <see cref="PlayableOutput"/> of Animancer's <see cref="PlayableGraph"/>.</summary>
- public PlayableOutput Output { get; set; }
- /// <summary>The root <see cref="Playable"/> of Animancer's <see cref="PlayableGraph"/>.</summary>
- public Playable Root { get; set; }
- /************************************************************************************************************************/
- /// <summary>Creates a new <see cref="PlayableOutputRefresher"/>.</summary>
- public PlayableOutputRefresher(PlayableOutput output)
- {
- Output = output;
- Root = Output.GetSourcePlayable();
- }
- /************************************************************************************************************************/
- /// <summary>Creates a new <see cref="PlayableOutputRefresher"/>.</summary>
- public PlayableOutputRefresher(AnimancerGraph animancer)
- : this(animancer.Output)
- { }
- /************************************************************************************************************************/
- /// <summary>Re-assigns the <see cref="Root"/> as the source playable of the <see cref="Output"/>.</summary>
- public readonly void Refresh()
- => Output.SetSourcePlayable(Root);
- /************************************************************************************************************************/
- /// <summary>Re-acquires the <see cref="Root"/> from the <see cref="Output"/>.</summary>
- /// <remarks>Call this after <see cref="AnimancerGraph.InsertOutputPlayable"/>.</remarks>
- public void OnSourcePlayableChanged()
- => Root = Output.GetSourcePlayable();
- /************************************************************************************************************************/
- }
- }
|