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;
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 |