123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563 |
- // 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;
- using UnityEngine.Events;
- using UnityEngine.UI;
- #if DOTWEEN_TMP
- 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 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 isActive = true;
- public bool isValid;
- public Component target;
- public DOTweenAnimationType 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;
- public float optionalFloat0;
- public int optionalInt0;
- public RotateMode optionalRotationMode = RotateMode.Fast;
- public ScrambleMode optionalScrambleMode = ScrambleMode.None;
- public string optionalString;
- bool _tweenCreated; // TRUE after the tweens have been created
- int _playCount = -1; // Used when calling DOPlayNext
- #region Unity Methods
- void Awake()
- {
- if (!isActive || !isValid) return;
- if (animationType != DOTweenAnimationType.Move || !useTargetAsV3) {
- // Don't create tweens if we're using a RectTransform as a Move target,
- // because that will work only inside Start
- CreateTween();
- _tweenCreated = true;
- }
- }
- void Start()
- {
- if (_tweenCreated || !isActive || !isValid) return;
- CreateTween();
- _tweenCreated = true;
- }
- void OnDestroy()
- {
- if (tween != null && tween.IsActive()) tween.Kill();
- tween = null;
- }
- // Used also by DOTweenAnimationInspector when applying runtime changes and restarting
- public void CreateTween()
- {
- if (target == null) {
- Debug.LogWarning(string.Format("{0} :: This tween'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;
- }
- 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 DOTweenAnimationType.None:
- break;
- case DOTweenAnimationType.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 (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 = DOTweenUtils46.SwitchToRectTransform(endValueT, rTarget);
- }
- }
- } else endValueV3 = endValueTransform.position;
- }
- }
- switch (targetType) {
- case TargetType.RectTransform:
- tween = ((RectTransform)target).DOAnchorPos3D(endValueV3, duration, optionalBool0);
- break;
- case TargetType.Transform:
- tween = ((Transform)target).DOMove(endValueV3, duration, optionalBool0);
- break;
- case TargetType.Rigidbody2D:
- tween = ((Rigidbody2D)target).DOMove(endValueV3, duration, optionalBool0);
- break;
- case TargetType.Rigidbody:
- tween = ((Rigidbody)target).DOMove(endValueV3, duration, optionalBool0);
- break;
- }
- break;
- case DOTweenAnimationType.LocalMove:
- tween = transform.DOLocalMove(endValueV3, duration, optionalBool0);
- break;
- case DOTweenAnimationType.Rotate:
- switch (targetType) {
- case TargetType.Transform:
- tween = ((Transform)target).DORotate(endValueV3, duration, optionalRotationMode);
- break;
- case TargetType.Rigidbody2D:
- tween = ((Rigidbody2D)target).DORotate(endValueFloat, duration);
- break;
- case TargetType.Rigidbody:
- tween = ((Rigidbody)target).DORotate(endValueV3, duration, optionalRotationMode);
- break;
- }
- break;
- case DOTweenAnimationType.LocalRotate:
- tween = transform.DOLocalRotate(endValueV3, duration, optionalRotationMode);
- break;
- case DOTweenAnimationType.Scale:
- switch (targetType) {
- #if DOTWEEN_TK2D
- 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 = transform.DOScale(optionalBool0 ? new Vector3(endValueFloat, endValueFloat, endValueFloat) : endValueV3, duration);
- break;
- }
- break;
- case DOTweenAnimationType.UIWidthHeight:
- tween = ((RectTransform)target).DOSizeDelta(optionalBool0 ? new Vector2(endValueFloat, endValueFloat) : endValueV2, duration);
- break;
- case DOTweenAnimationType.Color:
- isRelative = false;
- switch (targetType) {
- case TargetType.SpriteRenderer:
- tween = ((SpriteRenderer)target).DOColor(endValueColor, duration);
- break;
- case TargetType.Renderer:
- tween = ((Renderer)target).material.DOColor(endValueColor, duration);
- break;
- case TargetType.Image:
- tween = ((Image)target).DOColor(endValueColor, duration);
- break;
- case TargetType.Text:
- tween = ((Text)target).DOColor(endValueColor, duration);
- break;
- case TargetType.Light:
- tween = ((Light)target).DOColor(endValueColor, duration);
- break;
- #if DOTWEEN_TK2D
- case TargetType.tk2dTextMesh:
- tween = ((tk2dTextMesh)target).DOColor(endValueColor, duration);
- break;
- case TargetType.tk2dBaseSprite:
- tween = ((tk2dBaseSprite)target).DOColor(endValueColor, duration);
- break;
- #endif
- #if DOTWEEN_TMP
- case TargetType.TextMeshProUGUI:
- tween = ((TextMeshProUGUI)target).DOColor(endValueColor, duration);
- break;
- case TargetType.TextMeshPro:
- tween = ((TextMeshPro)target).DOColor(endValueColor, duration);
- break;
- #endif
- }
- break;
- case DOTweenAnimationType.Fade:
- isRelative = false;
- switch (targetType) {
- case TargetType.SpriteRenderer:
- tween = ((SpriteRenderer)target).DOFade(endValueFloat, duration);
- break;
- case TargetType.Renderer:
- tween = ((Renderer)target).material.DOFade(endValueFloat, duration);
- break;
- case TargetType.Image:
- tween = ((Image)target).DOFade(endValueFloat, duration);
- break;
- case TargetType.Text:
- tween = ((Text)target).DOFade(endValueFloat, duration);
- break;
- case TargetType.Light:
- tween = ((Light)target).DOIntensity(endValueFloat, duration);
- break;
- case TargetType.CanvasGroup:
- tween = ((CanvasGroup)target).DOFade(endValueFloat, duration);
- break;
- #if DOTWEEN_TK2D
- case TargetType.tk2dTextMesh:
- tween = ((tk2dTextMesh)target).DOFade(endValueFloat, duration);
- break;
- case TargetType.tk2dBaseSprite:
- tween = ((tk2dBaseSprite)target).DOFade(endValueFloat, duration);
- break;
- #endif
- #if DOTWEEN_TMP
- case TargetType.TextMeshProUGUI:
- tween = ((TextMeshProUGUI)target).DOFade(endValueFloat, duration);
- break;
- case TargetType.TextMeshPro:
- tween = ((TextMeshPro)target).DOFade(endValueFloat, duration);
- break;
- #endif
- }
- break;
- case DOTweenAnimationType.Text:
- switch (targetType) {
- case TargetType.Text:
- tween = ((Text)target).DOText(endValueString, duration, optionalBool0, optionalScrambleMode, optionalString);
- break;
- #if DOTWEEN_TK2D
- case TargetType.tk2dTextMesh:
- tween = ((tk2dTextMesh)target).DOText(endValueString, duration, optionalBool0, optionalScrambleMode, optionalString);
- break;
- #endif
- #if DOTWEEN_TMP
- 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 DOTweenAnimationType.PunchPosition:
- switch (targetType) {
- case TargetType.RectTransform:
- tween = ((RectTransform)target).DOPunchAnchorPos(endValueV3, duration, optionalInt0, optionalFloat0, optionalBool0);
- break;
- case TargetType.Transform:
- tween = ((Transform)target).DOPunchPosition(endValueV3, duration, optionalInt0, optionalFloat0, optionalBool0);
- break;
- }
- break;
- case DOTweenAnimationType.PunchScale:
- tween = transform.DOPunchScale(endValueV3, duration, optionalInt0, optionalFloat0);
- break;
- case DOTweenAnimationType.PunchRotation:
- tween = transform.DOPunchRotation(endValueV3, duration, optionalInt0, optionalFloat0);
- break;
- case DOTweenAnimationType.ShakePosition:
- switch (targetType) {
- case TargetType.RectTransform:
- tween = ((RectTransform)target).DOShakeAnchorPos(duration, endValueV3, optionalInt0, optionalFloat0, optionalBool0);
- break;
- case TargetType.Transform:
- tween = ((Transform)target).DOShakePosition(duration, endValueV3, optionalInt0, optionalFloat0, optionalBool0);
- break;
- }
- break;
- case DOTweenAnimationType.ShakeScale:
- tween = transform.DOShakeScale(duration, endValueV3, optionalInt0, optionalFloat0);
- break;
- case DOTweenAnimationType.ShakeRotation:
- tween = transform.DOShakeRotation(duration, endValueV3, optionalInt0, optionalFloat0);
- break;
- case DOTweenAnimationType.CameraAspect:
- tween = ((Camera)target).DOAspect(endValueFloat, duration);
- break;
- case DOTweenAnimationType.CameraBackgroundColor:
- tween = ((Camera)target).DOColor(endValueColor, duration);
- break;
- case DOTweenAnimationType.CameraFieldOfView:
- tween = ((Camera)target).DOFieldOfView(endValueFloat, duration);
- break;
- case DOTweenAnimationType.CameraOrthoSize:
- tween = ((Camera)target).DOOrthoSize(endValueFloat, duration);
- break;
- case DOTweenAnimationType.CameraPixelRect:
- tween = ((Camera)target).DOPixelRect(endValueRect, duration);
- break;
- case DOTweenAnimationType.CameraRect:
- tween = ((Camera)target).DORect(endValueRect, duration);
- break;
- }
- if (tween == null) return;
- if (isFrom) {
- ((Tweener)tween).From(isRelative);
- } else {
- tween.SetRelative(isRelative);
- }
- tween.SetTarget(this.gameObject).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 (autoPlay) tween.Play();
- else tween.Pause();
- if (hasOnTweenCreated && onTweenCreated != null) onTweenCreated.Invoke();
- }
- #endregion
- #region Public Methods
- // These methods are here so they can be called directly via Unity's UGUI event system
- public override void DOPlay()
- {
- DOTween.Play(this.gameObject);
- }
- public override void DOPlayBackwards()
- {
- DOTween.PlayBackwards(this.gameObject);
- }
- public override void DOPlayForward()
- {
- DOTween.PlayForward(this.gameObject);
- }
- public override void DOPause()
- {
- DOTween.Pause(this.gameObject);
- }
- public override void DOTogglePause()
- {
- DOTween.TogglePause(this.gameObject);
- }
- 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(this.gameObject);
- }
- /// <summary>
- /// Restarts the tween
- /// </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 = false)
- {
- _playCount = -1;
- if (tween == null) {
- if (Debugger.logPriority > 1) Debugger.LogNullTween(tween); return;
- }
- if (fromHere && isRelative) ReEvaluateRelativeTween();
- DOTween.Restart(this.gameObject);
- }
- public override void DOComplete()
- {
- DOTween.Complete(this.gameObject);
- }
- public override void DOKill()
- {
- DOTween.Kill(this.gameObject);
- tween = null;
- }
- #region Specifics
- public void DOPlayById(string id)
- {
- DOTween.Play(this.gameObject, id);
- }
- public void DOPlayAllById(string id)
- {
- DOTween.Play(id);
- }
- public void DOPauseAllById(string id)
- {
- DOTween.Pause(id);
- }
- public void DOPlayBackwardsById(string id)
- {
- DOTween.PlayBackwards(this.gameObject, id);
- }
- public void DOPlayBackwardsAllById(string id)
- {
- DOTween.PlayBackwards(id);
- }
- public void DOPlayForwardById(string id)
- {
- DOTween.PlayForward(this.gameObject, id);
- }
- public void DOPlayForwardAllById(string id)
- {
- DOTween.PlayForward(id);
- }
- 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.IsPlaying() && !anim.tween.IsComplete()) {
- anim.tween.Play();
- break;
- }
- }
- }
- public void DORewindAndPlayNext()
- {
- _playCount = -1;
- DOTween.Rewind(this.gameObject);
- DOPlayNext();
- }
- public void DORestartById(string id)
- {
- _playCount = -1;
- DOTween.Restart(this.gameObject, id);
- }
- public void DORestartAllById(string id)
- {
- _playCount = -1;
- DOTween.Restart(id);
- }
- /// <summary>
- /// Returns the tweens created by this DOTweenAnimation, in the same order as they appear in the Inspector (top to bottom)
- /// </summary>
- public List<Tween> GetTweens()
- {
- // return DOTween.TweensByTarget(this.gameObject);
- List<Tween> result = new List<Tween>();
- DOTweenAnimation[] anims = this.GetComponents<DOTweenAnimation>();
- foreach (DOTweenAnimation anim in anims) result.Add(anim.tween);
- return result;
- }
- #endregion
- #region Internal Static Helpers (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";
- return (TargetType)Enum.Parse(typeof(TargetType), str);
- }
- #endregion
- #endregion
- #region Private
- // Re-evaluate relative position of path
- void ReEvaluateRelativeTween()
- {
- if (animationType == DOTweenAnimationType.Move) {
- ((Tweener)tween).ChangeEndValue(transform.position + endValueV3, true);
- } else if (animationType == DOTweenAnimationType.LocalMove) {
- ((Tweener)tween).ChangeEndValue(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;
- }
- }
- }
|