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); }