// ReSharper disable MemberCanBePrivate.Global // ReSharper disable UnusedMember.Global // ReSharper disable UnusedMethodReturnValue.Global using System; using JetBrains.Annotations; using UnityEngine; namespace PrimeTween { public partial struct Tween { /// Returns the number of alive tweens. /// If specified, returns the number of running tweens on the target. Please note: if target is specified, this method call has O(n) complexity where n is the total number of running tweens. public static int GetTweensCount([CanBeNull] object onTarget = null) { #if UNITY_EDITOR if (Constants.warnNoInstance) { return default; } #endif var manager = PrimeTweenManager.Instance; if (onTarget == null && manager.updateDepth == 0) { int result = manager.tweensCount; #if PRIME_TWEEN_SAFETY_CHECKS && UNITY_ASSERTIONS Assert.AreEqual(result, PrimeTweenManager.processAll(null, _ => true, true)); #endif return result; } return PrimeTweenManager.processAll(onTarget, _ => true, true); // call processAll to filter null tweens } #if PRIME_TWEEN_EXPERIMENTAL public static int GetTweensCapacity() { var instance = PrimeTweenConfig.Instance; if (instance == null) { return PrimeTweenManager.customInitialCapacity; } return instance.currentPoolCapacity; } public static Tween Custom(Double startValue, Double endValue, float duration, [NotNull] Action onValueChange, Ease ease = Ease.Default, int cycles = 1, CycleMode cycleMode = CycleMode.Restart, float startDelay = 0, float endDelay = 0, bool useUnscaledTime = false) => Custom(new TweenSettings(startValue, endValue, new TweenSettings(duration, ease, cycles, cycleMode, startDelay, endDelay, useUnscaledTime)), onValueChange); public static Tween Custom(Double startValue, Double endValue, float duration, [NotNull] Action onValueChange, Easing ease, int cycles = 1, CycleMode cycleMode = CycleMode.Restart, float startDelay = 0, float endDelay = 0, bool useUnscaledTime = false) => Custom(new TweenSettings(startValue, endValue, new TweenSettings(duration, ease, cycles, cycleMode, startDelay, endDelay, useUnscaledTime)), onValueChange); public static Tween Custom(Double startValue, Double endValue, TweenSettings settings, [NotNull] Action onValueChange) => Custom(new TweenSettings(startValue, endValue, settings), onValueChange); public static Tween Custom(TweenSettings settings, [NotNull] Action onValueChange) { Assert.IsNotNull(onValueChange); if (settings.startFromCurrent) { Debug.LogWarning(Constants.customTweensDontSupportStartFromCurrentWarning); } var tween = PrimeTweenManager.fetchTween(); tween.startValue.CopyFrom(ref settings.startValue); tween.endValue.CopyFrom(ref settings.endValue); tween.customOnValueChange = onValueChange; tween.Setup(PrimeTweenManager.dummyTarget, ref settings.settings, _tween => { var _onValueChange = _tween.customOnValueChange as Action; var val = _tween.DoubleVal; try { _onValueChange(val); } catch (Exception e) { Assert.LogError($"Tween was stopped because of exception in {nameof(onValueChange)} callback, tween: {_tween.GetDescription()}, exception:\n{e}\n", _tween.id, _tween.target as UnityEngine.Object); _tween.EmergencyStop(); } }, null, false, TweenType.CustomDouble); return PrimeTweenManager.Animate(tween); } public static Tween Custom([NotNull] T target, Double startValue, Double endValue, float duration, [NotNull] Action onValueChange, Ease ease = Ease.Default, int cycles = 1, CycleMode cycleMode = CycleMode.Restart, float startDelay = 0, float endDelay = 0, bool useUnscaledTime = false) where T : class => Custom_internal(target, new TweenSettings(startValue, endValue, new TweenSettings(duration, ease, cycles, cycleMode, startDelay, endDelay, useUnscaledTime)), onValueChange); public static Tween Custom([NotNull] T target, Double startValue, Double endValue, float duration, [NotNull] Action onValueChange, Easing ease, int cycles = 1, CycleMode cycleMode = CycleMode.Restart, float startDelay = 0, float endDelay = 0, bool useUnscaledTime = false) where T : class => Custom_internal(target, new TweenSettings(startValue, endValue, new TweenSettings(duration, ease, cycles, cycleMode, startDelay, endDelay, useUnscaledTime)), onValueChange); public static Tween Custom([NotNull] T target, Double startValue, Double endValue, TweenSettings settings, [NotNull] Action onValueChange) where T : class => Custom_internal(target, new TweenSettings(startValue, endValue, settings), onValueChange); public static Tween Custom([NotNull] T target, TweenSettings settings, [NotNull] Action onValueChange) where T : class => Custom_internal(target, settings, onValueChange); public static Tween CustomAdditive([NotNull] T target, Double deltaValue, TweenSettings settings, [NotNull] Action onDeltaChange) where T : class => Custom_internal(target, new TweenSettings(default, deltaValue, settings), onDeltaChange, true); static Tween Custom_internal([NotNull] T target, TweenSettings settings, [NotNull] Action onValueChange, bool isAdditive = false) where T : class { Assert.IsNotNull(onValueChange); if (settings.startFromCurrent) { Debug.LogWarning(Constants.customTweensDontSupportStartFromCurrentWarning); } var tween = PrimeTweenManager.fetchTween(); tween.startValue.CopyFrom(ref settings.startValue); tween.endValue.CopyFrom(ref settings.endValue); tween.customOnValueChange = onValueChange; tween.isAdditive = isAdditive; tween.Setup(target, ref settings.settings, _tween => { var _onValueChange = _tween.customOnValueChange as Action; var _target = _tween.target as T; Double val; if (_tween.isAdditive) { var newVal = _tween.DoubleVal; val = newVal.calcDelta(_tween.prevVal); _tween.prevVal.DoubleVal = newVal; } else { val = _tween.DoubleVal; } try { _onValueChange(_target, val); } catch (Exception e) { Assert.LogError($"Tween was stopped because of exception in {nameof(onValueChange)} callback, tween: {_tween.GetDescription()}, exception:\n{e}\n", _tween.id, _tween.target as UnityEngine.Object); _tween.EmergencyStop(); } }, null, false, TweenType.CustomDouble); return PrimeTweenManager.Animate(tween); } #endif /// Stops all tweens and sequences.
/// If is provided, stops only tweens on this target (stopping a tween inside a Sequence is not allowed).
/// The number of stopped tweens. public static int StopAll([CanBeNull] object onTarget = null) { var result = PrimeTweenManager.processAll(onTarget, tween => { if (tween.IsInSequence()) { if (tween.isMainSequenceRoot()) { tween.sequence.Stop(); } // do nothing with nested tween or sequence. The main sequence root will process it } else { tween.kill(); } return true; }, false); forceUpdateManagerIfTargetIsNull(onTarget); return result; } /// Completes all tweens and sequences.
/// If is provided, completes only tweens on this target (completing a tween inside a Sequence is not allowed).
/// The number of completed tweens. public static int CompleteAll([CanBeNull] object onTarget = null) { var result = PrimeTweenManager.processAll(onTarget, tween => { if (tween.IsInSequence()) { if (tween.isMainSequenceRoot()) { tween.sequence.Complete(); } // do nothing with nested tween or sequence. The main sequence root will process it } else { tween.ForceComplete(); } return true; }, false); forceUpdateManagerIfTargetIsNull(onTarget); return result; } static void forceUpdateManagerIfTargetIsNull([CanBeNull] object onTarget) { if (onTarget == null) { var manager = PrimeTweenManager.Instance; if (manager != null) { if (manager.updateDepth == 0) { manager.Update(); manager.LateUpdate(); manager.FixedUpdate(); } // Assert.AreEqual(0, manager.tweens.Count); // fails if user's OnComplete() creates new tweens } } } /// Pauses/unpauses all tweens and sequences.
/// If is provided, pauses/unpauses only tweens on this target (pausing/unpausing a tween inside a Sequence is not allowed).
/// The number of paused/unpaused tweens. public static int SetPausedAll(bool isPaused, [CanBeNull] object onTarget = null) { if (isPaused) { return PrimeTweenManager.processAll(onTarget, tween => { return tween.trySetPause(true); }, false); } return PrimeTweenManager.processAll(onTarget, tween => { return tween.trySetPause(false); }, false); } /// Please note: delay may outlive the caller (the calling UnityEngine.Object may already be destroyed). /// When using this overload, it's user's responsibility to ensure that is safe to execute once the delay is finished. /// It's preferable to use the overload because it checks if the UnityEngine.Object target is still alive before calling the . /// https://github.com/KyryloKuzyk/PrimeTween/discussions/4 public static Tween Delay(float duration, [CanBeNull] Action onComplete = null, bool useUnscaledTime = false, bool warnIfTargetDestroyed = true) { return delay(PrimeTweenManager.dummyTarget, duration, onComplete, useUnscaledTime, warnIfTargetDestroyed); } /// https://github.com/KyryloKuzyk/PrimeTween/discussions/4 public static Tween Delay([NotNull] object target, float duration, [CanBeNull] Action onComplete = null, bool useUnscaledTime = false, bool warnIfTargetDestroyed = true) { return delay(target, duration, onComplete, useUnscaledTime, warnIfTargetDestroyed); } static Tween delay([CanBeNull] object target, float duration, [CanBeNull] Action onComplete, bool useUnscaledTime, bool warnIfTargetDestroyed) { var result = delay_internal(target, duration, useUnscaledTime); if (onComplete != null) { result?.tween.OnComplete(onComplete, warnIfTargetDestroyed); } return result ?? default; } /// This is the most preferable overload of all Delay functions:
/// - It checks if UnityEngine.Object target is still alive before calling the callback.
/// - It allows to call any method on without producing garbage.
/// /// /// Tween.Delay(this, duration: 1f, onComplete: _this => { /// // Please note: we're using '_this' variable from the onComplete callback. Calling DoSomething() directly will implicitly capture 'this' variable (creating a closure) and generate garbage. /// _this.DoSomething(); /// }); /// /// /// https://github.com/KyryloKuzyk/PrimeTween/discussions/4 public static Tween Delay([NotNull] T target, float duration, [NotNull] Action onComplete, bool useUnscaledTime = false, bool warnIfTargetDestroyed = true) where T : class { var maybeDelay = delay_internal(target, duration, useUnscaledTime); if (!maybeDelay.HasValue) { return default; } var delay = maybeDelay.Value; delay.tween.OnComplete(target, onComplete, warnIfTargetDestroyed); return delay; } static Tween? delay_internal([CanBeNull] object target, float duration, bool useUnscaledTime) { PrimeTweenManager.checkDuration(target, duration); return PrimeTweenManager.delayWithoutDurationCheck(target, duration, useUnscaledTime); } public static Tween MaterialColor([NotNull] Material target, int propertyId, Color endValue, float duration, Ease ease = default, int cycles = 1, CycleMode cycleMode = CycleMode.Restart, float startDelay = 0, float endDelay = 0, bool useUnscaledTime = false) => MaterialColor(target, propertyId, new TweenSettings(endValue, new TweenSettings(duration, ease, cycles, cycleMode, startDelay, endDelay, useUnscaledTime))); public static Tween MaterialColor([NotNull] Material target, int propertyId, Color endValue, float duration, Easing ease, int cycles = 1, CycleMode cycleMode = CycleMode.Restart, float startDelay = 0, float endDelay = 0, bool useUnscaledTime = false) => MaterialColor(target, propertyId, new TweenSettings(endValue, new TweenSettings(duration, ease, cycles, cycleMode, startDelay, endDelay, useUnscaledTime))); public static Tween MaterialColor([NotNull] Material target, int propertyId, Color startValue, Color endValue, float duration, Ease ease = default, int cycles = 1, CycleMode cycleMode = CycleMode.Restart, float startDelay = 0, float endDelay = 0, bool useUnscaledTime = false) => MaterialColor(target, propertyId, new TweenSettings(startValue, endValue, new TweenSettings(duration, ease, cycles, cycleMode, startDelay, endDelay, useUnscaledTime))); public static Tween MaterialColor([NotNull] Material target, int propertyId, Color startValue, Color endValue, float duration, Easing ease, int cycles = 1, CycleMode cycleMode = CycleMode.Restart, float startDelay = 0, float endDelay = 0, bool useUnscaledTime = false) => MaterialColor(target, propertyId, new TweenSettings(startValue, endValue, new TweenSettings(duration, ease, cycles, cycleMode, startDelay, endDelay, useUnscaledTime))); public static Tween MaterialColor([NotNull] Material target, int propertyId, Color endValue, TweenSettings settings) => MaterialColor(target, propertyId, new TweenSettings(endValue, settings)); public static Tween MaterialColor([NotNull] Material target, int propertyId, Color startValue, Color endValue, TweenSettings settings) => MaterialColor(target, propertyId, new TweenSettings(startValue, endValue, settings)); public static Tween MaterialColor([NotNull] Material target, int propertyId, TweenSettings settings) { return animateWithIntParam(target, propertyId, ref settings, tween => (tween.target as Material).SetColor(tween.intParam, tween.ColorVal), tween => (tween.target as Material).GetColor(tween.intParam).ToContainer(), TweenType.MaterialColorProperty); } public static Tween MaterialProperty([NotNull] Material target, int propertyId, float endValue, float duration, Ease ease = default, int cycles = 1, CycleMode cycleMode = CycleMode.Restart, float startDelay = 0, float endDelay = 0, bool useUnscaledTime = false) => MaterialProperty(target, propertyId, new TweenSettings(endValue, new TweenSettings(duration, ease, cycles, cycleMode, startDelay, endDelay, useUnscaledTime))); public static Tween MaterialProperty([NotNull] Material target, int propertyId, float endValue, float duration, Easing ease, int cycles = 1, CycleMode cycleMode = CycleMode.Restart, float startDelay = 0, float endDelay = 0, bool useUnscaledTime = false) => MaterialProperty(target, propertyId, new TweenSettings(endValue, new TweenSettings(duration, ease, cycles, cycleMode, startDelay, endDelay, useUnscaledTime))); public static Tween MaterialProperty([NotNull] Material target, int propertyId, float startValue, float endValue, float duration, Ease ease = default, int cycles = 1, CycleMode cycleMode = CycleMode.Restart, float startDelay = 0, float endDelay = 0, bool useUnscaledTime = false) => MaterialProperty(target, propertyId, new TweenSettings(startValue, endValue, new TweenSettings(duration, ease, cycles, cycleMode, startDelay, endDelay, useUnscaledTime))); public static Tween MaterialProperty([NotNull] Material target, int propertyId, float startValue, float endValue, float duration, Easing ease, int cycles = 1, CycleMode cycleMode = CycleMode.Restart, float startDelay = 0, float endDelay = 0, bool useUnscaledTime = false) => MaterialProperty(target, propertyId, new TweenSettings(startValue, endValue, new TweenSettings(duration, ease, cycles, cycleMode, startDelay, endDelay, useUnscaledTime))); public static Tween MaterialProperty([NotNull] Material target, int propertyId, float endValue, TweenSettings settings) => MaterialProperty(target, propertyId, new TweenSettings(endValue, settings)); public static Tween MaterialProperty([NotNull] Material target, int propertyId, float startValue, float endValue, TweenSettings settings) => MaterialProperty(target, propertyId, new TweenSettings(startValue, endValue, settings)); public static Tween MaterialProperty([NotNull] Material target, int propertyId, TweenSettings settings) { return animateWithIntParam(target, propertyId, ref settings, tween => (tween.target as Material).SetFloat(tween.intParam, tween.FloatVal), tween => (tween.target as Material).GetFloat(tween.intParam).ToContainer(), TweenType.MaterialProperty); } public static Tween MaterialAlpha([NotNull] Material target, int propertyId, float endValue, float duration, Ease ease = default, int cycles = 1, CycleMode cycleMode = CycleMode.Restart, float startDelay = 0, float endDelay = 0, bool useUnscaledTime = false) => MaterialAlpha(target, propertyId, new TweenSettings(endValue, new TweenSettings(duration, ease, cycles, cycleMode, startDelay, endDelay, useUnscaledTime))); public static Tween MaterialAlpha([NotNull] Material target, int propertyId, float endValue, float duration, Easing ease, int cycles = 1, CycleMode cycleMode = CycleMode.Restart, float startDelay = 0, float endDelay = 0, bool useUnscaledTime = false) => MaterialAlpha(target, propertyId, new TweenSettings(endValue, new TweenSettings(duration, ease, cycles, cycleMode, startDelay, endDelay, useUnscaledTime))); public static Tween MaterialAlpha([NotNull] Material target, int propertyId, float startValue, float endValue, float duration, Ease ease = default, int cycles = 1, CycleMode cycleMode = CycleMode.Restart, float startDelay = 0, float endDelay = 0, bool useUnscaledTime = false) => MaterialAlpha(target, propertyId, new TweenSettings(startValue, endValue, new TweenSettings(duration, ease, cycles, cycleMode, startDelay, endDelay, useUnscaledTime))); public static Tween MaterialAlpha([NotNull] Material target, int propertyId, float startValue, float endValue, float duration, Easing ease, int cycles = 1, CycleMode cycleMode = CycleMode.Restart, float startDelay = 0, float endDelay = 0, bool useUnscaledTime = false) => MaterialAlpha(target, propertyId, new TweenSettings(startValue, endValue, new TweenSettings(duration, ease, cycles, cycleMode, startDelay, endDelay, useUnscaledTime))); public static Tween MaterialAlpha([NotNull] Material target, int propertyId, float endValue, TweenSettings settings) => MaterialAlpha(target, propertyId, new TweenSettings(endValue, settings)); public static Tween MaterialAlpha([NotNull] Material target, int propertyId, float startValue, float endValue, TweenSettings settings) => MaterialAlpha(target, propertyId, new TweenSettings(startValue, endValue, settings)); public static Tween MaterialAlpha([NotNull] Material target, int propertyId, TweenSettings settings) { return animateWithIntParam(target, propertyId, ref settings, tween => { var _target = tween.target as Material; var _propId = tween.intParam; _target.SetColor(_propId, _target.GetColor(_propId).WithAlpha(tween.FloatVal)); }, tween => (tween.target as Material).GetColor(tween.intParam).a.ToContainer(), TweenType.MaterialAlphaProperty); } public static Tween MaterialTextureOffset([NotNull] Material target, int propertyId, Vector2 endValue, float duration, Ease ease = default, int cycles = 1, CycleMode cycleMode = CycleMode.Restart, float startDelay = 0, float endDelay = 0, bool useUnscaledTime = false) => MaterialTextureOffset(target, propertyId, new TweenSettings(endValue, new TweenSettings(duration, ease, cycles, cycleMode, startDelay, endDelay, useUnscaledTime))); public static Tween MaterialTextureOffset([NotNull] Material target, int propertyId, Vector2 endValue, float duration, Easing ease, int cycles = 1, CycleMode cycleMode = CycleMode.Restart, float startDelay = 0, float endDelay = 0, bool useUnscaledTime = false) => MaterialTextureOffset(target, propertyId, new TweenSettings(endValue, new TweenSettings(duration, ease, cycles, cycleMode, startDelay, endDelay, useUnscaledTime))); public static Tween MaterialTextureOffset([NotNull] Material target, int propertyId, Vector2 startValue, Vector2 endValue, float duration, Ease ease = default, int cycles = 1, CycleMode cycleMode = CycleMode.Restart, float startDelay = 0, float endDelay = 0, bool useUnscaledTime = false) => MaterialTextureOffset(target, propertyId, new TweenSettings(startValue, endValue, new TweenSettings(duration, ease, cycles, cycleMode, startDelay, endDelay, useUnscaledTime))); public static Tween MaterialTextureOffset([NotNull] Material target, int propertyId, Vector2 startValue, Vector2 endValue, float duration, Easing ease, int cycles = 1, CycleMode cycleMode = CycleMode.Restart, float startDelay = 0, float endDelay = 0, bool useUnscaledTime = false) => MaterialTextureOffset(target, propertyId, new TweenSettings(startValue, endValue, new TweenSettings(duration, ease, cycles, cycleMode, startDelay, endDelay, useUnscaledTime))); public static Tween MaterialTextureOffset([NotNull] Material target, int propertyId, Vector2 endValue, TweenSettings settings) => MaterialTextureOffset(target, propertyId, new TweenSettings(endValue, settings)); public static Tween MaterialTextureOffset([NotNull] Material target, int propertyId, Vector2 startValue, Vector2 endValue, TweenSettings settings) => MaterialTextureOffset(target, propertyId, new TweenSettings(startValue, endValue, settings)); public static Tween MaterialTextureOffset([NotNull] Material target, int propertyId, TweenSettings settings) { return animateWithIntParam(target, propertyId, ref settings, tween => (tween.target as Material).SetTextureOffset(tween.intParam, tween.Vector2Val), tween => (tween.target as Material).GetTextureOffset(tween.intParam).ToContainer(), TweenType.MaterialTextureOffset); } public static Tween MaterialTextureScale([NotNull] Material target, int propertyId, Vector2 endValue, float duration, Ease ease = default, int cycles = 1, CycleMode cycleMode = CycleMode.Restart, float startDelay = 0, float endDelay = 0, bool useUnscaledTime = false) => MaterialTextureScale(target, propertyId, new TweenSettings(endValue, new TweenSettings(duration, ease, cycles, cycleMode, startDelay, endDelay, useUnscaledTime))); public static Tween MaterialTextureScale([NotNull] Material target, int propertyId, Vector2 endValue, float duration, Easing ease, int cycles = 1, CycleMode cycleMode = CycleMode.Restart, float startDelay = 0, float endDelay = 0, bool useUnscaledTime = false) => MaterialTextureScale(target, propertyId, new TweenSettings(endValue, new TweenSettings(duration, ease, cycles, cycleMode, startDelay, endDelay, useUnscaledTime))); public static Tween MaterialTextureScale([NotNull] Material target, int propertyId, Vector2 startValue, Vector2 endValue, float duration, Ease ease = default, int cycles = 1, CycleMode cycleMode = CycleMode.Restart, float startDelay = 0, float endDelay = 0, bool useUnscaledTime = false) => MaterialTextureScale(target, propertyId, new TweenSettings(startValue, endValue, new TweenSettings(duration, ease, cycles, cycleMode, startDelay, endDelay, useUnscaledTime))); public static Tween MaterialTextureScale([NotNull] Material target, int propertyId, Vector2 startValue, Vector2 endValue, float duration, Easing ease, int cycles = 1, CycleMode cycleMode = CycleMode.Restart, float startDelay = 0, float endDelay = 0, bool useUnscaledTime = false) => MaterialTextureScale(target, propertyId, new TweenSettings(startValue, endValue, new TweenSettings(duration, ease, cycles, cycleMode, startDelay, endDelay, useUnscaledTime))); public static Tween MaterialTextureScale([NotNull] Material target, int propertyId, Vector2 endValue, TweenSettings settings) => MaterialTextureScale(target, propertyId, new TweenSettings(endValue, settings)); public static Tween MaterialTextureScale([NotNull] Material target, int propertyId, Vector2 startValue, Vector2 endValue, TweenSettings settings) => MaterialTextureScale(target, propertyId, new TweenSettings(startValue, endValue, settings)); public static Tween MaterialTextureScale([NotNull] Material target, int propertyId, TweenSettings settings) { return animateWithIntParam(target, propertyId, ref settings, tween => (tween.target as Material).SetTextureScale(tween.intParam, tween.Vector2Val), tween => (tween.target as Material).GetTextureScale(tween.intParam).ToContainer(), TweenType.MaterialTextureScale); } public static Tween MaterialProperty([NotNull] Material target, int propertyId, Vector4 endValue, float duration, Ease ease = default, int cycles = 1, CycleMode cycleMode = CycleMode.Restart, float startDelay = 0, float endDelay = 0, bool useUnscaledTime = false) => MaterialProperty(target, propertyId, new TweenSettings(endValue, new TweenSettings(duration, ease, cycles, cycleMode, startDelay, endDelay, useUnscaledTime))); public static Tween MaterialProperty([NotNull] Material target, int propertyId, Vector4 endValue, float duration, Easing ease, int cycles = 1, CycleMode cycleMode = CycleMode.Restart, float startDelay = 0, float endDelay = 0, bool useUnscaledTime = false) => MaterialProperty(target, propertyId, new TweenSettings(endValue, new TweenSettings(duration, ease, cycles, cycleMode, startDelay, endDelay, useUnscaledTime))); public static Tween MaterialProperty([NotNull] Material target, int propertyId, Vector4 startValue, Vector4 endValue, float duration, Ease ease = default, int cycles = 1, CycleMode cycleMode = CycleMode.Restart, float startDelay = 0, float endDelay = 0, bool useUnscaledTime = false) => MaterialProperty(target, propertyId, new TweenSettings(startValue, endValue, new TweenSettings(duration, ease, cycles, cycleMode, startDelay, endDelay, useUnscaledTime))); public static Tween MaterialProperty([NotNull] Material target, int propertyId, Vector4 startValue, Vector4 endValue, float duration, Easing ease, int cycles = 1, CycleMode cycleMode = CycleMode.Restart, float startDelay = 0, float endDelay = 0, bool useUnscaledTime = false) => MaterialProperty(target, propertyId, new TweenSettings(startValue, endValue, new TweenSettings(duration, ease, cycles, cycleMode, startDelay, endDelay, useUnscaledTime))); public static Tween MaterialProperty([NotNull] Material target, int propertyId, Vector4 endValue, TweenSettings settings) => MaterialProperty(target, propertyId, new TweenSettings(endValue, settings)); public static Tween MaterialProperty([NotNull] Material target, int propertyId, Vector4 startValue, Vector4 endValue, TweenSettings settings) => MaterialProperty(target, propertyId, new TweenSettings(startValue, endValue, settings)); public static Tween MaterialProperty([NotNull] Material target, int propertyId, TweenSettings settings) { return animateWithIntParam(target, propertyId, ref settings, tween => (tween.target as Material).SetVector(tween.intParam, tween.Vector4Val), tween => (tween.target as Material).GetVector(tween.intParam).ToContainer(), TweenType.MaterialPropertyVector4); } // No 'startFromCurrent' overload because euler angles animation should always have the startValue to prevent ambiguous results public static Tween EulerAngles([NotNull] Transform target, Vector3 startValue, Vector3 endValue, float duration, Ease ease = Ease.Default, int cycles = 1, CycleMode cycleMode = CycleMode.Restart, float startDelay = 0, float endDelay = 0, bool useUnscaledTime = false) => EulerAngles(target, new TweenSettings(startValue, endValue, new TweenSettings(duration, ease, cycles, cycleMode, startDelay, endDelay, useUnscaledTime))); public static Tween EulerAngles([NotNull] Transform target, Vector3 startValue, Vector3 endValue, float duration, Easing ease, int cycles = 1, CycleMode cycleMode = CycleMode.Restart, float startDelay = 0, float endDelay = 0, bool useUnscaledTime = false) => EulerAngles(target, new TweenSettings(startValue, endValue, new TweenSettings(duration, ease, cycles, cycleMode, startDelay, endDelay, useUnscaledTime))); public static Tween EulerAngles([NotNull] Transform target, Vector3 startValue, Vector3 endValue, TweenSettings settings) => EulerAngles(target, new TweenSettings(startValue, endValue, settings)); public static Tween EulerAngles([NotNull] Transform target, TweenSettings settings) { validateEulerAnglesData(ref settings); return animate(target, ref settings, _ => { (_.target as Transform).eulerAngles = _.Vector3Val; }, _ => (_.target as Transform).eulerAngles.ToContainer(), TweenType.EulerAngles); } public static Tween LocalEulerAngles([NotNull] Transform target, Vector3 startValue, Vector3 endValue, float duration, Ease ease = Ease.Default, int cycles = 1, CycleMode cycleMode = CycleMode.Restart, float startDelay = 0, float endDelay = 0, bool useUnscaledTime = false) => LocalEulerAngles(target, new TweenSettings(startValue, endValue, new TweenSettings(duration, ease, cycles, cycleMode, startDelay, endDelay, useUnscaledTime))); public static Tween LocalEulerAngles([NotNull] Transform target, Vector3 startValue, Vector3 endValue, float duration, Easing ease, int cycles = 1, CycleMode cycleMode = CycleMode.Restart, float startDelay = 0, float endDelay = 0, bool useUnscaledTime = false) => LocalEulerAngles(target, new TweenSettings(startValue, endValue, new TweenSettings(duration, ease, cycles, cycleMode, startDelay, endDelay, useUnscaledTime))); public static Tween LocalEulerAngles([NotNull] Transform target, Vector3 startValue, Vector3 endValue, TweenSettings settings) => LocalEulerAngles(target, new TweenSettings(startValue, endValue, settings)); public static Tween LocalEulerAngles([NotNull] Transform target, TweenSettings settings) { validateEulerAnglesData(ref settings); return animate(target, ref settings, _ => { (_.target as Transform).localEulerAngles = _.Vector3Val; }, _ => (_.target as Transform).localEulerAngles.ToContainer(), TweenType.LocalEulerAngles); } static void validateEulerAnglesData(ref TweenSettings settings) { if (settings.startFromCurrent) { settings.startFromCurrent = false; Debug.LogWarning("Animating euler angles from the current value may produce unexpected results because there is more than one way to represent the current rotation using Euler angles.\n" + "'" + nameof(TweenSettings.startFromCurrent) + "' was ignored.\n" + "More info: https://docs.unity3d.com/ScriptReference/Transform-eulerAngles.html\n"); } } // Called from TweenGenerated.cs public static Tween Scale([NotNull] Transform target, TweenSettings uniformScaleSettings) { var remapped = new TweenSettings(uniformScaleSettings.startValue * Vector3.one, uniformScaleSettings.endValue * Vector3.one, uniformScaleSettings.settings) { startFromCurrent = uniformScaleSettings.startFromCurrent }; return Scale(target, remapped); } public static Tween Rotation([NotNull] Transform target, TweenSettings eulerAnglesSettings) => Rotation(target, toQuaternion(eulerAnglesSettings)); public static Tween LocalRotation([NotNull] Transform target, TweenSettings localEulerAnglesSettings) => LocalRotation(target, toQuaternion(localEulerAnglesSettings)); static TweenSettings toQuaternion(TweenSettings s) => new TweenSettings(Quaternion.Euler(s.startValue), Quaternion.Euler(s.endValue), s.settings) { startFromCurrent = s.startFromCurrent }; #if TEXT_MESH_PRO_INSTALLED public static Tween TextMaxVisibleCharacters([NotNull] TMPro.TMP_Text target, TweenSettings settings) { int oldCount = target.textInfo.characterCount; target.ForceMeshUpdate(); if (oldCount != target.textInfo.characterCount) { Debug.LogWarning("Please call TMP_Text.ForceMeshUpdate() before animating maxVisibleCharacters."); } var floatSettings = new TweenSettings(settings.startValue, settings.endValue, settings.settings); return animateIntAsFloat(target, ref floatSettings, _tween => { var _target = _tween.target as TMPro.TMP_Text; _target.maxVisibleCharacters = Mathf.RoundToInt(_tween.FloatVal); }, t => new ValueContainer { FloatVal = (t.target as TMPro.TMP_Text).maxVisibleCharacters }, TweenType.TextMaxVisibleCharacters); } // todo fix this correctly static Tween animateIntAsFloat(object target, ref TweenSettings settings, [NotNull] Action setter, Func getter, TweenType _tweenType) { var tween = PrimeTweenManager.fetchTween(); tween.startValue.CopyFrom(ref settings.startValue); tween.endValue.CopyFrom(ref settings.endValue); tween.Setup(target, ref settings.settings, setter, getter, settings.startFromCurrent, _tweenType); return PrimeTweenManager.Animate(tween); } #endif // not generated automatically because GlobalTimeScale() should have 'useUnscaledTime: true' public static Tween GlobalTimeScale(Single endValue, float duration, Ease ease = Ease.Default, int cycles = 1, CycleMode cycleMode = CycleMode.Restart, float startDelay = 0, float endDelay = 0) => GlobalTimeScale(new TweenSettings(endValue, new TweenSettings(duration, ease, cycles, cycleMode, startDelay, endDelay, true))); public static Tween GlobalTimeScale(Single endValue, float duration, Easing ease, int cycles = 1, CycleMode cycleMode = CycleMode.Restart, float startDelay = 0, float endDelay = 0) => GlobalTimeScale(new TweenSettings(endValue, new TweenSettings(duration, ease, cycles, cycleMode, startDelay, endDelay, true))); public static Tween GlobalTimeScale(Single startValue, Single endValue, float duration, Ease ease = Ease.Default, int cycles = 1, CycleMode cycleMode = CycleMode.Restart, float startDelay = 0, float endDelay = 0) => GlobalTimeScale(new TweenSettings(startValue, endValue, new TweenSettings(duration, ease, cycles, cycleMode, startDelay, endDelay, true))); public static Tween GlobalTimeScale(Single startValue, Single endValue, float duration, Easing ease, int cycles = 1, CycleMode cycleMode = CycleMode.Restart, float startDelay = 0, float endDelay = 0) => GlobalTimeScale(new TweenSettings(startValue, endValue, new TweenSettings(duration, ease, cycles, cycleMode, startDelay, endDelay, true))); public static Tween GlobalTimeScale(Single endValue, TweenSettings settings) => GlobalTimeScale(new TweenSettings(endValue, settings)); public static Tween GlobalTimeScale(Single startValue, Single endValue, TweenSettings settings) => GlobalTimeScale(new TweenSettings(startValue, endValue, settings)); public static Tween GlobalTimeScale(TweenSettings settings) { clampTimescale(ref settings.startValue); clampTimescale(ref settings.endValue); if (!settings.settings.useUnscaledTime) { Debug.LogWarning("Setting " + nameof(TweenSettings.useUnscaledTime) + " to true to animate Time.timeScale correctly."); settings.settings.useUnscaledTime = true; } return animate(PrimeTweenManager.dummyTarget, ref settings, t => Time.timeScale = t.FloatVal, _ => Time.timeScale.ToContainer(), TweenType.GlobalTimeScale); void clampTimescale(ref float value) { if (value < 0) { Debug.LogError($"timeScale should be >= 0, but was {value}"); value = 0; } } } public static Tween TweenTimeScale(Tween tween, TweenSettings settings) => AnimateTimeScale(tween, settings, TweenType.TweenTimeScale); static Tween AnimateTimeScale(Tween tween, TweenSettings settings, TweenType tweenType) { if (!tween.tryManipulate()) { return default; } var result = animate(tween.tween, ref settings, t => { var target = t.target as ReusableTween; if (t.longParam != target.id || !target._isAlive) { t.EmergencyStop(); return; } target.timeScale = t.FloatVal; }, t => (t.target as ReusableTween).timeScale.ToContainer(), tweenType); Assert.IsTrue(result.isAlive); result.tween.longParam = tween.id; return result; } public static Tween TweenTimeScale(Sequence sequence, TweenSettings settings) => AnimateTimeScale(sequence.root, settings, TweenType.TweenTimeScaleSequence); public static Tween RotationAtSpeed([NotNull] Transform target, Vector3 endValue, float averageAngularSpeed, Ease ease = Ease.Default, int cycles = 1, CycleMode cycleMode = CycleMode.Restart, float startDelay = 0, float endDelay = 0, bool useUnscaledTime = false) => RotationAtSpeed(target, new TweenSettings(endValue, new TweenSettings(averageAngularSpeed, ease, cycles, cycleMode, startDelay, endDelay, useUnscaledTime))); public static Tween RotationAtSpeed([NotNull] Transform target, Vector3 endValue, float averageAngularSpeed, Easing ease, int cycles = 1, CycleMode cycleMode = CycleMode.Restart, float startDelay = 0, float endDelay = 0, bool useUnscaledTime = false) => RotationAtSpeed(target, new TweenSettings(endValue, new TweenSettings(averageAngularSpeed, ease, cycles, cycleMode, startDelay, endDelay, useUnscaledTime))); public static Tween RotationAtSpeed([NotNull] Transform target, Vector3 startValue, Vector3 endValue, float averageAngularSpeed, Ease ease = Ease.Default, int cycles = 1, CycleMode cycleMode = CycleMode.Restart, float startDelay = 0, float endDelay = 0, bool useUnscaledTime = false) => RotationAtSpeed(target, new TweenSettings(startValue, endValue, new TweenSettings(averageAngularSpeed, ease, cycles, cycleMode, startDelay, endDelay, useUnscaledTime))); public static Tween RotationAtSpeed([NotNull] Transform target, Vector3 startValue, Vector3 endValue, float averageAngularSpeed, Easing ease, int cycles = 1, CycleMode cycleMode = CycleMode.Restart, float startDelay = 0, float endDelay = 0, bool useUnscaledTime = false) => RotationAtSpeed(target, new TweenSettings(startValue, endValue, new TweenSettings(averageAngularSpeed, ease, cycles, cycleMode, startDelay, endDelay, useUnscaledTime))); static Tween RotationAtSpeed([NotNull] Transform target, TweenSettings settingsVector3) { var settings = toQuaternion(settingsVector3); var speed = settings.settings.duration; if (speed <= 0) { Debug.LogError($"Invalid speed provided to the Tween.{nameof(RotationAtSpeed)}() method: {speed}."); return default; } if (settings.startFromCurrent) { settings.startFromCurrent = false; settings.startValue = target.rotation; } settings.settings.duration = Extensions.CalcDistance(settings.startValue, settings.endValue) / speed; return Rotation(target, settings); } public static Tween LocalRotationAtSpeed([NotNull] Transform target, Vector3 endValue, float averageAngularSpeed, Ease ease = Ease.Default, int cycles = 1, CycleMode cycleMode = CycleMode.Restart, float startDelay = 0, float endDelay = 0, bool useUnscaledTime = false) => LocalRotationAtSpeed(target, new TweenSettings(endValue, new TweenSettings(averageAngularSpeed, ease, cycles, cycleMode, startDelay, endDelay, useUnscaledTime))); public static Tween LocalRotationAtSpeed([NotNull] Transform target, Vector3 endValue, float averageAngularSpeed, Easing ease, int cycles = 1, CycleMode cycleMode = CycleMode.Restart, float startDelay = 0, float endDelay = 0, bool useUnscaledTime = false) => LocalRotationAtSpeed(target, new TweenSettings(endValue, new TweenSettings(averageAngularSpeed, ease, cycles, cycleMode, startDelay, endDelay, useUnscaledTime))); public static Tween LocalRotationAtSpeed([NotNull] Transform target, Vector3 startValue, Vector3 endValue, float averageAngularSpeed, Ease ease = Ease.Default, int cycles = 1, CycleMode cycleMode = CycleMode.Restart, float startDelay = 0, float endDelay = 0, bool useUnscaledTime = false) => LocalRotationAtSpeed(target, new TweenSettings(startValue, endValue, new TweenSettings(averageAngularSpeed, ease, cycles, cycleMode, startDelay, endDelay, useUnscaledTime))); public static Tween LocalRotationAtSpeed([NotNull] Transform target, Vector3 startValue, Vector3 endValue, float averageAngularSpeed, Easing ease, int cycles = 1, CycleMode cycleMode = CycleMode.Restart, float startDelay = 0, float endDelay = 0, bool useUnscaledTime = false) => LocalRotationAtSpeed(target, new TweenSettings(startValue, endValue, new TweenSettings(averageAngularSpeed, ease, cycles, cycleMode, startDelay, endDelay, useUnscaledTime))); static Tween LocalRotationAtSpeed([NotNull] Transform target, TweenSettings settingsVector3) { var settings = toQuaternion(settingsVector3); var speed = settings.settings.duration; if (speed <= 0) { Debug.LogError($"Invalid speed provided to the Tween.{nameof(LocalRotationAtSpeed)}() method: {speed}."); return default; } if (settings.startFromCurrent) { settings.startFromCurrent = false; settings.startValue = target.localRotation; } settings.settings.duration = Extensions.CalcDistance(settings.startValue, settings.endValue) / speed; return LocalRotation(target, settings); } } }