717 lines
		
	
	
		
			28 KiB
		
	
	
	
		
			C#
		
	
	
	
		
		
			
		
	
	
			717 lines
		
	
	
		
			28 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 false // 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 TRUE 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 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; | |||
|  |         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 != 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(); | |||
|  |                 _tweenCreated = true; | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  |         void Start() | |||
|  |         { | |||
|  |             if (_tweenCreated || !isActive || !isValid) return; | |||
|  | 
 | |||
|  |             CreateTween(); | |||
|  |             _tweenCreated = true; | |||
|  |         } | |||
|  | 
 | |||
|  |         void Reset() | |||
|  |         { | |||
|  |             Dispatch_OnReset(this); | |||
|  |         } | |||
|  | 
 | |||
|  |         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 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 false // 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 false // 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 false // 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); | |||
|  |                     break; | |||
|  | #if true // UI_MARKER | |||
|  |                 case TargetType.RectTransform: | |||
|  |                     tween = ((RectTransform)target).DOShakeAnchorPos(duration, endValueV3, optionalInt0, optionalFloat0, optionalBool0); | |||
|  |                     break; | |||
|  | #endif | |||
|  |                 } | |||
|  |                 break; | |||
|  |             case AnimationType.ShakeScale: | |||
|  |                 tween = tweenGO.transform.DOShakeScale(duration, endValueV3, optionalInt0, optionalFloat0); | |||
|  |                 break; | |||
|  |             case AnimationType.ShakeRotation: | |||
|  |                 tween = tweenGO.transform.DOShakeRotation(duration, endValueV3, optionalInt0, optionalFloat0); | |||
|  |                 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; | |||
|  | 
 | |||
|  |             if (isFrom) { | |||
|  |                 ((Tweener)tween).From(isRelative); | |||
|  |             } else { | |||
|  |                 tween.SetRelative(isRelative); | |||
|  |             } | |||
|  |             GameObject setTarget = targetIsSelf || !tweenTargetIsTargetGO ? this.gameObject : targetGO; | |||
|  |             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 (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> | |||
|  |         public override void DORestart() | |||
|  |         { DORestart(false); } | |||
|  |         /// <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) | |||
|  |         { | |||
|  |         	_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 DORewindAllById(string id) | |||
|  |         { | |||
|  |             _playCount = -1; | |||
|  |             DOTween.Rewind(id); | |||
|  |         } | |||
|  | 
 | |||
|  |         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 (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 = "Image"; // RawImages 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; | |||
|  | 
 | |||
|  |             CreateTween(); | |||
|  |             return tween; | |||
|  |         } | |||
|  | 
 | |||
|  |         #endregion | |||
|  | 
 | |||
|  |         #endregion | |||
|  | 
 | |||
|  |         #region Private | |||
|  | 
 | |||
|  |         // Returns the gameObject whose target component should be animated | |||
|  |         GameObject GetTweenGO() | |||
|  |         { | |||
|  |             return targetIsSelf ? 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; | |||
|  |         } | |||
|  |     } | |||
|  | } |