You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
CrowdControl/Assets/Plugins/Demigiant/DOTweenPro/DOTweenAnimation.cs

885 lines
36 KiB
C#

// Author: Daniele Giardini - http://www.demigiant.com
// Created: 2015/03/12 15:55
using System;
using System.Collections.Generic;
using DG.Tweening.Core;
using UnityEngine;
#if true // UI_MARKER
using UnityEngine.UI;
#endif
#if true // TEXTMESHPRO_MARKER
using TMPro;
#endif
#pragma warning disable 1591
namespace DG.Tweening
{
/// <summary>
/// Attach this to a GameObject to create a tween
/// </summary>
[AddComponentMenu("DOTween/DOTween Animation")]
public class DOTweenAnimation : ABSAnimationComponent
{
public enum AnimationType
{
None,
Move, LocalMove,
Rotate, LocalRotate,
Scale,
Color, Fade,
Text,
PunchPosition, PunchRotation, PunchScale,
ShakePosition, ShakeRotation, ShakeScale,
CameraAspect, CameraBackgroundColor, CameraFieldOfView, CameraOrthoSize, CameraPixelRect, CameraRect,
UIWidthHeight
}
public enum TargetType
{
Unset,
Camera,
CanvasGroup,
Image,
Light,
RectTransform,
Renderer, SpriteRenderer,
Rigidbody, Rigidbody2D,
Text,
Transform,
tk2dBaseSprite,
tk2dTextMesh,
TextMeshPro,
TextMeshProUGUI
}
#region EVENTS - EDITOR-ONLY
/// <summary>Used internally by the editor</summary>
public static event Action<DOTweenAnimation> OnReset;
static void Dispatch_OnReset(DOTweenAnimation anim) { if (OnReset != null) OnReset(anim); }
#endregion
public bool targetIsSelf = true; // If FALSE allows to set the target manually
public GameObject targetGO = null; // Used in case targetIsSelf is FALSE
// If FALSE always uses the GO containing this DOTweenAnimation (and not the one containing the target) as DOTween's SetTarget target
public bool tweenTargetIsTargetGO = true;
public float delay;
public float duration = 1;
public Ease easeType = Ease.OutQuad;
public AnimationCurve easeCurve = new AnimationCurve(new Keyframe(0, 0), new Keyframe(1, 1));
public LoopType loopType = LoopType.Restart;
public int loops = 1;
public string id = "";
public bool isRelative;
public bool isFrom;
public bool isIndependentUpdate = false;
public bool autoKill = true;
public bool autoGenerate = true; // If TRUE automatically creates the tween at startup
public bool isActive = true;
public bool isValid;
public Component target;
public AnimationType animationType;
public TargetType targetType;
public TargetType forcedTargetType; // Used when choosing between multiple targets
public bool autoPlay = true;
public bool useTargetAsV3;
public float endValueFloat;
public Vector3 endValueV3;
public Vector2 endValueV2;
public Color endValueColor = new Color(1, 1, 1, 1);
public string endValueString = "";
public Rect endValueRect = new Rect(0, 0, 0, 0);
public Transform endValueTransform;
public bool optionalBool0, optionalBool1;
public float optionalFloat0;
public int optionalInt0;
public RotateMode optionalRotationMode = RotateMode.Fast;
public ScrambleMode optionalScrambleMode = ScrambleMode.None;
public string optionalString;
bool _tweenAutoGenerationCalled; // TRUE after the tweens have been autoGenerated
int _playCount = -1; // Used when calling DOPlayNext
#region Unity Methods
void Awake()
{
if (!isActive || !autoGenerate) return;
if (animationType != AnimationType.Move || !useTargetAsV3) {
// Don't create tweens if we're using a RectTransform as a Move target,
// because that will work only inside Start
CreateTween(false, autoPlay);
_tweenAutoGenerationCalled = true;
}
}
void Start()
{
if (_tweenAutoGenerationCalled || !isActive || !autoGenerate) return;
CreateTween(false, autoPlay);
_tweenAutoGenerationCalled = true;
}
void Reset()
{
Dispatch_OnReset(this);
}
void OnDestroy()
{
if (tween != null && tween.active) tween.Kill();
tween = null;
}
/// <summary>
/// Creates/recreates the tween without playing it, but first rewinding and killing the existing one if present.
/// </summary>
public void RewindThenRecreateTween()
{
if (tween != null && tween.active) tween.Rewind();
CreateTween(true, false);
}
/// <summary>
/// Creates/recreates the tween and plays it, first rewinding and killing the existing one if present.
/// </summary>
public void RewindThenRecreateTweenAndPlay()
{
if (tween != null && tween.active) tween.Rewind();
CreateTween(true, true);
}
/// <summary>
/// Creates/recreates the tween from its target's current value without playing it, but first killing the existing one if present.
/// </summary>
public void RecreateTween()
{ CreateTween(true, false); }
/// <summary>
/// Creates/recreates the tween from its target's current value and plays it, first killing the existing one if present.
/// </summary>
public void RecreateTweenAndPlay()
{ CreateTween(true, true); }
// Used also by DOTweenAnimationInspector when applying runtime changes and restarting
/// <summary>
/// Creates the tween manually (called automatically if AutoGenerate is set in the Inspector)
/// from its target's current value.
/// </summary>
/// <param name="regenerateIfExists">If TRUE and an existing tween was already created (and not killed), kills it and recreates it with the current
/// parameters. Otherwise, if a tween already exists, does nothing.</param>
/// <param name="andPlay">If TRUE also plays the tween, otherwise only creates it</param>
public void CreateTween(bool regenerateIfExists = false, bool andPlay = true)
{
if (!isValid) {
if (regenerateIfExists) { // Called manually: warn users
Debug.LogWarning(string.Format("{0} :: This DOTweenAnimation isn't valid and its tween won't be created", this.gameObject.name), this.gameObject);
}
return;
}
if (tween != null) {
if (tween.active) {
if (regenerateIfExists) tween.Kill();
else return;
}
tween = null;
}
// if (target == null) {
// Debug.LogWarning(string.Format("{0} :: This DOTweenAnimation's target is NULL, because the animation was created with a DOTween Pro version older than 0.9.255. To fix this, exit Play mode then simply select this object, and it will update automatically", this.gameObject.name), this.gameObject);
// return;
// }
GameObject tweenGO = GetTweenGO();
if (target == null || tweenGO == null) {
if (targetIsSelf && target == null) {
// Old error caused during upgrade from DOTween Pro 0.9.255
Debug.LogWarning(string.Format("{0} :: This DOTweenAnimation's target is NULL, because the animation was created with a DOTween Pro version older than 0.9.255. To fix this, exit Play mode then simply select this object, and it will update automatically", this.gameObject.name), this.gameObject);
} else {
// Missing non-self target
Debug.LogWarning(string.Format("{0} :: This DOTweenAnimation's target/GameObject is unset: the tween will not be created.", this.gameObject.name), this.gameObject);
}
return;
}
if (forcedTargetType != TargetType.Unset) targetType = forcedTargetType;
if (targetType == TargetType.Unset) {
// Legacy DOTweenAnimation (made with a version older than 0.9.450) without stored targetType > assign it now
targetType = TypeToDOTargetType(target.GetType());
}
switch (animationType) {
case AnimationType.None:
break;
case AnimationType.Move:
if (useTargetAsV3) {
isRelative = false;
if (endValueTransform == null) {
Debug.LogWarning(string.Format("{0} :: This tween's TO target is NULL, a Vector3 of (0,0,0) will be used instead", this.gameObject.name), this.gameObject);
endValueV3 = Vector3.zero;
} else {
#if true // UI_MARKER
if (targetType == TargetType.RectTransform) {
RectTransform endValueT = endValueTransform as RectTransform;
if (endValueT == null) {
Debug.LogWarning(string.Format("{0} :: This tween's TO target should be a RectTransform, a Vector3 of (0,0,0) will be used instead", this.gameObject.name), this.gameObject);
endValueV3 = Vector3.zero;
} else {
RectTransform rTarget = target as RectTransform;
if (rTarget == null) {
Debug.LogWarning(string.Format("{0} :: This tween's target and TO target are not of the same type. Please reassign the values", this.gameObject.name), this.gameObject);
} else {
// Problem: doesn't work inside Awake (ararargh!)
endValueV3 = DOTweenModuleUI.Utils.SwitchToRectTransform(endValueT, rTarget);
}
}
} else
#endif
endValueV3 = endValueTransform.position;
}
}
switch (targetType) {
case TargetType.Transform:
tween = ((Transform)target).DOMove(endValueV3, duration, optionalBool0);
break;
case TargetType.RectTransform:
#if true // UI_MARKER
tween = ((RectTransform)target).DOAnchorPos3D(endValueV3, duration, optionalBool0);
#else
tween = ((Transform)target).DOMove(endValueV3, duration, optionalBool0);
#endif
break;
case TargetType.Rigidbody:
#if true // PHYSICS_MARKER
tween = ((Rigidbody)target).DOMove(endValueV3, duration, optionalBool0);
#else
tween = ((Transform)target).DOMove(endValueV3, duration, optionalBool0);
#endif
break;
case TargetType.Rigidbody2D:
#if true // PHYSICS2D_MARKER
tween = ((Rigidbody2D)target).DOMove(endValueV3, duration, optionalBool0);
#else
tween = ((Transform)target).DOMove(endValueV3, duration, optionalBool0);
#endif
break;
}
break;
case AnimationType.LocalMove:
tween = tweenGO.transform.DOLocalMove(endValueV3, duration, optionalBool0);
break;
case AnimationType.Rotate:
switch (targetType) {
case TargetType.Transform:
tween = ((Transform)target).DORotate(endValueV3, duration, optionalRotationMode);
break;
case TargetType.Rigidbody:
#if true // PHYSICS_MARKER
tween = ((Rigidbody)target).DORotate(endValueV3, duration, optionalRotationMode);
#else
tween = ((Transform)target).DORotate(endValueV3, duration, optionalRotationMode);
#endif
break;
case TargetType.Rigidbody2D:
#if true // PHYSICS2D_MARKER
tween = ((Rigidbody2D)target).DORotate(endValueFloat, duration);
#else
tween = ((Transform)target).DORotate(endValueV3, duration, optionalRotationMode);
#endif
break;
}
break;
case AnimationType.LocalRotate:
tween = tweenGO.transform.DOLocalRotate(endValueV3, duration, optionalRotationMode);
break;
case AnimationType.Scale:
switch (targetType) {
#if false // TK2D_MARKER
case TargetType.tk2dTextMesh:
tween = ((tk2dTextMesh)target).DOScale(optionalBool0 ? new Vector3(endValueFloat, endValueFloat, endValueFloat) : endValueV3, duration);
break;
case TargetType.tk2dBaseSprite:
tween = ((tk2dBaseSprite)target).DOScale(optionalBool0 ? new Vector3(endValueFloat, endValueFloat, endValueFloat) : endValueV3, duration);
break;
#endif
default:
tween = tweenGO.transform.DOScale(optionalBool0 ? new Vector3(endValueFloat, endValueFloat, endValueFloat) : endValueV3, duration);
break;
}
break;
#if true // UI_MARKER
case AnimationType.UIWidthHeight:
tween = ((RectTransform)target).DOSizeDelta(optionalBool0 ? new Vector2(endValueFloat, endValueFloat) : endValueV2, duration);
break;
#endif
case AnimationType.Color:
isRelative = false;
switch (targetType) {
case TargetType.Renderer:
tween = ((Renderer)target).material.DOColor(endValueColor, duration);
break;
case TargetType.Light:
tween = ((Light)target).DOColor(endValueColor, duration);
break;
#if true // SPRITE_MARKER
case TargetType.SpriteRenderer:
tween = ((SpriteRenderer)target).DOColor(endValueColor, duration);
break;
#endif
#if true // UI_MARKER
case TargetType.Image:
tween = ((Graphic)target).DOColor(endValueColor, duration);
break;
case TargetType.Text:
tween = ((Text)target).DOColor(endValueColor, duration);
break;
#endif
#if false // TK2D_MARKER
case TargetType.tk2dTextMesh:
tween = ((tk2dTextMesh)target).DOColor(endValueColor, duration);
break;
case TargetType.tk2dBaseSprite:
tween = ((tk2dBaseSprite)target).DOColor(endValueColor, duration);
break;
#endif
#if true // TEXTMESHPRO_MARKER
case TargetType.TextMeshProUGUI:
tween = ((TextMeshProUGUI)target).DOColor(endValueColor, duration);
break;
case TargetType.TextMeshPro:
tween = ((TextMeshPro)target).DOColor(endValueColor, duration);
break;
#endif
}
break;
case AnimationType.Fade:
isRelative = false;
switch (targetType) {
case TargetType.Renderer:
tween = ((Renderer)target).material.DOFade(endValueFloat, duration);
break;
case TargetType.Light:
tween = ((Light)target).DOIntensity(endValueFloat, duration);
break;
#if true // SPRITE_MARKER
case TargetType.SpriteRenderer:
tween = ((SpriteRenderer)target).DOFade(endValueFloat, duration);
break;
#endif
#if true // UI_MARKER
case TargetType.Image:
tween = ((Graphic)target).DOFade(endValueFloat, duration);
break;
case TargetType.Text:
tween = ((Text)target).DOFade(endValueFloat, duration);
break;
case TargetType.CanvasGroup:
tween = ((CanvasGroup)target).DOFade(endValueFloat, duration);
break;
#endif
#if false // TK2D_MARKER
case TargetType.tk2dTextMesh:
tween = ((tk2dTextMesh)target).DOFade(endValueFloat, duration);
break;
case TargetType.tk2dBaseSprite:
tween = ((tk2dBaseSprite)target).DOFade(endValueFloat, duration);
break;
#endif
#if true // TEXTMESHPRO_MARKER
case TargetType.TextMeshProUGUI:
tween = ((TextMeshProUGUI)target).DOFade(endValueFloat, duration);
break;
case TargetType.TextMeshPro:
tween = ((TextMeshPro)target).DOFade(endValueFloat, duration);
break;
#endif
}
break;
case AnimationType.Text:
#if true // UI_MARKER
switch (targetType) {
case TargetType.Text:
tween = ((Text)target).DOText(endValueString, duration, optionalBool0, optionalScrambleMode, optionalString);
break;
}
#endif
#if false // TK2D_MARKER
switch (targetType) {
case TargetType.tk2dTextMesh:
tween = ((tk2dTextMesh)target).DOText(endValueString, duration, optionalBool0, optionalScrambleMode, optionalString);
break;
}
#endif
#if true // TEXTMESHPRO_MARKER
switch (targetType) {
case TargetType.TextMeshProUGUI:
tween = ((TextMeshProUGUI)target).DOText(endValueString, duration, optionalBool0, optionalScrambleMode, optionalString);
break;
case TargetType.TextMeshPro:
tween = ((TextMeshPro)target).DOText(endValueString, duration, optionalBool0, optionalScrambleMode, optionalString);
break;
}
#endif
break;
case AnimationType.PunchPosition:
switch (targetType) {
case TargetType.Transform:
tween = ((Transform)target).DOPunchPosition(endValueV3, duration, optionalInt0, optionalFloat0, optionalBool0);
break;
#if true // UI_MARKER
case TargetType.RectTransform:
tween = ((RectTransform)target).DOPunchAnchorPos(endValueV3, duration, optionalInt0, optionalFloat0, optionalBool0);
break;
#endif
}
break;
case AnimationType.PunchScale:
tween = tweenGO.transform.DOPunchScale(endValueV3, duration, optionalInt0, optionalFloat0);
break;
case AnimationType.PunchRotation:
tween = tweenGO.transform.DOPunchRotation(endValueV3, duration, optionalInt0, optionalFloat0);
break;
case AnimationType.ShakePosition:
switch (targetType) {
case TargetType.Transform:
tween = ((Transform)target).DOShakePosition(duration, endValueV3, optionalInt0, optionalFloat0, optionalBool0, optionalBool1);
break;
#if true // UI_MARKER
case TargetType.RectTransform:
tween = ((RectTransform)target).DOShakeAnchorPos(duration, endValueV3, optionalInt0, optionalFloat0, optionalBool0, optionalBool1);
break;
#endif
}
break;
case AnimationType.ShakeScale:
tween = tweenGO.transform.DOShakeScale(duration, endValueV3, optionalInt0, optionalFloat0, optionalBool1);
break;
case AnimationType.ShakeRotation:
tween = tweenGO.transform.DOShakeRotation(duration, endValueV3, optionalInt0, optionalFloat0, optionalBool1);
break;
case AnimationType.CameraAspect:
tween = ((Camera)target).DOAspect(endValueFloat, duration);
break;
case AnimationType.CameraBackgroundColor:
tween = ((Camera)target).DOColor(endValueColor, duration);
break;
case AnimationType.CameraFieldOfView:
tween = ((Camera)target).DOFieldOfView(endValueFloat, duration);
break;
case AnimationType.CameraOrthoSize:
tween = ((Camera)target).DOOrthoSize(endValueFloat, duration);
break;
case AnimationType.CameraPixelRect:
tween = ((Camera)target).DOPixelRect(endValueRect, duration);
break;
case AnimationType.CameraRect:
tween = ((Camera)target).DORect(endValueRect, duration);
break;
}
if (tween == null) return;
// Created
if (isFrom) {
((Tweener)tween).From(isRelative);
} else {
tween.SetRelative(isRelative);
}
GameObject setTarget = GetTweenTarget();
tween.SetTarget(setTarget).SetDelay(delay).SetLoops(loops, loopType).SetAutoKill(autoKill)
.OnKill(()=> tween = null);
if (isSpeedBased) tween.SetSpeedBased();
if (easeType == Ease.INTERNAL_Custom) tween.SetEase(easeCurve);
else tween.SetEase(easeType);
if (!string.IsNullOrEmpty(id)) tween.SetId(id);
tween.SetUpdate(isIndependentUpdate);
if (hasOnStart) {
if (onStart != null) tween.OnStart(onStart.Invoke);
} else onStart = null;
if (hasOnPlay) {
if (onPlay != null) tween.OnPlay(onPlay.Invoke);
} else onPlay = null;
if (hasOnUpdate) {
if (onUpdate != null) tween.OnUpdate(onUpdate.Invoke);
} else onUpdate = null;
if (hasOnStepComplete) {
if (onStepComplete != null) tween.OnStepComplete(onStepComplete.Invoke);
} else onStepComplete = null;
if (hasOnComplete) {
if (onComplete != null) tween.OnComplete(onComplete.Invoke);
} else onComplete = null;
if (hasOnRewind) {
if (onRewind != null) tween.OnRewind(onRewind.Invoke);
} else onRewind = null;
if (andPlay) tween.Play();
else tween.Pause();
if (hasOnTweenCreated && onTweenCreated != null) onTweenCreated.Invoke();
}
#endregion
#region Public Methods
#region Special
/// <summary>
/// Returns the tweens (if generated and not killed) created by all DOTweenAnimations on this gameObject,
/// in the same order as they appear in the Inspector (top to bottom).<para/>
/// Note that a tween is generated inside the Awake call (except RectTransform tweens which are generated inside Start),
/// so this method won't return them before that
/// </summary>
public List<Tween> GetTweens()
{
List<Tween> result = new List<Tween>();
DOTweenAnimation[] anims = this.GetComponents<DOTweenAnimation>();
foreach (DOTweenAnimation anim in anims) {
if (anim.tween != null && anim.tween.active) result.Add(anim.tween);
}
return result;
}
/// <summary>
/// Sets the animation target (which must be of the same type of the one set in the Inspector).
/// This is useful if you want to change it BEFORE this <see cref="DOTweenAnimation"/>
/// creates a tween, while after that it won't have any effect.<para/>
/// Consider that a <see cref="DOTweenAnimation"/> creates its tween inside its Awake (except for special tweens),
/// so you will need to sure your code runs before this object's Awake (via ScriptExecutionOrder or enabling/disabling methods)
/// </summary>
/// <param name="tweenTarget">
/// New target for the animation (must be of the same type of the previous one)</param>
/// <param name="useTweenTargetGameObjectForGroupOperations">If TRUE also uses tweenTarget's gameObject when settings the target-ID of the tween
/// (which is used with DOPlay/DORestart/etc to apply the same operation on all tweens that have the same target-id).<para/>
/// You should usually leave this to TRUE if you change the target.
/// </param>
public void SetAnimationTarget(Component tweenTarget, bool useTweenTargetGameObjectForGroupOperations = true)
{
TargetType newTargetType = TypeToDOTargetType(target.GetType());
if (newTargetType != targetType) {
Debug.LogError("DOTweenAnimation ► SetAnimationTarget: the new target is of a different type from the one set in the Inspector");
return;
}
target = tweenTarget;
targetGO = target.gameObject;
tweenTargetIsTargetGO = useTweenTargetGameObjectForGroupOperations;
}
#endregion
/// <summary>
/// Plays all tweens whose target-id is the same as the one set by this animation
/// </summary>
public override void DOPlay()
{
DOTween.Play(GetTweenTarget());
}
/// <summary>
/// Plays backwards all tweens whose target-id is the same as the one set by this animation
/// </summary>
public override void DOPlayBackwards()
{
DOTween.PlayBackwards(GetTweenTarget());
}
/// <summary>
/// Plays foward all tweens whose target-id is the same as the one set by this animation
/// </summary>
public override void DOPlayForward()
{
DOTween.PlayForward(GetTweenTarget());
}
/// <summary>
/// Pauses all tweens whose target-id is the same as the one set by this animation
/// </summary>
public override void DOPause()
{
DOTween.Pause(GetTweenTarget());
}
/// <summary>
/// Pauses/unpauses (depending on the current state) all tweens whose target-id is the same as the one set by this animation
/// </summary>
public override void DOTogglePause()
{
DOTween.TogglePause(GetTweenTarget());
}
/// <summary>
/// Rewinds all tweens created by this animation in the correct order
/// </summary>
public override void DORewind()
{
_playCount = -1;
// Rewind using Components order (in case there are multiple animations on the same property)
DOTweenAnimation[] anims = this.gameObject.GetComponents<DOTweenAnimation>();
for (int i = anims.Length - 1; i > -1; --i) {
Tween t = anims[i].tween;
if (t != null && t.IsInitialized()) anims[i].tween.Rewind();
}
// DOTween.Rewind(GetTweenTarget());
}
/// <summary>
/// Restarts all tweens whose target-id is the same as the one set by this animation
/// </summary>
public override void DORestart()
{ DORestart(false); }
/// <summary>
/// Restarts all tweens whose target-id is the same as the one set by this animation
/// </summary>
/// <param name="fromHere">If TRUE, re-evaluates the tween's start and end values from its current position.
/// Set it to TRUE when spawning the same DOTweenAnimation in different positions (like when using a pooling system)</param>
public override void DORestart(bool fromHere)
{
_playCount = -1;
if (tween == null) {
if (Debugger.logPriority > 1) Debugger.LogNullTween(tween); return;
}
if (fromHere && isRelative) ReEvaluateRelativeTween();
DOTween.Restart(GetTweenTarget());
}
/// <summary>
/// Completes all tweens whose target-id is the same as the one set by this animation
/// </summary>
public override void DOComplete()
{
DOTween.Complete(GetTweenTarget());
}
/// <summary>
/// Kills all tweens whose target-id is the same as the one set by this animation
/// </summary>
public override void DOKill()
{
DOTween.Kill(GetTweenTarget());
tween = null;
}
#region Specifics
/// <summary>
/// Plays all tweens with the given ID and whose target-id is the same as the one set by this animation
/// </summary>
public void DOPlayById(string id)
{
DOTween.Play(GetTweenTarget(), id);
}
/// <summary>
/// Plays all tweens with the given ID (regardless of their target gameObject)
/// </summary>
public void DOPlayAllById(string id)
{
DOTween.Play(id);
}
/// <summary>
/// Pauses all tweens that with the given ID (regardless of their target gameObject)
/// </summary>
public void DOPauseAllById(string id)
{
DOTween.Pause(id);
}
/// <summary>
/// Plays backwards all tweens with the given ID and whose target-id is the same as the one set by this animation
/// </summary>
public void DOPlayBackwardsById(string id)
{
DOTween.PlayBackwards(GetTweenTarget(), id);
}
/// <summary>
/// Plays backwards all tweens with the given ID (regardless of their target gameObject)
/// </summary>
public void DOPlayBackwardsAllById(string id)
{
DOTween.PlayBackwards(id);
}
/// <summary>
/// Plays forward all tweens with the given ID and whose target-id is the same as the one set by this animation
/// </summary>
public void DOPlayForwardById(string id)
{
DOTween.PlayForward(GetTweenTarget(), id);
}
/// <summary>
/// Plays forward all tweens with the given ID (regardless of their target gameObject)
/// </summary>
public void DOPlayForwardAllById(string id)
{
DOTween.PlayForward(id);
}
/// <summary>
/// Plays the next animation on this animation's gameObject (if any)
/// </summary>
public void DOPlayNext()
{
DOTweenAnimation[] anims = this.GetComponents<DOTweenAnimation>();
while (_playCount < anims.Length - 1) {
_playCount++;
DOTweenAnimation anim = anims[_playCount];
if (anim != null && anim.tween != null && anim.tween.active && !anim.tween.IsPlaying() && !anim.tween.IsComplete()) {
anim.tween.Play();
break;
}
}
}
/// <summary>
/// Rewinds all tweens with the given ID and whose target-id is the same as the one set by this animation,
/// then plays the next animation on this animation's gameObject (if any)
/// </summary>
public void DORewindAndPlayNext()
{
_playCount = -1;
DOTween.Rewind(GetTweenTarget());
DOPlayNext();
}
/// <summary>
/// Rewinds all tweens with the given ID (regardless of their target gameObject)
/// </summary>
public void DORewindAllById(string id)
{
_playCount = -1;
DOTween.Rewind(id);
}
/// <summary>
/// Restarts all tweens with the given ID and whose target-id is the same as the one set by this animation
/// </summary>
public void DORestartById(string id)
{
_playCount = -1;
DOTween.Restart(GetTweenTarget(), id);
}
/// <summary>
/// Restarts all tweens with the given ID (regardless of their target gameObject)
/// </summary>
public void DORestartAllById(string id)
{
_playCount = -1;
DOTween.Restart(id);
}
/// <summary>
/// Kills all tweens with the given ID and whose target-id is the same as the one set by this animation
/// </summary>
public void DOKillById(string id)
{
DOTween.Kill(GetTweenTarget(), id);
}
/// <summary>
/// Kills all tweens with the given ID (regardless of their target gameObject)
/// </summary>
public void DOKillAllById(string id)
{
DOTween.Kill(id);
}
#endregion
#region Internal (also used by Inspector)
public static TargetType TypeToDOTargetType(Type t)
{
string str = t.ToString();
int dotIndex = str.LastIndexOf(".");
if (dotIndex != -1) str = str.Substring(dotIndex + 1);
if (str.IndexOf("Renderer") != -1 && (str != "SpriteRenderer")) str = "Renderer";
//#if true // PHYSICS_MARKER
// if (str == "Rigidbody") str = "Transform";
//#endif
//#if true // PHYSICS2D_MARKER
// if (str == "Rigidbody2D") str = "Transform";
//#endif
#if true // UI_MARKER
// if (str == "RectTransform") str = "Transform";
if (str == "RawImage" || str == "Graphic") str = "Image"; // RawImages/Graphics are managed like Images for DOTweenAnimation (color and fade use Graphic target anyway)
#endif
return (TargetType)Enum.Parse(typeof(TargetType), str);
}
// Editor preview system
/// <summary>
/// Previews the tween in the editor. Only for DOTween internal usage: don't use otherwise.
/// </summary>
public Tween CreateEditorPreview()
{
if (Application.isPlaying) return null;
// CHANGE: first param switched to TRUE otherwise changing an animation and replaying in editor would still play old one
CreateTween(true, autoPlay);
return tween;
}
#endregion
#endregion
#region Private
/// <summary>
/// Returns the gameObject whose target component should be animated
/// </summary>
/// <returns></returns>
GameObject GetTweenGO()
{
return targetIsSelf ? this.gameObject : targetGO;
}
/// <summary>
/// Returns the GameObject which should be used/retrieved for SetTarget
/// </summary>
GameObject GetTweenTarget()
{
return targetIsSelf || !tweenTargetIsTargetGO ? this.gameObject : targetGO;
}
// Re-evaluate relative position of path
void ReEvaluateRelativeTween()
{
GameObject tweenGO = GetTweenGO();
if (tweenGO == null) {
Debug.LogWarning(string.Format("{0} :: This DOTweenAnimation's target/GameObject is unset: the tween will not be created.", this.gameObject.name), this.gameObject);
return;
}
if (animationType == AnimationType.Move) {
((Tweener)tween).ChangeEndValue(tweenGO.transform.position + endValueV3, true);
} else if (animationType == AnimationType.LocalMove) {
((Tweener)tween).ChangeEndValue(tweenGO.transform.localPosition + endValueV3, true);
}
}
#endregion
}
public static class DOTweenAnimationExtensions
{
// // Doesn't work on Win 8.1
// public static bool IsSameOrSubclassOf(this Type t, Type tBase)
// {
// return t.IsSubclassOf(tBase) || t == tBase;
// }
public static bool IsSameOrSubclassOf<T>(this Component t)
{
return t is T;
}
}
}