// ReSharper disable MemberCanBePrivate.Global
// ReSharper disable UnusedMember.Global
// ReSharper disable UnusedMethodReturnValue.Global
using System;
using System.ComponentModel;
using JetBrains.Annotations;
using UnityEngine;
using TweenType = PrimeTween.TweenAnimation.TweenType;
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 the 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) {
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, Easing 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);
[EditorBrowsable(EditorBrowsableState.Never)] [Obsolete(ObsoleteMessages.tweenSettingsOverloadStartEndValue)]
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);
}
if (PrimeTweenManager.Instance.isDestroyed) {
return default;
}
var tween = PrimeTweenManager.FetchTween(settings.settings._updateType);
ref var rt = ref tween.managedData;
ref var d = ref tween.data;
d.startValue.CopyFrom(ref settings.startValue);
rt.endValueOrDiff.CopyFrom(ref settings.endValue);
tween.customOnValueChange = onValueChange;
tween.Setup(PrimeTweenManager.dummyTarget, ref settings.settings, false, TweenType.CustomDouble, ref rt, ref d);
tween.onValueChange = (ref TweenData rt2, ref UnmanagedTweenData d2) => {
var _onValueChange = rt2.cold.customOnValueChange as Action;
var val = TweenData.DoubleVal(d2.startValue, d2.easedInterpolationFactor, rt2.endValueOrDiff);
_onValueChange(val);
};
return PrimeTweenManager.Animate(ref rt, ref d);
}
public static Tween Custom([NotNull] T target, Double startValue, Double endValue, float duration, [NotNull] Action onValueChange, Easing 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);
[EditorBrowsable(EditorBrowsableState.Never)] [Obsolete(ObsoleteMessages.tweenSettingsOverloadStartEndValue)]
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);
}
if (PrimeTweenManager.Instance.isDestroyed) {
return default;
}
var tween = PrimeTweenManager.FetchTween(settings.settings._updateType);
ref var rt = ref tween.managedData;
ref var d = ref tween.data;
d.startValue.CopyFrom(ref settings.startValue);
d.isAdditive = isAdditive;
rt.endValueOrDiff.CopyFrom(ref settings.endValue);
tween.Setup(target, ref settings.settings, false, TweenType.CustomDouble, ref rt, ref d);
tween.onValueChange = (ref TweenData rt2, ref UnmanagedTweenData d2) => {
var startValue = d2.startValue;
var t = d2.easedInterpolationFactor;
var dataIsAdditive = d2.isAdditive;
var _target = rt2.target as T;
var diff = rt2.endValueOrDiff;
double val;
if (dataIsAdditive) {
var newVal = TweenData.DoubleVal(startValue, t, diff);
val = newVal.calcDelta(rt2.cold.prevVal);
rt2.cold.prevVal.DoubleVal = newVal;
} else {
val = TweenData.DoubleVal(startValue, t, diff);
}
var _onValueChange = rt2.cold.customOnValueChange as Action;
_onValueChange(_target, val);
};
return PrimeTweenManager.Animate(ref rt, ref d);
}
#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 => {
ref var d = ref tween.data;
if (d.isInSequence) {
if (d.IsMainSequenceRoot()) {
new Sequence(tween.sequence).Stop();
}
// do nothing with nested tween or sequence. The main sequence root will process it
} else {
tween.managedData.Kill(ref d);
}
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 manager = PrimeTweenManager.Instance;
if (manager.updateDepth != 0) {
manager.completeAllRequested = true;
manager.completeAllRequestedTarget = onTarget;
return onTarget == null ? manager.tweensCount : GetTweensCount(onTarget);
}
manager.AddNewTweens(_UpdateType.Update);
manager.AddNewTweens(_UpdateType.LateUpdate);
manager.AddNewTweens(_UpdateType.FixedUpdate);
var result = PrimeTweenManager.ProcessAll(onTarget, tween => {
ref var d = ref tween.data;
if (d.isInSequence) {
if (d.IsMainSequenceRoot()) {
new Sequence(tween.sequence).Complete();
}
// do nothing with nested tween or sequence. The main sequence root will process it
} else {
new Tween(tween).Complete();
}
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.UpdateTweens(_UpdateType.Update, 0f, 0f);
manager.UpdateTweens(_UpdateType.LateUpdate, 0f, 0f);
manager.UpdateTweens(_UpdateType.FixedUpdate, 0f, 0f);
Assert.AreEqual(0, manager.tweensUpdate.Count);
// Assert.AreEqual(0, manager.tweensLateUpdate.Count); // LateUpdate adds new tweens after update
Assert.AreEqual(0, manager.tweensFixedUpdate.Count);
}
}
}
}
/// 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.data.trySetPause(true);
}, false);
}
return PrimeTweenManager.ProcessAll(onTarget, tween => {
return tween.data.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 = null) {
return DelayInternal(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 = null) {
return DelayInternal(target, duration, onComplete, useUnscaledTime, warnIfTargetDestroyed);
}
static Tween DelayInternal([CanBeNull] object target, float duration, [CanBeNull] Action onComplete, bool useUnscaledTime, bool? warnIfTargetDestroyed) {
var result = delay_internal(target, duration, useUnscaledTime);
if (onComplete != null) {
result?.tween.managedData.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 calling 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 = null) where T : class {
var maybeDelay = delay_internal(target, duration, useUnscaledTime);
if (!maybeDelay.HasValue) {
return default;
}
var delay = maybeDelay.Value;
delay.tween.managedData.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, Easing 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 startValue, Color endValue, float duration, Easing 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)));
[EditorBrowsable(EditorBrowsableState.Never)] [Obsolete(ObsoleteMessages.tweenSettingsOverloadEndValue)]
public static Tween MaterialColor([NotNull] Material target, int propertyId, Color endValue, TweenSettings settings) => MaterialColor(target, propertyId, new TweenSettings(endValue, settings));
[EditorBrowsable(EditorBrowsableState.Never)] [Obsolete(ObsoleteMessages.tweenSettingsOverloadStartEndValue)]
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)
=> AnimateMaterial(target, propertyId, ref settings, TweenType.MaterialColorProperty);
public static Tween MaterialProperty([NotNull] Material target, int propertyId, float endValue, float duration, Easing 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 startValue, float endValue, float duration, Easing 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)));
[EditorBrowsable(EditorBrowsableState.Never)] [Obsolete(ObsoleteMessages.tweenSettingsOverloadEndValue)]
public static Tween MaterialProperty([NotNull] Material target, int propertyId, float endValue, TweenSettings settings) => MaterialProperty(target, propertyId, new TweenSettings(endValue, settings));
[EditorBrowsable(EditorBrowsableState.Never)] [Obsolete(ObsoleteMessages.tweenSettingsOverloadStartEndValue)]
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)
=> AnimateMaterial(target, propertyId, ref settings, TweenType.MaterialProperty);
public static Tween MaterialAlpha([NotNull] Material target, int propertyId, float endValue, float duration, Easing 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 startValue, float endValue, float duration, Easing 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)));
[EditorBrowsable(EditorBrowsableState.Never)] [Obsolete(ObsoleteMessages.tweenSettingsOverloadEndValue)]
public static Tween MaterialAlpha([NotNull] Material target, int propertyId, float endValue, TweenSettings settings) => MaterialAlpha(target, propertyId, new TweenSettings(endValue, settings));
[EditorBrowsable(EditorBrowsableState.Never)] [Obsolete(ObsoleteMessages.tweenSettingsOverloadStartEndValue)]
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)
=> AnimateMaterial(target, propertyId, ref settings, TweenType.MaterialAlphaProperty);
public static Tween MaterialTextureOffset([NotNull] Material target, int propertyId, Vector2 endValue, float duration, Easing 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 startValue, Vector2 endValue, float duration, Easing 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)));
[EditorBrowsable(EditorBrowsableState.Never)] [Obsolete(ObsoleteMessages.tweenSettingsOverloadEndValue)]
public static Tween MaterialTextureOffset([NotNull] Material target, int propertyId, Vector2 endValue, TweenSettings settings) => MaterialTextureOffset(target, propertyId, new TweenSettings(endValue, settings));
[EditorBrowsable(EditorBrowsableState.Never)] [Obsolete(ObsoleteMessages.tweenSettingsOverloadStartEndValue)]
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)
=> AnimateMaterial(target, propertyId, ref settings, TweenType.MaterialTextureOffset);
public static Tween MaterialTextureScale([NotNull] Material target, int propertyId, Vector2 endValue, float duration, Easing 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 startValue, Vector2 endValue, float duration, Easing 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)));
[EditorBrowsable(EditorBrowsableState.Never)] [Obsolete(ObsoleteMessages.tweenSettingsOverloadEndValue)]
public static Tween MaterialTextureScale([NotNull] Material target, int propertyId, Vector2 endValue, TweenSettings settings) => MaterialTextureScale(target, propertyId, new TweenSettings(endValue, settings));
[EditorBrowsable(EditorBrowsableState.Never)] [Obsolete(ObsoleteMessages.tweenSettingsOverloadStartEndValue)]
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)
=> AnimateMaterial(target, propertyId, ref settings, TweenType.MaterialTextureScale);
public static Tween MaterialProperty([NotNull] Material target, int propertyId, Vector4 endValue, float duration, Easing 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 startValue, Vector4 endValue, float duration, Easing 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)));
[EditorBrowsable(EditorBrowsableState.Never)] [Obsolete(ObsoleteMessages.tweenSettingsOverloadEndValue)]
public static Tween MaterialProperty([NotNull] Material target, int propertyId, Vector4 endValue, TweenSettings settings) => MaterialProperty(target, propertyId, new TweenSettings(endValue, settings));
[EditorBrowsable(EditorBrowsableState.Never)] [Obsolete(ObsoleteMessages.tweenSettingsOverloadStartEndValue)]
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)
=> AnimateMaterial(target, propertyId, ref settings, TweenType.MaterialPropertyVector4);
static readonly System.Collections.Generic.Dictionary textureIdTo_ST = new System.Collections.Generic.Dictionary(10);
static long PackPropertyIdsToLowHigh(string textureName) {
int textureIdLow = Shader.PropertyToID(textureName);
if (!textureIdTo_ST.TryGetValue(textureIdLow, out int stHigh)) {
stHigh = Shader.PropertyToID(textureName + "_ST");
textureIdTo_ST.Add(textureIdLow, stHigh);
}
return ((long)stHigh << 32) | (uint)textureIdLow;
}
// 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, Easing 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)));
[EditorBrowsable(EditorBrowsableState.Never)] [Obsolete(ObsoleteMessages.tweenSettingsOverloadStartEndValue)]
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, TweenType.EulerAngles);
}
public static Tween LocalEulerAngles([NotNull] Transform target, Vector3 startValue, Vector3 endValue, float duration, Easing 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)));
[EditorBrowsable(EditorBrowsableState.Never)] [Obsolete(ObsoleteMessages.tweenSettingsOverloadStartEndValue)]
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, 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, TweenType.TextMaxVisibleCharacters);
}
// p2 todo fix this correctly
static Tween AnimateIntAsFloat(object target, ref TweenSettings settings, TweenType tweenType) {
if (PrimeTweenManager.Instance.isDestroyed) {
return default;
}
var tween = PrimeTweenManager.FetchTween(settings.settings._updateType);
ref var rt = ref tween.managedData;
ref var d = ref tween.data;
d.startValue.CopyFrom(ref settings.startValue);
rt.endValueOrDiff.CopyFrom(ref settings.endValue);
tween.Setup(target, ref settings.settings, settings.startFromCurrent, tweenType, ref rt, ref d);
return PrimeTweenManager.Animate(ref rt, ref d);
}
public static Tween TextMaxVisibleCharactersNormalized([NotNull] TMPro.TMP_Text target, TweenSettings settings) => animate(target, ref settings, TweenType.TextMaxVisibleCharactersNormalized);
#endif
// not generated automatically because GlobalTimeScale() should have 'useUnscaledTime: true'
public static Tween GlobalTimeScale(Single endValue, float duration, Easing 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 startValue, Single endValue, float duration, Easing 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)));
[EditorBrowsable(EditorBrowsableState.Never)] [Obsolete(ObsoleteMessages.tweenSettingsOverloadEndValue)]
public static Tween GlobalTimeScale(Single endValue, TweenSettings settings) => GlobalTimeScale(new TweenSettings(endValue, settings));
[EditorBrowsable(EditorBrowsableState.Never)] [Obsolete(ObsoleteMessages.tweenSettingsOverloadStartEndValue)]
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, 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, 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, Easing 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 startValue, Vector3 endValue, float averageAngularSpeed, Easing 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)));
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, Easing 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 startValue, Vector3 endValue, float averageAngularSpeed, Easing 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)));
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);
}
#if !UNITY_2019_1_OR_NEWER || PHYSICS_MODULE_INSTALLED
public static Tween RigidbodyMoveRotation(Rigidbody target, TweenSettings eulerAnglesSettings) => RigidbodyMoveRotation(target, ToQuaternion(eulerAnglesSettings));
#endif
}
}