public static IRadicalYieldInstruction Wait(this ISPAnim anim, SPTimePeriod period, bool stopAnimOnComplete)
        {
            if (anim == null)
            {
                throw new System.ArgumentNullException("anim");
            }

            if (!anim.IsPlaying || period.Seconds <= 0f)
            {
                return(null);                                         //yielding to when a non-playing anim finishes is just one frame, yield null
            }
            if (period.Seconds == float.PositiveInfinity && anim is IRadicalYieldInstruction)
            {
                return(anim as IRadicalYieldInstruction); //SPAnim can be used directly as a yield instruction to its end
            }
            else
            {
                var handle = RadicalWaitHandle.Create();
                anim.Schedule((a) =>
                {
                    if (stopAnimOnComplete && a.IsPlaying)
                    {
                        a.Stop();
                    }
                    handle.SignalComplete();
                }, period.Seconds, period.TimeSupplier);
                return(handle);
            }
        }
        public static void Schedule(this ISPAnim anim, System.Action <ISPAnim> callback, SPTimePeriod period)
        {
            if (anim == null)
            {
                throw new System.ArgumentNullException("anim");
            }

            anim.Schedule(callback, period.Seconds, period.TimeSupplier);
        }
        public override bool Trigger(object sender, object arg)
        {
            if (!this.CanTrigger)
            {
                return(false);
            }

            var anim = _targetAnimator.GetTarget <ISPAnimationSource>(arg);

            if (anim == null || !anim.CanPlayAnim)
            {
                return(false);
            }

            var id = _clipIDs.PickRandom();

            _currentAnimState = anim.GetAnim(id);
            if (_currentAnimState == null)
            {
                //this.Invoke(() => { this.OnAnimCompleteCallback(null); }, 0f);
                if (_triggerCompleteIfNoAnim)
                {
                    this.Invoke(() => { _onAnimComplete.ActivateTrigger(this, arg); }, 0f);
                }
                return(false);
            }

            _currentAnimState.TimeSupplier = _timeSupplier.TimeSupplier;
            _currentAnimState.Play(_speed, _startTime, QueueMode.PlayNow, _playMode);
            _currentAnimState.Schedule((s) =>
            {
                _currentAnimState = null;
                _onAnimComplete.ActivateTrigger(this, arg);
            });

            return(true);
        }