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