// Animancer // https://kybernetik.com.au/animancer // Copyright 2018-2024 Kybernetik // using System; using System.Collections.Generic; using UnityEngine; namespace Animancer { /// A [] wrapper around an . /// /// This allows Transition Assets to be referenced inside [] /// fields which can't directly reference s. /// /// Documentation: /// /// Transition Assets /// /// https://kybernetik.com.au/animancer/api/Animancer/TransitionAssetReference [Serializable] public class TransitionAssetReference : IAnimationClipSource, ICopyable, IPolymorphic, ITransitionDetailed, IWrapper { /************************************************************************************************************************/ [SerializeField] private TransitionAssetBase _Asset; /// [] The wrapped Transition Asset. public ref TransitionAssetBase Asset => ref _Asset; /************************************************************************************************************************/ /// Creates a new . public TransitionAssetReference() { } /// Creates a new . public TransitionAssetReference(TransitionAssetBase asset) { _Asset = asset; } /************************************************************************************************************************/ /// object IWrapper.WrappedObject => _Asset; /************************************************************************************************************************/ /// Can this transition create a valid ? public virtual bool IsValid => _Asset.IsValid(); /// public virtual float FadeDuration => _Asset != null ? _Asset.FadeDuration : 0; /// public virtual object Key => _Asset != null ? _Asset.Key : null; /// public virtual FadeMode FadeMode => _Asset != null ? _Asset.FadeMode : default; /// public bool IsLooping => _Asset != null && _Asset.IsLooping; /// public float NormalizedStartTime { get => _Asset != null ? _Asset.NormalizedStartTime : float.NaN; set => _Asset.NormalizedStartTime = value;// No null check. Don't silently ignore commands. } /// public float MaximumDuration => _Asset != null ? _Asset.MaximumDuration : 0; /// public float Speed { get => _Asset != null ? _Asset.Speed : 1; set => _Asset.Speed = value;// No null check. Don't silently ignore commands. } /// public virtual AnimancerState CreateState() => _Asset.CreateState(); /// public virtual void Apply(AnimancerState state) => _Asset.Apply(state); /************************************************************************************************************************/ /// [] /// Calls . /// public virtual void GetAnimationClips(List clips) => clips.GatherFromSource(_Asset); /************************************************************************************************************************/ /// public void CopyFrom(TransitionAssetReference copyFrom, CloneContext context) { if (copyFrom == null) { _Asset = default; return; } _Asset = copyFrom._Asset; } /************************************************************************************************************************/ /// Describes the . public override string ToString() => $"{nameof(TransitionAssetReference)}({_Asset})"; /************************************************************************************************************************/ } }