feature: DOTween setup
This commit is contained in:
		
							parent
							
								
									ccb92f680d
								
							
						
					
					
						commit
						aeb7406366
					
				
					 352 changed files with 27281 additions and 0 deletions
				
			
		
							
								
								
									
										917
									
								
								Assets/Plugins/Demigiant/DOTweenPro/DOTweenAnimation.cs
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										917
									
								
								Assets/Plugins/Demigiant/DOTweenPro/DOTweenAnimation.cs
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,917 @@ | |||
| // 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, | ||||
|             FillAmount | ||||
|         } | ||||
| 
 | ||||
|         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 ShakeRandomnessMode optionalShakeRandomnessMode = ShakeRandomnessMode.Full; | ||||
|         public string optionalString; | ||||
| 
 | ||||
|         bool _tweenAutoGenerationCalled; // TRUE after the tweens have been autoGenerated | ||||
|         int _playCount = -1; // Used when calling DOPlayNext | ||||
|         readonly List<Tween> _tmpTweens = new List<Tween>(); | ||||
| 
 | ||||
|         #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; | ||||
|             case AnimationType.FillAmount: | ||||
|                 tween = ((Image)target).DOFillAmount(endValueFloat, 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, optionalBool1, optionalShakeRandomnessMode); | ||||
|                     break; | ||||
| #if true // UI_MARKER | ||||
|                 case TargetType.RectTransform: | ||||
|                     tween = ((RectTransform)target).DOShakeAnchorPos(duration, endValueV3, optionalInt0, optionalFloat0, optionalBool0, optionalBool1, optionalShakeRandomnessMode); | ||||
|                     break; | ||||
| #endif | ||||
|                 } | ||||
|                 break; | ||||
|             case AnimationType.ShakeScale: | ||||
|                 tween = tweenGO.transform.DOShakeScale(duration, endValueV3, optionalInt0, optionalFloat0, optionalBool1, optionalShakeRandomnessMode); | ||||
|                 break; | ||||
|             case AnimationType.ShakeRotation: | ||||
|                 tween = tweenGO.transform.DOShakeRotation(duration, endValueV3, optionalInt0, optionalFloat0, optionalBool1, optionalShakeRandomnessMode); | ||||
|                 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> | ||||
|         /// Sends to the given time (and pauses) all the tweens whose target-id is the one set by this animation | ||||
|         /// </summary> | ||||
|         /// <param name="time">Time to send the tween to</param> | ||||
|         public override void DOGotoAndPause(float time) | ||||
|         { DOGoto(time, false); } | ||||
|         /// <summary> | ||||
|         /// Sends to the given time (and plays) all the tweens whose target-id is the one set by this animation | ||||
|         /// </summary> | ||||
|         /// <param name="time">Time to send the tween to</param> | ||||
|         public override void DOGotoAndPlay(float time) | ||||
|         { DOGoto(time, true); } | ||||
|         void DOGoto(float time, bool andPlay) | ||||
|         { | ||||
|             _tmpTweens.Clear(); | ||||
|             DOTween.TweensByTarget(GetTweenTarget(), false, _tmpTweens); | ||||
|             int len = _tmpTweens.Count; | ||||
|             if (len == 0) { | ||||
|                 Debugger.LogWarning((andPlay ? "DOGotoAndPlay" : "DoGotoAndPause") + " ► tween doesn't exist"); | ||||
|             } else { | ||||
|                 for (int i = 0; i < _tmpTweens.Count; ++i) { | ||||
|                     _tmpTweens[i].Goto(time, andPlay); | ||||
|                 } | ||||
|             } | ||||
|             _tmpTweens.Clear(); | ||||
|         } | ||||
| 
 | ||||
|         /// <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; | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | @ -0,0 +1,8 @@ | |||
| fileFormatVersion: 2 | ||||
| guid: 4d0390bd8b8ffd640b34fe25065ff1df | ||||
| MonoImporter: | ||||
|   serializedVersion: 2 | ||||
|   defaultReferences: [] | ||||
|   executionOrder: 0 | ||||
|   icon: {instanceID: 0} | ||||
|   userData:  | ||||
							
								
								
									
										9
									
								
								Assets/Plugins/Demigiant/DOTweenPro/DOTweenDeAudio.cs
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								Assets/Plugins/Demigiant/DOTweenPro/DOTweenDeAudio.cs
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,9 @@ | |||
| // Author: Daniele Giardini - http://www.demigiant.com | ||||
| // Created: 2015/03/27 19:02 | ||||
| //  | ||||
| // License Copyright (c) Daniele Giardini. | ||||
| // This work is subject to the terms at http://dotween.demigiant.com/license.php | ||||
| 
 | ||||
| 
 | ||||
| #if false // MODULE_MARKER | ||||
| #endif | ||||
							
								
								
									
										12
									
								
								Assets/Plugins/Demigiant/DOTweenPro/DOTweenDeAudio.cs.meta
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								Assets/Plugins/Demigiant/DOTweenPro/DOTweenDeAudio.cs.meta
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,12 @@ | |||
| fileFormatVersion: 2 | ||||
| guid: 1d1aa01bacf85c04ea18116651a7f0db | ||||
| timeCreated: 1587116610 | ||||
| licenseType: Store | ||||
| MonoImporter: | ||||
|   serializedVersion: 2 | ||||
|   defaultReferences: [] | ||||
|   executionOrder: 0 | ||||
|   icon: {instanceID: 0} | ||||
|   userData:  | ||||
|   assetBundleName:  | ||||
|   assetBundleVariant:  | ||||
|  | @ -0,0 +1,9 @@ | |||
| // Author: Daniele Giardini - http://www.demigiant.com | ||||
| // Created: 2015/03/27 19:02 | ||||
| //  | ||||
| // License Copyright (c) Daniele Giardini. | ||||
| // This work is subject to the terms at http://dotween.demigiant.com/license.php | ||||
| 
 | ||||
| 
 | ||||
| #if false // MODULE_MARKER | ||||
| #endif | ||||
|  | @ -0,0 +1,12 @@ | |||
| fileFormatVersion: 2 | ||||
| guid: 0a0cc3e90c4a6ea41bb14d7f35c577c3 | ||||
| timeCreated: 1587116610 | ||||
| licenseType: Store | ||||
| MonoImporter: | ||||
|   serializedVersion: 2 | ||||
|   defaultReferences: [] | ||||
|   executionOrder: 0 | ||||
|   icon: {instanceID: 0} | ||||
|   userData:  | ||||
|   assetBundleName:  | ||||
|   assetBundleVariant:  | ||||
							
								
								
									
										80
									
								
								Assets/Plugins/Demigiant/DOTweenPro/DOTweenPro.XML
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										80
									
								
								Assets/Plugins/Demigiant/DOTweenPro/DOTweenPro.XML
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,80 @@ | |||
| <?xml version="1.0"?> | ||||
| <doc> | ||||
|     <assembly> | ||||
|         <name>DOTweenPro</name> | ||||
|     </assembly> | ||||
|     <members> | ||||
|         <member name="M:DG.Tweening.Core.ABSAnimationComponent.DORestart"> | ||||
|             <summary> | ||||
|             Restarts the tween | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:DG.Tweening.Core.ABSAnimationComponent.DORestart(System.Boolean)"> | ||||
|             <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 DOTweenPath in different positions (like when using a pooling system)</param> | ||||
|         </member> | ||||
|         <member name="T:DG.Tweening.DOTweenPath"> | ||||
|             <summary> | ||||
|             Attach this to a GameObject to create and assign a path to it | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="E:DG.Tweening.DOTweenPath.OnReset"> | ||||
|             <summary>Used internally by the editor</summary> | ||||
|         </member> | ||||
|         <member name="M:DG.Tweening.DOTweenPath.DORestart"> | ||||
|             <summary> | ||||
|             Restarts the tween | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:DG.Tweening.DOTweenPath.DORestart(System.Boolean)"> | ||||
|             <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 DOTweenPath in different positions (like when using a pooling system)</param> | ||||
|         </member> | ||||
|         <member name="M:DG.Tweening.DOTweenPath.DOGotoAndPause(System.Single)"> | ||||
|             <summary> | ||||
|             Sends the tween to the given time then pauses it | ||||
|             </summary> | ||||
|             <param name="time">Time to send the tween to</param> | ||||
|         </member> | ||||
|         <member name="M:DG.Tweening.DOTweenPath.DOGotoAndPlay(System.Single)"> | ||||
|             <summary> | ||||
|             Sends the tween to the given time then plays it | ||||
|             </summary> | ||||
|             <param name="time">Time to send the tween to</param> | ||||
|         </member> | ||||
|         <member name="M:DG.Tweening.DOTweenPath.DOKillAllById(System.String)"> | ||||
|             <summary> | ||||
|             Kills all tweens (path/animations/etc.) with the given ID (regardless of their target gameObject) | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:DG.Tweening.DOTweenPath.GetDrawPoints"> | ||||
|             <summary> | ||||
|             Returns a list of points that are used to draw the path inside the editor, | ||||
|             or NULL if the path hasn't been initialized yet or if its tween has been killed | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="T:DG.Tweening.Plugins.SpiralPlugin"> | ||||
|             <summary> | ||||
|             Tweens a Vector3 along a spiral. | ||||
|             EndValue represents the direction of the spiral | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="T:DG.Tweening.SpiralMode"> | ||||
|             <summary> | ||||
|             Spiral tween mode | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:DG.Tweening.SpiralMode.Expand"> | ||||
|             <summary>The spiral motion will expand outwards for the whole the tween</summary> | ||||
|         </member> | ||||
|         <member name="F:DG.Tweening.SpiralMode.ExpandThenContract"> | ||||
|             <summary>The spiral motion will expand outwards for half the tween and then will spiral back to the starting position</summary> | ||||
|         </member> | ||||
|     </members> | ||||
| </doc> | ||||
							
								
								
									
										4
									
								
								Assets/Plugins/Demigiant/DOTweenPro/DOTweenPro.XML.meta
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								Assets/Plugins/Demigiant/DOTweenPro/DOTweenPro.XML.meta
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,4 @@ | |||
| fileFormatVersion: 2 | ||||
| guid: db7d7ef84c388bc4fbc3835d31a15306 | ||||
| TextScriptImporter: | ||||
|   userData:  | ||||
							
								
								
									
										
											BIN
										
									
								
								Assets/Plugins/Demigiant/DOTweenPro/DOTweenPro.dll
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								Assets/Plugins/Demigiant/DOTweenPro/DOTweenPro.dll
									
										
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										22
									
								
								Assets/Plugins/Demigiant/DOTweenPro/DOTweenPro.dll.meta
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								Assets/Plugins/Demigiant/DOTweenPro/DOTweenPro.dll.meta
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,22 @@ | |||
| fileFormatVersion: 2 | ||||
| guid: aa0b1eebb5db27a419fa4564bbe5c9c5 | ||||
| PluginImporter: | ||||
|   serializedVersion: 1 | ||||
|   iconMap: {} | ||||
|   executionOrder: {} | ||||
|   isPreloaded: 0 | ||||
|   platformData: | ||||
|     Any: | ||||
|       enabled: 1 | ||||
|       settings: {} | ||||
|     Editor: | ||||
|       enabled: 0 | ||||
|       settings: | ||||
|         DefaultValueInitialized: true | ||||
|     WindowsStoreApps: | ||||
|       enabled: 0 | ||||
|       settings: | ||||
|         CPU: AnyCPU | ||||
|   userData:  | ||||
|   assetBundleName:  | ||||
|   assetBundleVariant:  | ||||
							
								
								
									
										90
									
								
								Assets/Plugins/Demigiant/DOTweenPro/DOTweenProShortcuts.cs
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										90
									
								
								Assets/Plugins/Demigiant/DOTweenPro/DOTweenProShortcuts.cs
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,90 @@ | |||
| // Author: Daniele Giardini - http://www.demigiant.com | ||||
| // Created: 2018/07/13 | ||||
| 
 | ||||
| using System; | ||||
| using DG.Tweening.Core; | ||||
| using DG.Tweening.Plugins; | ||||
| using UnityEngine; | ||||
| 
 | ||||
| #pragma warning disable 1591 | ||||
| namespace DG.Tweening | ||||
| { | ||||
| 	public static class DOTweenProShortcuts | ||||
|     { | ||||
|         static DOTweenProShortcuts() | ||||
|         { | ||||
|             // Create stub instances of custom plugins, in order to allow IL2CPP to understand they must be included in the build | ||||
| #pragma warning disable 219 | ||||
|             SpiralPlugin stub = new SpiralPlugin(); | ||||
| #pragma warning restore 219 | ||||
|         } | ||||
| 
 | ||||
|         #region Shortcuts | ||||
| 
 | ||||
|         #region Transform | ||||
| 
 | ||||
|         /// <summary>Tweens a Transform's localPosition in a spiral shape. | ||||
|         /// Also stores the transform as the tween's target so it can be used for filtered operations</summary> | ||||
|         /// <param name="duration">The duration of the tween</param> | ||||
|         /// <param name="axis">The axis around which the spiral will rotate</param> | ||||
|         /// <param name="mode">The type of spiral movement</param> | ||||
|         /// <param name="speed">Speed of the rotations</param> | ||||
|         /// <param name="frequency">Frequency of the rotation. Lower values lead to wider spirals</param> | ||||
|         /// <param name="depth">Indicates how much the tween should move along the spiral's axis</param> | ||||
|         /// <param name="snapping">If TRUE the tween will smoothly snap all values to integers</param> | ||||
|         public static Tweener DOSpiral( | ||||
|             this Transform target, float duration, Vector3? axis = null, SpiralMode mode = SpiralMode.Expand, | ||||
|             float speed = 1, float frequency = 10, float depth = 0, bool snapping = false | ||||
|         ) { | ||||
|             if (Mathf.Approximately(speed, 0)) speed = 1; | ||||
|             if (axis == null || axis == Vector3.zero) axis = Vector3.forward; | ||||
| 
 | ||||
|             TweenerCore<Vector3, Vector3, SpiralOptions> t = DOTween.To(SpiralPlugin.Get(), () => target.localPosition, x => target.localPosition = x, (Vector3)axis, duration) | ||||
|                 .SetTarget(target); | ||||
| 
 | ||||
|             t.plugOptions.mode = mode; | ||||
|             t.plugOptions.speed = speed; | ||||
|             t.plugOptions.frequency = frequency; | ||||
|             t.plugOptions.depth = depth; | ||||
|             t.plugOptions.snapping = snapping; | ||||
|             return t; | ||||
|         } | ||||
| 
 | ||||
|         #endregion | ||||
| 
 | ||||
| #if true // PHYSICS_MARKER | ||||
|         #region Rigidbody | ||||
| 
 | ||||
|         /// <summary>Tweens a Rigidbody's position in a spiral shape. | ||||
|         /// Also stores the transform as the tween's target so it can be used for filtered operations</summary> | ||||
|         /// <param name="duration">The duration of the tween</param> | ||||
|         /// <param name="axis">The axis around which the spiral will rotate</param> | ||||
|         /// <param name="mode">The type of spiral movement</param> | ||||
|         /// <param name="speed">Speed of the rotations</param> | ||||
|         /// <param name="frequency">Frequency of the rotation. Lower values lead to wider spirals</param> | ||||
|         /// <param name="depth">Indicates how much the tween should move along the spiral's axis</param> | ||||
|         /// <param name="snapping">If TRUE the tween will smoothly snap all values to integers</param> | ||||
|         public static Tweener DOSpiral( | ||||
|             this Rigidbody target, float duration, Vector3? axis = null, SpiralMode mode = SpiralMode.Expand, | ||||
|             float speed = 1, float frequency = 10, float depth = 0, bool snapping = false | ||||
|         ) { | ||||
|             if (Mathf.Approximately(speed, 0)) speed = 1; | ||||
|             if (axis == null || axis == Vector3.zero) axis = Vector3.forward; | ||||
| 
 | ||||
|             TweenerCore<Vector3, Vector3, SpiralOptions> t = DOTween.To(SpiralPlugin.Get(), () => target.position, target.MovePosition, (Vector3)axis, duration) | ||||
|                 .SetTarget(target); | ||||
| 
 | ||||
|             t.plugOptions.mode = mode; | ||||
|             t.plugOptions.speed = speed; | ||||
|             t.plugOptions.frequency = frequency; | ||||
|             t.plugOptions.depth = depth; | ||||
|             t.plugOptions.snapping = snapping; | ||||
|             return t; | ||||
|         } | ||||
| 
 | ||||
|         #endregion | ||||
| #endif | ||||
| 
 | ||||
|         #endregion | ||||
| 	} | ||||
| } | ||||
|  | @ -0,0 +1,8 @@ | |||
| fileFormatVersion: 2 | ||||
| guid: 1c3190a1a1c53f449926f6d5542b4ce5 | ||||
| MonoImporter: | ||||
|   serializedVersion: 2 | ||||
|   defaultReferences: [] | ||||
|   executionOrder: 0 | ||||
|   icon: {instanceID: 0} | ||||
|   userData:  | ||||
							
								
								
									
										1037
									
								
								Assets/Plugins/Demigiant/DOTweenPro/DOTweenTextMeshPro.cs
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										1037
									
								
								Assets/Plugins/Demigiant/DOTweenPro/DOTweenTextMeshPro.cs
									
										
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							|  | @ -0,0 +1,8 @@ | |||
| fileFormatVersion: 2 | ||||
| guid: 8fb0d65aa5b048649a3a785b82b8f8db | ||||
| MonoImporter: | ||||
|   serializedVersion: 2 | ||||
|   defaultReferences: [] | ||||
|   executionOrder: 0 | ||||
|   icon: {instanceID: 0} | ||||
|   userData:  | ||||
							
								
								
									
										247
									
								
								Assets/Plugins/Demigiant/DOTweenPro/DOTweenTk2d.cs
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										247
									
								
								Assets/Plugins/Demigiant/DOTweenPro/DOTweenTk2d.cs
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,247 @@ | |||
| // Author: Daniele Giardini - http://www.demigiant.com | ||||
| // Created: 2014/10/27 15:59 | ||||
| //  | ||||
| // License Copyright (c) Daniele Giardini. | ||||
| // This work is subject to the terms at http://dotween.demigiant.com/license.php | ||||
| 
 | ||||
| #if false // MODULE_MARKER | ||||
| using DG.Tweening.Core; | ||||
| using DG.Tweening.Plugins.Options; | ||||
| using UnityEngine; | ||||
| 
 | ||||
| namespace DG.Tweening | ||||
| { | ||||
|     /// <summary> | ||||
|     /// Methods that extend 2D Toolkit objects and allow to directly create and control tweens from their instances. | ||||
|     /// </summary> | ||||
|     public static class ShortcutExtensionsTk2d | ||||
|     { | ||||
|         #region Sprite | ||||
| 
 | ||||
|         /// <summary>Tweens a 2D Toolkit Sprite's dimensions to the given value. | ||||
|         /// Also stores the Sprite as the tween's target so it can be used for filtered operations</summary> | ||||
|         /// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param> | ||||
|         public static TweenerCore<Vector3, Vector3, VectorOptions> DOScale(this tk2dBaseSprite target, Vector3 endValue, float duration) | ||||
|         { | ||||
|             TweenerCore<Vector3, Vector3, VectorOptions> t = DOTween.To(() => target.scale, x => target.scale = x, endValue, duration); | ||||
|             t.SetTarget(target); | ||||
|             return t; | ||||
|         } | ||||
|         /// <summary>Tweens a Sprite's dimensions to the given value. | ||||
|         /// Also stores the Sprite as the tween's target so it can be used for filtered operations</summary> | ||||
|         /// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param> | ||||
|         public static TweenerCore<Vector3, Vector3, VectorOptions> DOScaleX(this tk2dBaseSprite target, float endValue, float duration) | ||||
|         { | ||||
|             TweenerCore<Vector3, Vector3, VectorOptions> t = DOTween.To(() => target.scale, x => target.scale = x, new Vector3(endValue, 0, 0), duration); | ||||
|             t.SetOptions(AxisConstraint.X) | ||||
|                 .SetTarget(target); | ||||
|             return t; | ||||
|         } | ||||
|         /// <summary>Tweens a Sprite's dimensions to the given value. | ||||
|         /// Also stores the Sprite as the tween's target so it can be used for filtered operations</summary> | ||||
|         /// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param> | ||||
|         public static TweenerCore<Vector3, Vector3, VectorOptions> DOScaleY(this tk2dBaseSprite target, float endValue, float duration) | ||||
|         { | ||||
|             TweenerCore<Vector3, Vector3, VectorOptions> t = DOTween.To(() => target.scale, x => target.scale = x, new Vector3(0, endValue, 0), duration); | ||||
|             t.SetOptions(AxisConstraint.Y) | ||||
|                 .SetTarget(target); | ||||
|             return t; | ||||
|         } | ||||
|         /// <summary>Tweens a Sprite's dimensions to the given value. | ||||
|         /// Also stores the Sprite as the tween's target so it can be used for filtered operations</summary> | ||||
|         /// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param> | ||||
|         public static TweenerCore<Vector3, Vector3, VectorOptions> DOScaleZ(this tk2dBaseSprite target, float endValue, float duration) | ||||
|         { | ||||
|             TweenerCore<Vector3, Vector3, VectorOptions> t = DOTween.To(() => target.scale, x => target.scale = x, new Vector3(0, 0, endValue), duration); | ||||
|             t.SetOptions(AxisConstraint.Z) | ||||
|                 .SetTarget(target); | ||||
|             return t; | ||||
|         } | ||||
| 
 | ||||
|         /// <summary>Tweens a 2D Toolkit Sprite's color to the given value. | ||||
|         /// Also stores the Sprite as the tween's target so it can be used for filtered operations</summary> | ||||
|         /// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param> | ||||
|         public static TweenerCore<Color, Color, ColorOptions> DOColor(this tk2dBaseSprite target, Color endValue, float duration) | ||||
|         { | ||||
|             TweenerCore<Color, Color, ColorOptions> t = DOTween.To(() => target.color, x => target.color = x, endValue, duration); | ||||
|             t.SetTarget(target); | ||||
|             return t; | ||||
|         } | ||||
| 
 | ||||
|         /// <summary>Tweens a 2D Toolkit Sprite's alpha color to the given value. | ||||
|         /// Also stores the Sprite as the tween's target so it can be used for filtered operations</summary> | ||||
|         /// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param> | ||||
|         public static TweenerCore<Color, Color, ColorOptions> DOFade(this tk2dBaseSprite target, float endValue, float duration) | ||||
|         { | ||||
|             TweenerCore<Color, Color, ColorOptions> t = DOTween.ToAlpha(() => target.color, x => target.color = x, endValue, duration); | ||||
|             t.SetTarget(target); | ||||
|             return t; | ||||
|         } | ||||
| 
 | ||||
|         /// <summary>Tweens a 2D Toolkit Sprite's color using the given gradient | ||||
|         /// (NOTE 1: only uses the colors of the gradient, not the alphas - NOTE 2: creates a Sequence, not a Tweener). | ||||
|         /// Also stores the image as the tween's target so it can be used for filtered operations</summary> | ||||
|         /// <param name="gradient">The gradient to use</param><param name="duration">The duration of the tween</param> | ||||
|         public static Sequence DOGradientColor(this tk2dBaseSprite target, Gradient gradient, float duration) | ||||
|         { | ||||
|             Sequence s = DOTween.Sequence(); | ||||
|             GradientColorKey[] colors = gradient.colorKeys; | ||||
|             int len = colors.Length; | ||||
|             for (int i = 0; i < len; ++i) { | ||||
|                 GradientColorKey c = colors[i]; | ||||
|                 if (i == 0 && c.time <= 0) { | ||||
|                     target.color = c.color; | ||||
|                     continue; | ||||
|                 } | ||||
|                 float colorDuration = i == len - 1 | ||||
|                     ? duration - s.Duration(false) // Verifies that total duration is correct | ||||
|                     : duration * (i == 0 ? c.time : c.time - colors[i - 1].time); | ||||
|                 s.Append(target.DOColor(c.color, colorDuration).SetEase(Ease.Linear)); | ||||
|             } | ||||
|             s.SetTarget(target); | ||||
|             return s; | ||||
|         } | ||||
| 
 | ||||
|         #endregion | ||||
| 
 | ||||
|         #region tk2dSlicedSprite | ||||
| 
 | ||||
|         /// <summary>Tweens a 2D Toolkit SlicedSprite's dimensions to the given value. | ||||
|         /// Also stores the SlicedSprite as the tween's target so it can be used for filtered operations</summary> | ||||
|         /// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param> | ||||
|         public static TweenerCore<Vector2, Vector2, VectorOptions> DOScaleDimensions(this tk2dSlicedSprite target, Vector2 endValue, float duration) | ||||
|         { | ||||
|             TweenerCore<Vector2, Vector2, VectorOptions> t = DOTween.To(() => target.dimensions, x => target.dimensions = x, endValue, duration); | ||||
|             t.SetTarget(target); | ||||
|             return t; | ||||
|         } | ||||
|         /// <summary>Tweens a SlicedSprite's dimensions to the given value. | ||||
|         /// Also stores the SlicedSprite as the tween's target so it can be used for filtered operations</summary> | ||||
|         /// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param> | ||||
|         public static TweenerCore<Vector2, Vector2, VectorOptions> DOScaleDimensionsX(this tk2dSlicedSprite target, float endValue, float duration) | ||||
|         { | ||||
|             TweenerCore<Vector2, Vector2, VectorOptions> t = DOTween.To(() => target.dimensions, x => target.dimensions = x, new Vector2(endValue, 0), duration); | ||||
|             t.SetOptions(AxisConstraint.X) | ||||
|                 .SetTarget(target); | ||||
|             return t; | ||||
|         } | ||||
|         /// <summary>Tweens a SlicedSprite's dimensions to the given value. | ||||
|         /// Also stores the SlicedSprite as the tween's target so it can be used for filtered operations</summary> | ||||
|         /// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param> | ||||
|         public static TweenerCore<Vector2, Vector2, VectorOptions> DOScaleDimensionsY(this tk2dSlicedSprite target, float endValue, float duration) | ||||
|         { | ||||
|             TweenerCore<Vector2, Vector2, VectorOptions> t = DOTween.To(() => target.dimensions, x => target.dimensions = x, new Vector2(0, endValue), duration); | ||||
|             t.SetOptions(AxisConstraint.Y) | ||||
|                 .SetTarget(target); | ||||
|             return t; | ||||
|         } | ||||
| 
 | ||||
|         #endregion | ||||
| 
 | ||||
|         #region TextMesh | ||||
| 
 | ||||
|         /// <summary>Tweens a 2D Toolkit TextMesh's dimensions to the given value. | ||||
|         /// Also stores the TextMesh as the tween's target so it can be used for filtered operations</summary> | ||||
|         /// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param> | ||||
|         public static TweenerCore<Vector3, Vector3, VectorOptions> DOScale(this tk2dTextMesh target, Vector3 endValue, float duration) | ||||
|         { | ||||
|             TweenerCore<Vector3, Vector3, VectorOptions> t = DOTween.To(() => target.scale, x => target.scale = x, endValue, duration); | ||||
|             t.SetTarget(target); | ||||
|             return t; | ||||
|         } | ||||
|         /// <summary>Tweens a 2D Toolkit TextMesh's dimensions to the given value. | ||||
|         /// Also stores the TextMesh as the tween's target so it can be used for filtered operations</summary> | ||||
|         /// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param> | ||||
|         public static TweenerCore<Vector3, Vector3, VectorOptions> DOScaleX(this tk2dTextMesh target, float endValue, float duration) | ||||
|         { | ||||
|             TweenerCore<Vector3, Vector3, VectorOptions> t = DOTween.To(() => target.scale, x => target.scale = x, new Vector3(endValue, 0, 0), duration); | ||||
|             t.SetOptions(AxisConstraint.X) | ||||
|                 .SetTarget(target); | ||||
|             return t; | ||||
|         } | ||||
|         /// <summary>Tweens a 2D Toolkit TextMesh's dimensions to the given value. | ||||
|         /// Also stores the TextMesh as the tween's target so it can be used for filtered operations</summary> | ||||
|         /// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param> | ||||
|         public static TweenerCore<Vector3, Vector3, VectorOptions> DOScaleY(this tk2dTextMesh target, float endValue, float duration) | ||||
|         { | ||||
|             TweenerCore<Vector3, Vector3, VectorOptions> t = DOTween.To(() => target.scale, x => target.scale = x, new Vector3(0, endValue, 0), duration); | ||||
|             t.SetOptions(AxisConstraint.Y) | ||||
|                 .SetTarget(target); | ||||
|             return t; | ||||
|         } | ||||
|         /// <summary>Tweens a 2D Toolkit TextMesh's dimensions to the given value. | ||||
|         /// Also stores the TextMesh as the tween's target so it can be used for filtered operations</summary> | ||||
|         /// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param> | ||||
|         public static TweenerCore<Vector3, Vector3, VectorOptions> DOScaleZ(this tk2dTextMesh target, float endValue, float duration) | ||||
|         { | ||||
|             TweenerCore<Vector3, Vector3, VectorOptions> t = DOTween.To(() => target.scale, x => target.scale = x, new Vector3(0, 0, endValue), duration); | ||||
|             t.SetOptions(AxisConstraint.Z) | ||||
|                 .SetTarget(target); | ||||
|             return t; | ||||
|         } | ||||
| 
 | ||||
|         /// <summary>Tweens a 2D Toolkit TextMesh's color to the given value. | ||||
|         /// Also stores the TextMesh as the tween's target so it can be used for filtered operations</summary> | ||||
|         /// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param> | ||||
|         public static TweenerCore<Color, Color, ColorOptions> DOColor(this tk2dTextMesh target, Color endValue, float duration) | ||||
|         { | ||||
|             TweenerCore<Color, Color, ColorOptions> t = DOTween.To(() => target.color, x => target.color = x, endValue, duration); | ||||
|             t.SetTarget(target); | ||||
|             return t; | ||||
|         } | ||||
| 
 | ||||
|         /// <summary>Tweens a 2D Toolkit TextMesh's alpha color to the given value. | ||||
|         /// Also stores the TextMesh as the tween's target so it can be used for filtered operations</summary> | ||||
|         /// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param> | ||||
|         public static TweenerCore<Color, Color, ColorOptions> DOFade(this tk2dTextMesh target, float endValue, float duration) | ||||
|         { | ||||
|             TweenerCore<Color, Color, ColorOptions> t = DOTween.ToAlpha(() => target.color, x => target.color = x, endValue, duration); | ||||
|             t.SetTarget(target); | ||||
|             return t; | ||||
|         } | ||||
| 
 | ||||
|         /// <summary>Tweens a 2D Toolkit TextMesh's color using the given gradient | ||||
|         /// (NOTE 1: only uses the colors of the gradient, not the alphas - NOTE 2: creates a Sequence, not a Tweener). | ||||
|         /// Also stores the image as the tween's target so it can be used for filtered operations</summary> | ||||
|         /// <param name="gradient">The gradient to use</param><param name="duration">The duration of the tween</param> | ||||
|         public static Sequence DOGradientColor(this tk2dTextMesh target, Gradient gradient, float duration) | ||||
|         { | ||||
|             Sequence s = DOTween.Sequence(); | ||||
|             GradientColorKey[] colors = gradient.colorKeys; | ||||
|             int len = colors.Length; | ||||
|             for (int i = 0; i < len; ++i) { | ||||
|                 GradientColorKey c = colors[i]; | ||||
|                 if (i == 0 && c.time <= 0) { | ||||
|                     target.color = c.color; | ||||
|                     continue; | ||||
|                 } | ||||
|                 float colorDuration = i == len - 1 | ||||
|                     ? duration - s.Duration(false) // Verifies that total duration is correct | ||||
|                     : duration * (i == 0 ? c.time : c.time - colors[i - 1].time); | ||||
|                 s.Append(target.DOColor(c.color, colorDuration).SetEase(Ease.Linear)); | ||||
|             } | ||||
|             s.SetTarget(target); | ||||
|             return s; | ||||
|         } | ||||
| 
 | ||||
|         /// <summary>Tweens a tk2dTextMesh's text to the given value. | ||||
|         /// Also stores the tk2dTextMesh as the tween's target so it can be used for filtered operations</summary> | ||||
|         /// <param name="endValue">The end string to tween to</param><param name="duration">The duration of the tween</param> | ||||
|         /// <param name="richTextEnabled">If TRUE (default), rich text will be interpreted correctly while animated, | ||||
|         /// otherwise all tags will be considered as normal text</param> | ||||
|         /// <param name="scrambleMode">The type of scramble mode to use, if any</param> | ||||
|         /// <param name="scrambleChars">A string containing the characters to use for scrambling. | ||||
|         /// Use as many characters as possible (minimum 10) because DOTween uses a fast scramble mode which gives better results with more characters. | ||||
|         /// Leave it to NULL (default) to use default ones</param> | ||||
|         public static TweenerCore<string, string, StringOptions> DOText(this tk2dTextMesh target, string endValue, float duration, bool richTextEnabled = true, ScrambleMode scrambleMode = ScrambleMode.None, string scrambleChars = null) | ||||
|         { | ||||
|             TweenerCore<string, string, StringOptions> t = DOTween.To(() => target.text, x => target.text = x, endValue, duration); | ||||
|             t.SetOptions(richTextEnabled, scrambleMode, scrambleChars) | ||||
|                 .SetTarget(target); | ||||
|             return t; | ||||
|         } | ||||
| 
 | ||||
|         #endregion | ||||
|     } | ||||
| } | ||||
| #endif | ||||
							
								
								
									
										8
									
								
								Assets/Plugins/Demigiant/DOTweenPro/DOTweenTk2d.cs.meta
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								Assets/Plugins/Demigiant/DOTweenPro/DOTweenTk2d.cs.meta
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,8 @@ | |||
| fileFormatVersion: 2 | ||||
| guid: b590cd7c24ffa5d4faa5b6fa993cccad | ||||
| MonoImporter: | ||||
|   serializedVersion: 2 | ||||
|   defaultReferences: [] | ||||
|   executionOrder: 0 | ||||
|   icon: {instanceID: 0} | ||||
|   userData:  | ||||
							
								
								
									
										5
									
								
								Assets/Plugins/Demigiant/DOTweenPro/Editor.meta
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								Assets/Plugins/Demigiant/DOTweenPro/Editor.meta
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,5 @@ | |||
| fileFormatVersion: 2 | ||||
| guid: 34ca5bde92f87fa4dbeb9593d201fde2 | ||||
| folderAsset: yes | ||||
| DefaultImporter: | ||||
|   userData:  | ||||
|  | @ -0,0 +1,764 @@ | |||
| // Author: Daniele Giardini - http://www.demigiant.com | ||||
| // Created: 2015/03/12 16:03 | ||||
| 
 | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.IO; | ||||
| using DG.DemiEditor; | ||||
| using DG.DOTweenEditor.Core; | ||||
| using DG.DOTweenEditor.UI; | ||||
| using DG.Tweening; | ||||
| using DG.Tweening.Core; | ||||
| using UnityEditor; | ||||
| using UnityEngine; | ||||
| using DOTweenSettings = DG.Tweening.Core.DOTweenSettings; | ||||
| #if true // UI_MARKER | ||||
| using UnityEngine.UI; | ||||
| #endif | ||||
| #if false // TEXTMESHPRO_MARKER | ||||
|     using TMPro; | ||||
| #endif | ||||
| 
 | ||||
| namespace DG.DOTweenEditor | ||||
| { | ||||
|     [CustomEditor(typeof(DOTweenAnimation))] | ||||
|     public class DOTweenAnimationInspector : ABSAnimationInspector | ||||
|     { | ||||
|         enum FadeTargetType | ||||
|         { | ||||
|             CanvasGroup, | ||||
|             Image | ||||
|         } | ||||
| 
 | ||||
|         enum ChooseTargetMode | ||||
|         { | ||||
|             None, | ||||
|             BetweenCanvasGroupAndImage | ||||
|         } | ||||
| 
 | ||||
|         static readonly Dictionary<DOTweenAnimation.AnimationType, Type[]> _AnimationTypeToComponent = new Dictionary<DOTweenAnimation.AnimationType, Type[]>() { | ||||
|             { DOTweenAnimation.AnimationType.Move, new[] { | ||||
| #if true // PHYSICS_MARKER | ||||
|                 typeof(Rigidbody), | ||||
| #endif | ||||
| #if true // PHYSICS2D_MARKER | ||||
|                 typeof(Rigidbody2D), | ||||
| #endif | ||||
| #if true // UI_MARKER | ||||
|                 typeof(RectTransform), | ||||
| #endif | ||||
|                 typeof(Transform) | ||||
|             }}, | ||||
|             { DOTweenAnimation.AnimationType.Rotate, new[] { | ||||
| #if true // PHYSICS_MARKER | ||||
|                 typeof(Rigidbody), | ||||
| #endif | ||||
| #if true // PHYSICS2D_MARKER | ||||
|                 typeof(Rigidbody2D), | ||||
| #endif | ||||
|                 typeof(Transform) | ||||
|             }}, | ||||
|             { DOTweenAnimation.AnimationType.LocalMove, new[] { typeof(Transform) } }, | ||||
|             { DOTweenAnimation.AnimationType.LocalRotate, new[] { typeof(Transform) } }, | ||||
|             { DOTweenAnimation.AnimationType.Scale, new[] { typeof(Transform) } }, | ||||
|             { DOTweenAnimation.AnimationType.Color, new[] { | ||||
|                 typeof(Light), | ||||
| #if true // SPRITE_MARKER | ||||
|                 typeof(SpriteRenderer), | ||||
| #endif | ||||
| #if true // UI_MARKER | ||||
|                 typeof(Image), typeof(Text), typeof(RawImage), typeof(Graphic), | ||||
| #endif | ||||
|                 typeof(Renderer), | ||||
|             }}, | ||||
|             { DOTweenAnimation.AnimationType.Fade, new[] { | ||||
|                 typeof(Light), | ||||
| #if true // SPRITE_MARKER | ||||
|                 typeof(SpriteRenderer), | ||||
| #endif | ||||
| #if true // UI_MARKER | ||||
|                 typeof(Image), typeof(Text), typeof(CanvasGroup), typeof(RawImage), typeof(Graphic), | ||||
| #endif | ||||
|                 typeof(Renderer), | ||||
|             }}, | ||||
| #if true // UI_MARKER | ||||
|             { DOTweenAnimation.AnimationType.Text, new[] { typeof(Text) } }, | ||||
| #endif | ||||
|             { DOTweenAnimation.AnimationType.PunchPosition, new[] { | ||||
| #if true // UI_MARKER | ||||
|                 typeof(RectTransform), | ||||
| #endif | ||||
|                 typeof(Transform) | ||||
|             }}, | ||||
|             { DOTweenAnimation.AnimationType.PunchRotation, new[] { typeof(Transform) } }, | ||||
|             { DOTweenAnimation.AnimationType.PunchScale, new[] { typeof(Transform) } }, | ||||
|             { DOTweenAnimation.AnimationType.ShakePosition, new[] { | ||||
| #if true // UI_MARKER | ||||
|                 typeof(RectTransform), | ||||
| #endif | ||||
|                 typeof(Transform) | ||||
|             }}, | ||||
|             { DOTweenAnimation.AnimationType.ShakeRotation, new[] { typeof(Transform) } }, | ||||
|             { DOTweenAnimation.AnimationType.ShakeScale, new[] { typeof(Transform) } }, | ||||
|             { DOTweenAnimation.AnimationType.CameraAspect, new[] { typeof(Camera) } }, | ||||
|             { DOTweenAnimation.AnimationType.CameraBackgroundColor, new[] { typeof(Camera) } }, | ||||
|             { DOTweenAnimation.AnimationType.CameraFieldOfView, new[] { typeof(Camera) } }, | ||||
|             { DOTweenAnimation.AnimationType.CameraOrthoSize, new[] { typeof(Camera) } }, | ||||
|             { DOTweenAnimation.AnimationType.CameraPixelRect, new[] { typeof(Camera) } }, | ||||
|             { DOTweenAnimation.AnimationType.CameraRect, new[] { typeof(Camera) } }, | ||||
| #if true // UI_MARKER | ||||
|             { DOTweenAnimation.AnimationType.UIWidthHeight, new[] { typeof(RectTransform) } }, | ||||
|             { DOTweenAnimation.AnimationType.FillAmount, new[] { typeof(Image) } }, | ||||
| #endif | ||||
|         }; | ||||
| 
 | ||||
| #if false // TK2D_MARKER | ||||
|         static readonly Dictionary<DOTweenAnimation.AnimationType, Type[]> _Tk2dAnimationTypeToComponent = new Dictionary<DOTweenAnimation.AnimationType, Type[]>() { | ||||
|             { DOTweenAnimation.AnimationType.Scale, new[] { typeof(tk2dBaseSprite), typeof(tk2dTextMesh) } }, | ||||
|             { DOTweenAnimation.AnimationType.Color, new[] { typeof(tk2dBaseSprite), typeof(tk2dTextMesh) } }, | ||||
|             { DOTweenAnimation.AnimationType.Fade, new[] { typeof(tk2dBaseSprite), typeof(tk2dTextMesh) } }, | ||||
|             { DOTweenAnimation.AnimationType.Text, new[] { typeof(tk2dTextMesh) } } | ||||
|         }; | ||||
| #endif | ||||
| #if false // TEXTMESHPRO_MARKER | ||||
|         static readonly Dictionary<DOTweenAnimation.AnimationType, Type[]> _TMPAnimationTypeToComponent = new Dictionary<DOTweenAnimation.AnimationType, Type[]>() { | ||||
|             { DOTweenAnimation.AnimationType.Color, new[] { typeof(TextMeshPro), typeof(TextMeshProUGUI) } }, | ||||
|             { DOTweenAnimation.AnimationType.Fade, new[] { typeof(TextMeshPro), typeof(TextMeshProUGUI) } }, | ||||
|             { DOTweenAnimation.AnimationType.Text, new[] { typeof(TextMeshPro), typeof(TextMeshProUGUI) } } | ||||
|         }; | ||||
| #endif | ||||
| 
 | ||||
|         static readonly string[] _AnimationType = new[] { | ||||
|             "None", | ||||
|             "Move", "LocalMove", | ||||
|             "Rotate", "LocalRotate", | ||||
|             "Scale", | ||||
|             "Color", "Fade", | ||||
| #if true // UI_MARKER | ||||
|             "FillAmount", | ||||
|             "Text", | ||||
| #endif | ||||
| #if false // TK2D_MARKER | ||||
|             "Text", | ||||
| #endif | ||||
| #if false // TEXTMESHPRO_MARKER | ||||
|             "Text", | ||||
| #endif | ||||
| #if true // UI_MARKER | ||||
|             "UIWidthHeight", | ||||
| #endif | ||||
|             "Punch/Position", "Punch/Rotation", "Punch/Scale", | ||||
|             "Shake/Position", "Shake/Rotation", "Shake/Scale", | ||||
|             "Camera/Aspect", "Camera/BackgroundColor", "Camera/FieldOfView", "Camera/OrthoSize", "Camera/PixelRect", "Camera/Rect" | ||||
|         }; | ||||
|         static string[] _animationTypeNoSlashes; // _AnimationType list without slashes in values | ||||
|         static string[] _datString; // String representation of DOTweenAnimation enum (here for caching reasons) | ||||
| 
 | ||||
|         DOTweenAnimation _src; | ||||
|         DOTweenSettings _settings; | ||||
|         bool _runtimeEditMode; // If TRUE allows to change and save stuff at runtime | ||||
|         bool _refreshRequired; // If TRUE refreshes components data | ||||
|         int _totComponentsOnSrc; // Used to determine if a Component is added or removed from the source | ||||
|         bool _isLightSrc; // Used to determine if we're tweening a Light, to set the max Fade value to more than 1 | ||||
| #pragma warning disable 414 | ||||
|         ChooseTargetMode _chooseTargetMode = ChooseTargetMode.None; | ||||
| #pragma warning restore 414 | ||||
| 
 | ||||
|         static readonly GUIContent _GuiC_selfTarget_true = new GUIContent( | ||||
|             "SELF", "Will animate components on this gameObject" | ||||
|         ); | ||||
|         static readonly GUIContent _GuiC_selfTarget_false = new GUIContent( | ||||
|             "OTHER", "Will animate components on the given gameObject instead than on this one" | ||||
|         ); | ||||
|         static readonly GUIContent _GuiC_tweenTargetIsTargetGO_true = new GUIContent( | ||||
|             "Use As Tween Target", "Will set the tween target (via SetTarget, used to control a tween directly from a target) to the \"OTHER\" gameObject" | ||||
|         ); | ||||
|         static readonly GUIContent _GuiC_tweenTargetIsTargetGO_false = new GUIContent( | ||||
|             "Use As Tween Target", "Will set the tween target (via SetTarget, used to control a tween directly from a target) to the gameObject containing this animation, not the \"OTHER\" one" | ||||
|         ); | ||||
| 
 | ||||
|         #region MonoBehaviour Methods | ||||
| 
 | ||||
|         void OnEnable() | ||||
|         { | ||||
|             _src = target as DOTweenAnimation; | ||||
|             _settings = DOTweenUtilityWindow.GetDOTweenSettings(); | ||||
| 
 | ||||
|             onStartProperty = base.serializedObject.FindProperty("onStart"); | ||||
|             onPlayProperty = base.serializedObject.FindProperty("onPlay"); | ||||
|             onUpdateProperty = base.serializedObject.FindProperty("onUpdate"); | ||||
|             onStepCompleteProperty = base.serializedObject.FindProperty("onStepComplete"); | ||||
|             onCompleteProperty = base.serializedObject.FindProperty("onComplete"); | ||||
|             onRewindProperty = base.serializedObject.FindProperty("onRewind"); | ||||
|             onTweenCreatedProperty = base.serializedObject.FindProperty("onTweenCreated"); | ||||
| 
 | ||||
|             // Convert _AnimationType to _animationTypeNoSlashes | ||||
|             int len = _AnimationType.Length; | ||||
|             _animationTypeNoSlashes = new string[len]; | ||||
|             for (int i = 0; i < len; ++i) { | ||||
|                 string a = _AnimationType[i]; | ||||
|                 a = a.Replace("/", ""); | ||||
|                 _animationTypeNoSlashes[i] = a; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         void OnDisable() | ||||
|         { | ||||
|             DOTweenPreviewManager.StopAllPreviews(); | ||||
|         } | ||||
| 
 | ||||
|         override public void OnInspectorGUI() | ||||
|         { | ||||
|         	base.OnInspectorGUI(); | ||||
| 
 | ||||
|             GUILayout.Space(3); | ||||
|             EditorGUIUtils.SetGUIStyles(); | ||||
| 
 | ||||
|             bool playMode = Application.isPlaying; | ||||
|             _runtimeEditMode = _runtimeEditMode && playMode; | ||||
| 
 | ||||
|             GUILayout.BeginHorizontal(); | ||||
|             EditorGUIUtils.InspectorLogo(); | ||||
|             GUILayout.Label(_src.animationType.ToString() + (string.IsNullOrEmpty(_src.id) ? "" : " [" + _src.id + "]"), EditorGUIUtils.sideLogoIconBoldLabelStyle); | ||||
|             // Up-down buttons | ||||
|             GUILayout.FlexibleSpace(); | ||||
|             if (GUILayout.Button("▲", DeGUI.styles.button.toolIco)) UnityEditorInternal.ComponentUtility.MoveComponentUp(_src); | ||||
|             if (GUILayout.Button("▼", DeGUI.styles.button.toolIco)) UnityEditorInternal.ComponentUtility.MoveComponentDown(_src); | ||||
|             GUILayout.EndHorizontal(); | ||||
| 
 | ||||
|             if (playMode) { | ||||
|                 if (_runtimeEditMode) { | ||||
|                      | ||||
|                 } else { | ||||
|                     GUILayout.Space(8); | ||||
|                     GUILayout.Label("Animation Editor disabled while in play mode", EditorGUIUtils.wordWrapLabelStyle); | ||||
|                     if (!_src.isActive) { | ||||
|                         GUILayout.Label("This animation has been toggled as inactive and won't be generated", EditorGUIUtils.wordWrapLabelStyle); | ||||
|                         GUI.enabled = false; | ||||
|                     } | ||||
|                     if (GUILayout.Button(new GUIContent("Activate Edit Mode", "Switches to Runtime Edit Mode, where you can change animations values and restart them"))) { | ||||
|                         _runtimeEditMode = true; | ||||
|                     } | ||||
|                     GUILayout.Label("NOTE: when using DOPlayNext, the sequence is determined by the DOTweenAnimation Components order in the target GameObject's Inspector", EditorGUIUtils.wordWrapLabelStyle); | ||||
|                     GUILayout.Space(10); | ||||
|                     if (!_runtimeEditMode) return; | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             Undo.RecordObject(_src, "DOTween Animation"); | ||||
|             Undo.RecordObject(_settings, "DOTween Animation"); | ||||
| 
 | ||||
| //            _src.isValid = Validate(); // Moved down | ||||
| 
 | ||||
|             EditorGUIUtility.labelWidth = 110; | ||||
| 
 | ||||
|             if (playMode) { | ||||
|                 GUILayout.Space(4); | ||||
|                 DeGUILayout.Toolbar("Edit Mode Commands"); | ||||
|                 DeGUILayout.BeginVBox(DeGUI.styles.box.stickyTop); | ||||
|                     GUILayout.BeginHorizontal(); | ||||
|                     if (GUILayout.Button("TogglePause")) _src.tween.TogglePause(); | ||||
|                     if (GUILayout.Button("Rewind")) _src.tween.Rewind(); | ||||
|                     if (GUILayout.Button("Restart")) _src.tween.Restart(); | ||||
|                     GUILayout.EndHorizontal(); | ||||
|                     if (GUILayout.Button("Commit changes and restart")) { | ||||
|                         _src.tween.Rewind(); | ||||
|                         _src.tween.Kill(); | ||||
|                         if (_src.isValid) { | ||||
|                             _src.CreateTween(); | ||||
|                             _src.tween.Play(); | ||||
|                         } | ||||
|                     } | ||||
|                     GUILayout.Label("To apply your changes when exiting Play mode, use the Component's upper right menu and choose \"Copy Component\", then \"Paste Component Values\" after exiting Play mode", DeGUI.styles.label.wordwrap); | ||||
|                 DeGUILayout.EndVBox(); | ||||
|             } else { | ||||
|                 GUILayout.BeginHorizontal(); | ||||
|                 bool hasManager = _src.GetComponent<DOTweenVisualManager>() != null; | ||||
|                 EditorGUI.BeginChangeCheck(); | ||||
|                 _settings.showPreviewPanel = hasManager | ||||
|                     ? DeGUILayout.ToggleButton(_settings.showPreviewPanel, "Preview Controls", styles.custom.inlineToggle) | ||||
|                     : DeGUILayout.ToggleButton(_settings.showPreviewPanel, "Preview Controls", styles.custom.inlineToggle, GUILayout.Width(120)); | ||||
|                 if (EditorGUI.EndChangeCheck()) { | ||||
|                     EditorUtility.SetDirty(_settings); | ||||
|                     DOTweenPreviewManager.StopAllPreviews(); | ||||
|                 } | ||||
|                 if (!hasManager) { | ||||
|                     if (GUILayout.Button(new GUIContent("Add Manager", "Adds a manager component which allows you to choose additional options for this gameObject"))) { | ||||
|                         _src.gameObject.AddComponent<DOTweenVisualManager>(); | ||||
|                     } | ||||
|                 } | ||||
|                 GUILayout.EndHorizontal(); | ||||
|             } | ||||
| 
 | ||||
|             // Preview in editor | ||||
|             bool isPreviewing = _settings.showPreviewPanel ? DOTweenPreviewManager.PreviewGUI(_src) : false; | ||||
| 
 | ||||
|             EditorGUI.BeginDisabledGroup(isPreviewing); | ||||
|             // Choose target | ||||
|             GUILayout.BeginHorizontal(); | ||||
|                 _src.isActive = EditorGUILayout.Toggle(new GUIContent("", "If unchecked, this animation will not be created"), _src.isActive, GUILayout.Width(14)); | ||||
|                 EditorGUI.BeginChangeCheck(); | ||||
|                     EditorGUI.BeginChangeCheck(); | ||||
|                         _src.targetIsSelf = DeGUILayout.ToggleButton( | ||||
|                             _src.targetIsSelf, _src.targetIsSelf ? _GuiC_selfTarget_true : _GuiC_selfTarget_false, | ||||
|                             new Color(1f, 0.78f, 0f), DeGUI.colors.bg.toggleOn, new Color(0.33f, 0.14f, 0.02f), DeGUI.colors.content.toggleOn, | ||||
|                             null, GUILayout.Width(47) | ||||
|                         ); | ||||
|                     bool innerChanged = EditorGUI.EndChangeCheck(); | ||||
|                     if (innerChanged) { | ||||
|                         _src.targetGO = null; | ||||
|                         GUI.changed = true; | ||||
|                     } | ||||
|                     if (_src.targetIsSelf) GUILayout.Label(_GuiC_selfTarget_true.tooltip); | ||||
|                     else { | ||||
|                         using (new DeGUI.ColorScope(null, null, _src.targetGO == null ? Color.red : Color.white)) { | ||||
|                             _src.targetGO = (GameObject)EditorGUILayout.ObjectField(_src.targetGO, typeof(GameObject), true); | ||||
|                         } | ||||
|                         _src.tweenTargetIsTargetGO = DeGUILayout.ToggleButton( | ||||
|                             _src.tweenTargetIsTargetGO, _src.tweenTargetIsTargetGO ? _GuiC_tweenTargetIsTargetGO_true : _GuiC_tweenTargetIsTargetGO_false, | ||||
|                             GUILayout.Width(131) | ||||
|                         ); | ||||
|                     } | ||||
|                 bool check = EditorGUI.EndChangeCheck(); | ||||
|                 if (check) _refreshRequired = true; | ||||
|             GUILayout.EndHorizontal(); | ||||
| 
 | ||||
|             GameObject targetGO = _src.targetIsSelf ? _src.gameObject : _src.targetGO; | ||||
| 
 | ||||
|             if (targetGO == null) { | ||||
|                 // Uses external target gameObject but it's not set | ||||
|                 if (_src.targetGO != null || _src.target != null) { | ||||
|                     _src.targetGO = null; | ||||
|                     _src.target = null; | ||||
|                     GUI.changed = true; | ||||
|                 } | ||||
|             } else { | ||||
|                 GUILayout.BeginHorizontal(); | ||||
|                 DOTweenAnimation.AnimationType prevAnimType = _src.animationType; | ||||
| //                _src.animationType = (DOTweenAnimation.AnimationType)EditorGUILayout.EnumPopup(_src.animationType, EditorGUIUtils.popupButton); | ||||
|                 GUI.enabled = GUI.enabled && _src.isActive; | ||||
|                 _src.animationType = AnimationToDOTweenAnimationType(_AnimationType[EditorGUILayout.Popup(DOTweenAnimationTypeToPopupId(_src.animationType), _AnimationType)]); | ||||
|                 _src.autoGenerate = DeGUILayout.ToggleButton(_src.autoGenerate, new GUIContent("AutoGenerate", "If selected, the tween will be generated at startup (during Start for RectTransform position tween, Awake for all the others)")); | ||||
|                 if (_src.autoGenerate) { | ||||
|                     _src.autoPlay = DeGUILayout.ToggleButton(_src.autoPlay, new GUIContent("AutoPlay", "If selected, the tween will play automatically")); | ||||
|                 } | ||||
|                 _src.autoKill = DeGUILayout.ToggleButton(_src.autoKill, new GUIContent("AutoKill", "If selected, the tween will be killed when it completes, and won't be reusable")); | ||||
|                 GUILayout.EndHorizontal(); | ||||
|                 if (prevAnimType != _src.animationType) { | ||||
|                     // Set default optional values based on animation type | ||||
|                     _src.endValueTransform = null; | ||||
|                     _src.useTargetAsV3 = false; | ||||
|                     switch (_src.animationType) { | ||||
|                     case DOTweenAnimation.AnimationType.Move: | ||||
|                     case DOTweenAnimation.AnimationType.LocalMove: | ||||
|                     case DOTweenAnimation.AnimationType.Rotate: | ||||
|                     case DOTweenAnimation.AnimationType.LocalRotate: | ||||
|                     case DOTweenAnimation.AnimationType.Scale: | ||||
|                         _src.endValueV3 = Vector3.zero; | ||||
|                         _src.endValueFloat = 0; | ||||
|                         _src.optionalBool0 = _src.animationType == DOTweenAnimation.AnimationType.Scale; | ||||
|                         break; | ||||
|                     case DOTweenAnimation.AnimationType.UIWidthHeight: | ||||
|                         _src.endValueV3 = Vector3.zero; | ||||
|                         _src.endValueFloat = 0; | ||||
|                         _src.optionalBool0 = _src.animationType == DOTweenAnimation.AnimationType.UIWidthHeight; | ||||
|                         break; | ||||
|                     case DOTweenAnimation.AnimationType.FillAmount: | ||||
|                         _src.endValueFloat = 1; | ||||
|                         break; | ||||
|                     case DOTweenAnimation.AnimationType.Color: | ||||
|                     case DOTweenAnimation.AnimationType.Fade: | ||||
|                         _isLightSrc = targetGO.GetComponent<Light>() != null; | ||||
|                         _src.endValueFloat = 0; | ||||
|                         break; | ||||
|                     case DOTweenAnimation.AnimationType.Text: | ||||
|                         _src.optionalBool0 = true; | ||||
|                         break; | ||||
|                     case DOTweenAnimation.AnimationType.PunchPosition: | ||||
|                     case DOTweenAnimation.AnimationType.PunchRotation: | ||||
|                     case DOTweenAnimation.AnimationType.PunchScale: | ||||
|                         _src.endValueV3 = _src.animationType == DOTweenAnimation.AnimationType.PunchRotation ? new Vector3(0, 180, 0) : Vector3.one; | ||||
|                         _src.optionalFloat0 = 1; | ||||
|                         _src.optionalInt0 = 10; | ||||
|                         _src.optionalBool0 = false; | ||||
|                         break; | ||||
|                     case DOTweenAnimation.AnimationType.ShakePosition: | ||||
|                     case DOTweenAnimation.AnimationType.ShakeRotation: | ||||
|                     case DOTweenAnimation.AnimationType.ShakeScale: | ||||
|                         _src.endValueV3 = _src.animationType == DOTweenAnimation.AnimationType.ShakeRotation ? new Vector3(90, 90, 90) : Vector3.one; | ||||
|                         _src.optionalInt0 = 10; | ||||
|                         _src.optionalFloat0 = 90; | ||||
|                         _src.optionalBool0 = false; | ||||
|                         _src.optionalBool1 = true; | ||||
|                         break; | ||||
|                     case DOTweenAnimation.AnimationType.CameraAspect: | ||||
|                     case DOTweenAnimation.AnimationType.CameraFieldOfView: | ||||
|                     case DOTweenAnimation.AnimationType.CameraOrthoSize: | ||||
|                         _src.endValueFloat = 0; | ||||
|                         break; | ||||
|                     case DOTweenAnimation.AnimationType.CameraPixelRect: | ||||
|                     case DOTweenAnimation.AnimationType.CameraRect: | ||||
|                         _src.endValueRect = new Rect(0, 0, 0, 0); | ||||
|                         break; | ||||
|                     } | ||||
|                 } | ||||
|                 if (_src.animationType == DOTweenAnimation.AnimationType.None) { | ||||
|                     _src.isValid = false; | ||||
|                     if (GUI.changed) EditorUtility.SetDirty(_src); | ||||
|                     return; | ||||
|                 } | ||||
| 
 | ||||
|                 if (_refreshRequired || prevAnimType != _src.animationType || ComponentsChanged()) { | ||||
|                     _refreshRequired = false; | ||||
|                     _src.isValid = Validate(targetGO); | ||||
|                     // See if we need to choose between multiple targets | ||||
| #if true // UI_MARKER | ||||
|                     if (_src.animationType == DOTweenAnimation.AnimationType.Fade && targetGO.GetComponent<CanvasGroup>() != null && targetGO.GetComponent<Image>() != null) { | ||||
|                         _chooseTargetMode = ChooseTargetMode.BetweenCanvasGroupAndImage; | ||||
|                         // Reassign target and forcedTargetType if lost | ||||
|                         if (_src.forcedTargetType == DOTweenAnimation.TargetType.Unset) _src.forcedTargetType = _src.targetType; | ||||
|                         switch (_src.forcedTargetType) { | ||||
|                         case DOTweenAnimation.TargetType.CanvasGroup: | ||||
|                             _src.target = targetGO.GetComponent<CanvasGroup>(); | ||||
|                             break; | ||||
|                         case DOTweenAnimation.TargetType.Image: | ||||
|                             _src.target = targetGO.GetComponent<Image>(); | ||||
|                             break; | ||||
|                         } | ||||
|                     } else { | ||||
| #endif | ||||
|                         _chooseTargetMode = ChooseTargetMode.None; | ||||
|                         _src.forcedTargetType = DOTweenAnimation.TargetType.Unset; | ||||
| #if true // UI_MARKER | ||||
|                     } | ||||
| #endif | ||||
|                 } | ||||
| 
 | ||||
|                 if (!_src.isValid) { | ||||
|                     GUI.color = Color.red; | ||||
|                     GUILayout.BeginVertical(GUI.skin.box); | ||||
|                     GUILayout.Label("No valid Component was found for the selected animation", EditorGUIUtils.wordWrapLabelStyle); | ||||
|                     GUILayout.EndVertical(); | ||||
|                     GUI.color = Color.white; | ||||
|                     if (GUI.changed) EditorUtility.SetDirty(_src); | ||||
|                     return; | ||||
|                 } | ||||
| 
 | ||||
| #if true // UI_MARKER | ||||
|                 // Special cases in which multiple target types could be used (set after validation) | ||||
|                 if (_chooseTargetMode == ChooseTargetMode.BetweenCanvasGroupAndImage && _src.forcedTargetType != DOTweenAnimation.TargetType.Unset) { | ||||
|                     FadeTargetType fadeTargetType = (FadeTargetType)Enum.Parse(typeof(FadeTargetType), _src.forcedTargetType.ToString()); | ||||
|                     DOTweenAnimation.TargetType prevTargetType = _src.forcedTargetType; | ||||
|                     _src.forcedTargetType = (DOTweenAnimation.TargetType)Enum.Parse(typeof(DOTweenAnimation.TargetType), EditorGUILayout.EnumPopup(_src.animationType + " Target", fadeTargetType).ToString()); | ||||
|                     if (_src.forcedTargetType != prevTargetType) { | ||||
|                         // Target type change > assign correct target | ||||
|                         switch (_src.forcedTargetType) { | ||||
|                         case DOTweenAnimation.TargetType.CanvasGroup: | ||||
|                             _src.target = targetGO.GetComponent<CanvasGroup>(); | ||||
|                             break; | ||||
|                         case DOTweenAnimation.TargetType.Image: | ||||
|                             _src.target = targetGO.GetComponent<Image>(); | ||||
|                             break; | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
| #endif | ||||
| 
 | ||||
|                 GUILayout.BeginHorizontal(); | ||||
|                 _src.duration = EditorGUILayout.FloatField("Duration", _src.duration); | ||||
|                 if (_src.duration < 0) _src.duration = 0; | ||||
|                 _src.isSpeedBased = DeGUILayout.ToggleButton(_src.isSpeedBased, new GUIContent("SpeedBased", "If selected, the duration will count as units/degree x second"), DeGUI.styles.button.tool, GUILayout.Width(75)); | ||||
|                 GUILayout.EndHorizontal(); | ||||
|                 _src.delay = EditorGUILayout.FloatField("Delay", _src.delay); | ||||
|                 if (_src.delay < 0) _src.delay = 0; | ||||
|                 _src.isIndependentUpdate = EditorGUILayout.Toggle("Ignore TimeScale", _src.isIndependentUpdate); | ||||
|                 _src.easeType = EditorGUIUtils.FilteredEasePopup("Ease", _src.easeType); | ||||
|                 if (_src.easeType == Ease.INTERNAL_Custom) { | ||||
|                     _src.easeCurve = EditorGUILayout.CurveField("   Ease Curve", _src.easeCurve); | ||||
|                 } | ||||
|                 _src.loops = EditorGUILayout.IntField(new GUIContent("Loops", "Set to -1 for infinite loops"), _src.loops); | ||||
|                 if (_src.loops < -1) _src.loops = -1; | ||||
|                 if (_src.loops > 1 || _src.loops == -1) | ||||
|                     _src.loopType = (LoopType)EditorGUILayout.EnumPopup("   Loop Type", _src.loopType); | ||||
|                 _src.id = EditorGUILayout.TextField("ID", _src.id); | ||||
| 
 | ||||
|                 bool canBeRelative = true; | ||||
|                 // End value and eventual specific options | ||||
|                 switch (_src.animationType) { | ||||
|                 case DOTweenAnimation.AnimationType.Move: | ||||
|                 case DOTweenAnimation.AnimationType.LocalMove: | ||||
|                     GUIEndValueV3(targetGO, _src.animationType == DOTweenAnimation.AnimationType.Move); | ||||
|                     _src.optionalBool0 = EditorGUILayout.Toggle("    Snapping", _src.optionalBool0); | ||||
|                     canBeRelative = !_src.useTargetAsV3; | ||||
|                     break; | ||||
|                 case DOTweenAnimation.AnimationType.Rotate: | ||||
|                 case DOTweenAnimation.AnimationType.LocalRotate: | ||||
|                     bool isRigidbody2D = DOTweenModuleUtils.Physics.HasRigidbody2D(_src); | ||||
|                     if (isRigidbody2D) GUIEndValueFloat(); | ||||
|                     else { | ||||
|                         GUIEndValueV3(targetGO); | ||||
|                         _src.optionalRotationMode = (RotateMode)EditorGUILayout.EnumPopup("    Rotation Mode", _src.optionalRotationMode); | ||||
|                     } | ||||
|                     break; | ||||
|                 case DOTweenAnimation.AnimationType.Scale: | ||||
|                     if (_src.optionalBool0) GUIEndValueFloat(); | ||||
|                     else GUIEndValueV3(targetGO); | ||||
|                     _src.optionalBool0 = EditorGUILayout.Toggle("Uniform Scale", _src.optionalBool0); | ||||
|                     break; | ||||
|                 case DOTweenAnimation.AnimationType.UIWidthHeight: | ||||
|                     if (_src.optionalBool0) GUIEndValueFloat(); | ||||
|                     else GUIEndValueV2(); | ||||
|                     _src.optionalBool0 = EditorGUILayout.Toggle("Uniform Scale", _src.optionalBool0); | ||||
|                     break; | ||||
|                 case DOTweenAnimation.AnimationType.FillAmount: | ||||
|                     GUIEndValueFloat(); | ||||
|                     if (_src.endValueFloat < 0) _src.endValueFloat = 0; | ||||
|                     if (_src.endValueFloat > 1) _src.endValueFloat = 1; | ||||
|                     canBeRelative = false; | ||||
|                     break; | ||||
|                 case DOTweenAnimation.AnimationType.Color: | ||||
|                     GUIEndValueColor(); | ||||
|                     canBeRelative = false; | ||||
|                     break; | ||||
|                 case DOTweenAnimation.AnimationType.Fade: | ||||
|                     GUIEndValueFloat(); | ||||
|                     if (_src.endValueFloat < 0) _src.endValueFloat = 0; | ||||
|                     if (!_isLightSrc && _src.endValueFloat > 1) _src.endValueFloat = 1; | ||||
|                     canBeRelative = false; | ||||
|                     break; | ||||
|                 case DOTweenAnimation.AnimationType.Text: | ||||
|                     GUIEndValueString(); | ||||
|                     _src.optionalBool0 = EditorGUILayout.Toggle("Rich Text Enabled", _src.optionalBool0); | ||||
|                     _src.optionalScrambleMode = (ScrambleMode)EditorGUILayout.EnumPopup("Scramble Mode", _src.optionalScrambleMode); | ||||
|                     _src.optionalString = EditorGUILayout.TextField(new GUIContent("Custom Scramble", "Custom characters to use in case of ScrambleMode.Custom"), _src.optionalString); | ||||
|                     break; | ||||
|                 case DOTweenAnimation.AnimationType.PunchPosition: | ||||
|                 case DOTweenAnimation.AnimationType.PunchRotation: | ||||
|                 case DOTweenAnimation.AnimationType.PunchScale: | ||||
|                     GUIEndValueV3(targetGO); | ||||
|                     canBeRelative = false; | ||||
|                     _src.optionalInt0 = EditorGUILayout.IntSlider(new GUIContent("    Vibrato", "How much will the punch vibrate"), _src.optionalInt0, 1, 50); | ||||
|                     _src.optionalFloat0 = EditorGUILayout.Slider(new GUIContent("    Elasticity", "How much the vector will go beyond the starting position when bouncing backwards"), _src.optionalFloat0, 0, 1); | ||||
|                     if (_src.animationType == DOTweenAnimation.AnimationType.PunchPosition) _src.optionalBool0 = EditorGUILayout.Toggle("    Snapping", _src.optionalBool0); | ||||
|                     break; | ||||
|                 case DOTweenAnimation.AnimationType.ShakePosition: | ||||
|                 case DOTweenAnimation.AnimationType.ShakeRotation: | ||||
|                 case DOTweenAnimation.AnimationType.ShakeScale: | ||||
|                     GUIEndValueV3(targetGO); | ||||
|                     canBeRelative = false; | ||||
|                     _src.optionalInt0 = EditorGUILayout.IntSlider(new GUIContent("    Vibrato", "How much will the shake vibrate"), _src.optionalInt0, 1, 50); | ||||
|                     using (new GUILayout.HorizontalScope()) { | ||||
|                         _src.optionalFloat0 = EditorGUILayout.Slider(new GUIContent("    Randomness", "The shake randomness"), _src.optionalFloat0, 0, 90); | ||||
|                         _src.optionalShakeRandomnessMode = (ShakeRandomnessMode)EditorGUILayout.EnumPopup(_src.optionalShakeRandomnessMode, GUILayout.Width(70)); | ||||
|                     } | ||||
|                     _src.optionalBool1 = EditorGUILayout.Toggle(new GUIContent("    FadeOut", "If selected the shake will fade out, otherwise it will constantly play with full force"), _src.optionalBool1); | ||||
|                     if (_src.animationType == DOTweenAnimation.AnimationType.ShakePosition) _src.optionalBool0 = EditorGUILayout.Toggle("    Snapping", _src.optionalBool0); | ||||
|                     break; | ||||
|                 case DOTweenAnimation.AnimationType.CameraAspect: | ||||
|                 case DOTweenAnimation.AnimationType.CameraFieldOfView: | ||||
|                 case DOTweenAnimation.AnimationType.CameraOrthoSize: | ||||
|                     GUIEndValueFloat(); | ||||
|                     canBeRelative = false; | ||||
|                     break; | ||||
|                 case DOTweenAnimation.AnimationType.CameraBackgroundColor: | ||||
|                     GUIEndValueColor(); | ||||
|                     canBeRelative = false; | ||||
|                     break; | ||||
|                 case DOTweenAnimation.AnimationType.CameraPixelRect: | ||||
|                 case DOTweenAnimation.AnimationType.CameraRect: | ||||
|                     GUIEndValueRect(); | ||||
|                     canBeRelative = false; | ||||
|                     break; | ||||
|                 } | ||||
| 
 | ||||
|                 // Final settings | ||||
|                 if (canBeRelative) _src.isRelative = EditorGUILayout.Toggle("    Relative", _src.isRelative); | ||||
| 
 | ||||
|                 // Events | ||||
|                 AnimationInspectorGUI.AnimationEvents(this, _src); | ||||
|             } | ||||
|             EditorGUI.EndDisabledGroup(); | ||||
| 
 | ||||
|             if (GUI.changed) EditorUtility.SetDirty(_src); | ||||
|         } | ||||
| 
 | ||||
|         #endregion | ||||
| 
 | ||||
|         #region Methods | ||||
| 
 | ||||
|         // Returns TRUE if the Component layout on the src gameObject changed (a Component was added or removed) | ||||
|         bool ComponentsChanged() | ||||
|         { | ||||
|             int prevTotComponentsOnSrc = _totComponentsOnSrc; | ||||
|             _totComponentsOnSrc = _src.gameObject.GetComponents<Component>().Length; | ||||
|             return prevTotComponentsOnSrc != _totComponentsOnSrc; | ||||
|         } | ||||
| 
 | ||||
|         // Checks if a Component that can be animated with the given animationType is attached to the src | ||||
|         bool Validate(GameObject targetGO) | ||||
|         { | ||||
|             if (_src.animationType == DOTweenAnimation.AnimationType.None) return false; | ||||
| 
 | ||||
|             Component srcTarget; | ||||
|             // First check for external plugins | ||||
| #if false // TK2D_MARKER | ||||
|             if (_Tk2dAnimationTypeToComponent.ContainsKey(_src.animationType)) { | ||||
|                 foreach (Type t in _Tk2dAnimationTypeToComponent[_src.animationType]) { | ||||
|                     srcTarget = targetGO.GetComponent(t); | ||||
|                     if (srcTarget != null) { | ||||
|                         _src.target = srcTarget; | ||||
|                         _src.targetType = DOTweenAnimation.TypeToDOTargetType(t); | ||||
|                         return true; | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
| #endif | ||||
| #if false // TEXTMESHPRO_MARKER | ||||
|             if (_TMPAnimationTypeToComponent.ContainsKey(_src.animationType)) { | ||||
|                 foreach (Type t in _TMPAnimationTypeToComponent[_src.animationType]) { | ||||
|                     srcTarget = targetGO.GetComponent(t); | ||||
|                     if (srcTarget != null) { | ||||
|                         _src.target = srcTarget; | ||||
|                         _src.targetType = DOTweenAnimation.TypeToDOTargetType(t); | ||||
|                         return true; | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
| #endif | ||||
|             // Then check for regular stuff | ||||
|             if (_AnimationTypeToComponent.ContainsKey(_src.animationType)) { | ||||
|                 foreach (Type t in _AnimationTypeToComponent[_src.animationType]) { | ||||
|                     srcTarget = targetGO.GetComponent(t); | ||||
|                     if (srcTarget != null) { | ||||
|                         _src.target = srcTarget; | ||||
|                         _src.targetType = DOTweenAnimation.TypeToDOTargetType(t); | ||||
|                         return true; | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|             return false; | ||||
|         } | ||||
| 
 | ||||
|         DOTweenAnimation.AnimationType AnimationToDOTweenAnimationType(string animation) | ||||
|         { | ||||
|             if (_datString == null) _datString = Enum.GetNames(typeof(DOTweenAnimation.AnimationType)); | ||||
|             animation = animation.Replace("/", ""); | ||||
|             return (DOTweenAnimation.AnimationType)(Array.IndexOf(_datString, animation)); | ||||
|         } | ||||
|         int DOTweenAnimationTypeToPopupId(DOTweenAnimation.AnimationType animation) | ||||
|         { | ||||
|             return Array.IndexOf(_animationTypeNoSlashes, animation.ToString()); | ||||
|         } | ||||
| 
 | ||||
|         #endregion | ||||
| 
 | ||||
|         #region GUI Draw Methods | ||||
| 
 | ||||
|         void GUIEndValueFloat() | ||||
|         { | ||||
|             GUILayout.BeginHorizontal(); | ||||
|             GUIToFromButton(); | ||||
|             _src.endValueFloat = EditorGUILayout.FloatField(_src.endValueFloat); | ||||
|             GUILayout.EndHorizontal(); | ||||
|         } | ||||
| 
 | ||||
|         void GUIEndValueColor() | ||||
|         { | ||||
|             GUILayout.BeginHorizontal(); | ||||
|             GUIToFromButton(); | ||||
|             _src.endValueColor = EditorGUILayout.ColorField(_src.endValueColor); | ||||
|             GUILayout.EndHorizontal(); | ||||
|         } | ||||
| 
 | ||||
|         void GUIEndValueV3(GameObject targetGO, bool optionalTransform = false) | ||||
|         { | ||||
|             GUILayout.BeginHorizontal(); | ||||
|             GUIToFromButton(); | ||||
|             if (_src.useTargetAsV3) { | ||||
|                 Transform prevT = _src.endValueTransform; | ||||
|                 _src.endValueTransform = EditorGUILayout.ObjectField(_src.endValueTransform, typeof(Transform), true) as Transform; | ||||
|                 if (_src.endValueTransform != prevT && _src.endValueTransform != null) { | ||||
| #if true // UI_MARKER | ||||
|                     // Check that it's a Transform for a Transform or a RectTransform for a RectTransform | ||||
|                     if (targetGO.GetComponent<RectTransform>() != null) { | ||||
|                         if (_src.endValueTransform.GetComponent<RectTransform>() == null) { | ||||
|                             EditorUtility.DisplayDialog("DOTween Pro", "For Unity UI elements, the target must also be a UI element", "Ok"); | ||||
|                             _src.endValueTransform = null; | ||||
|                         } | ||||
|                     } else if (_src.endValueTransform.GetComponent<RectTransform>() != null) { | ||||
|                         EditorUtility.DisplayDialog("DOTween Pro", "You can't use a UI target for a non UI object", "Ok"); | ||||
|                         _src.endValueTransform = null; | ||||
|                     } | ||||
| #endif | ||||
|                 } | ||||
|             } else { | ||||
|                 _src.endValueV3 = EditorGUILayout.Vector3Field("", _src.endValueV3, GUILayout.Height(16)); | ||||
|             } | ||||
|             if (optionalTransform) { | ||||
|                 if (GUILayout.Button(_src.useTargetAsV3 ? "target" : "value", EditorGUIUtils.sideBtStyle, GUILayout.Width(44))) _src.useTargetAsV3 = !_src.useTargetAsV3; | ||||
|             } | ||||
|             GUILayout.EndHorizontal(); | ||||
| #if true // UI_MARKER | ||||
|             if (_src.useTargetAsV3 && _src.endValueTransform != null && _src.target is RectTransform) { | ||||
|                 EditorGUILayout.HelpBox("NOTE: when using a UI target, the tween will be created during Start instead of Awake", MessageType.Info); | ||||
|             } | ||||
| #endif | ||||
|         } | ||||
| 
 | ||||
|         void GUIEndValueV2() | ||||
|         { | ||||
|             GUILayout.BeginHorizontal(); | ||||
|             GUIToFromButton(); | ||||
|             _src.endValueV2 = EditorGUILayout.Vector2Field("", _src.endValueV2, GUILayout.Height(16)); | ||||
|             GUILayout.EndHorizontal(); | ||||
|         } | ||||
| 
 | ||||
|         void GUIEndValueString() | ||||
|         { | ||||
|             GUILayout.BeginHorizontal(); | ||||
|             GUIToFromButton(); | ||||
|             _src.endValueString = EditorGUILayout.TextArea(_src.endValueString, EditorGUIUtils.wordWrapTextArea); | ||||
|             GUILayout.EndHorizontal(); | ||||
|         } | ||||
| 
 | ||||
|         void GUIEndValueRect() | ||||
|         { | ||||
|             GUILayout.BeginHorizontal(); | ||||
|             GUIToFromButton(); | ||||
|             _src.endValueRect = EditorGUILayout.RectField(_src.endValueRect); | ||||
|             GUILayout.EndHorizontal(); | ||||
|         } | ||||
| 
 | ||||
|         void GUIToFromButton() | ||||
|         { | ||||
|             if (GUILayout.Button(_src.isFrom ? "FROM" : "TO", EditorGUIUtils.sideBtStyle, GUILayout.Width(90))) _src.isFrom = !_src.isFrom; | ||||
|             GUILayout.Space(16); | ||||
|         } | ||||
| 
 | ||||
|         #endregion | ||||
|     } | ||||
| 
 | ||||
|     // █████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | ||||
|     // ███ INTERNAL CLASSES ████████████████████████████████████████████████████████████████████████████████████████████████ | ||||
|     // █████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | ||||
| 
 | ||||
|     [InitializeOnLoad] | ||||
|     static class Initializer | ||||
|     { | ||||
|         static Initializer() | ||||
|         { | ||||
|             DOTweenAnimation.OnReset += OnReset; | ||||
|         } | ||||
| 
 | ||||
|         static void OnReset(DOTweenAnimation src) | ||||
|         { | ||||
|             DOTweenSettings settings = DOTweenUtilityWindow.GetDOTweenSettings(); | ||||
|             if (settings == null) return; | ||||
| 
 | ||||
|             Undo.RecordObject(src, "DOTweenAnimation"); | ||||
|             src.autoPlay = settings.defaultAutoPlay == AutoPlay.All || settings.defaultAutoPlay == AutoPlay.AutoPlayTweeners; | ||||
|             src.autoKill = settings.defaultAutoKill; | ||||
|             EditorUtility.SetDirty(src); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | @ -0,0 +1,8 @@ | |||
| fileFormatVersion: 2 | ||||
| guid: e0203fd81362bab4d842d87ad09ee76e | ||||
| MonoImporter: | ||||
|   serializedVersion: 2 | ||||
|   defaultReferences: [] | ||||
|   executionOrder: 0 | ||||
|   icon: {instanceID: 0} | ||||
|   userData:  | ||||
|  | @ -0,0 +1,265 @@ | |||
| // Author: Daniele Giardini - http://www.demigiant.com | ||||
| // Created: 2015/03/12 16:03 | ||||
| 
 | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using DG.DemiEditor; | ||||
| using DG.DemiLib; | ||||
| using DG.Tweening; | ||||
| using DG.Tweening.Core; | ||||
| using UnityEditor; | ||||
| using UnityEditorInternal; | ||||
| using UnityEngine; | ||||
| using Object = UnityEngine.Object; | ||||
| 
 | ||||
| namespace DG.DOTweenEditor | ||||
| { | ||||
|     public static class DOTweenPreviewManager | ||||
|     { | ||||
|         static bool _previewOnlyIfSetToAutoPlay = true; | ||||
|         static readonly Dictionary<DOTweenAnimation,TweenInfo> _AnimationToTween = new Dictionary<DOTweenAnimation,TweenInfo>(); | ||||
|         static readonly List<DOTweenAnimation> _TmpKeys = new List<DOTweenAnimation>(); | ||||
| 
 | ||||
|         #region Public Methods & GUI | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Returns TRUE if its actually previewing animations | ||||
|         /// </summary> | ||||
|         public static bool PreviewGUI(DOTweenAnimation src) | ||||
|         { | ||||
|             if (EditorApplication.isPlaying) return false; | ||||
| 
 | ||||
|             Styles.Init(); | ||||
| 
 | ||||
|             bool isPreviewing = _AnimationToTween.Count > 0; | ||||
|             bool isPreviewingThis = isPreviewing && _AnimationToTween.ContainsKey(src); | ||||
| 
 | ||||
|             // Preview in editor | ||||
|             GUI.backgroundColor = isPreviewing | ||||
|                 ? new DeSkinColor(new Color(0.49f, 0.8f, 0.86f), new Color(0.15f, 0.26f, 0.35f)) | ||||
|                 : new DeSkinColor(Color.white, new Color(0.13f, 0.13f, 0.13f)); | ||||
|             GUILayout.BeginVertical(Styles.previewBox); | ||||
|             DeGUI.ResetGUIColors(); | ||||
|             GUILayout.BeginHorizontal(); | ||||
|             GUILayout.Label("Preview Mode - Experimental", Styles.previewLabel); | ||||
|             _previewOnlyIfSetToAutoPlay = DeGUILayout.ToggleButton( | ||||
|                 _previewOnlyIfSetToAutoPlay, | ||||
|                 new GUIContent("AutoPlay only", "If toggled only previews animations that have AutoPlay turned ON"), | ||||
|                 Styles.btOption | ||||
|             ); | ||||
|             GUILayout.EndHorizontal(); | ||||
|             GUILayout.Space(1); | ||||
|             // Preview - Play | ||||
|             GUILayout.BeginHorizontal(); | ||||
|             EditorGUI.BeginDisabledGroup( | ||||
|                 isPreviewingThis || src.animationType == DOTweenAnimation.AnimationType.None | ||||
|                 || !src.isActive || _previewOnlyIfSetToAutoPlay && !src.autoPlay | ||||
|             ); | ||||
|             if (GUILayout.Button("► Play", Styles.btPreview)) { | ||||
|                 if (!isPreviewing) StartupGlobalPreview(); | ||||
|                 AddAnimationToGlobalPreview(src); | ||||
|             } | ||||
|             EditorGUI.EndDisabledGroup(); | ||||
|             EditorGUI.BeginDisabledGroup(isPreviewing); | ||||
|             if (GUILayout.Button("► Play All <i>on GameObject</i>", Styles.btPreview)) { | ||||
|                 if (!isPreviewing) StartupGlobalPreview(); | ||||
|                 DOTweenAnimation[] anims = src.gameObject.GetComponents<DOTweenAnimation>(); | ||||
|                 foreach (DOTweenAnimation anim in anims) AddAnimationToGlobalPreview(anim); | ||||
|             } | ||||
|             if (GUILayout.Button("► Play All <i>in Scene</i>", Styles.btPreview)) { | ||||
|                 if (!isPreviewing) StartupGlobalPreview(); | ||||
|                 // DOTweenAnimation[] anims = Object.FindObjectsOfType<DOTweenAnimation>(); // OBSOLETE | ||||
|                 DOTweenAnimation[] anims = DeEditorCompatibilityUtils.FindObjectsOfType<DOTweenAnimation>(); | ||||
|                 foreach (DOTweenAnimation anim in anims) AddAnimationToGlobalPreview(anim); | ||||
|             } | ||||
|             EditorGUI.EndDisabledGroup(); | ||||
|             GUILayout.EndHorizontal(); | ||||
|             // Preview - Stop | ||||
|             GUILayout.BeginHorizontal(); | ||||
|             EditorGUI.BeginDisabledGroup(!isPreviewingThis); | ||||
|             if (GUILayout.Button("■ Stop", Styles.btPreview)) { | ||||
|                 if (_AnimationToTween.ContainsKey(src)) StopPreview(_AnimationToTween[src].tween); | ||||
|             } | ||||
|             EditorGUI.EndDisabledGroup(); | ||||
|             EditorGUI.BeginDisabledGroup(!isPreviewing); | ||||
|             if (GUILayout.Button("■ Stop All <i>on GameObject</i>", Styles.btPreview)) { | ||||
|                 StopPreview(src.gameObject); | ||||
|             } | ||||
|             if (GUILayout.Button("■ Stop All <i>in Scene</i>", Styles.btPreview)) { | ||||
|                 StopAllPreviews(); | ||||
|             } | ||||
|             EditorGUI.EndDisabledGroup(); | ||||
|             GUILayout.EndHorizontal(); | ||||
|             if (isPreviewing) { | ||||
|                 int playingTweens = 0; | ||||
|                 int completedTweens = 0; | ||||
|                 int pausedTweens = 0; | ||||
|                 foreach (KeyValuePair<DOTweenAnimation, TweenInfo> kvp in _AnimationToTween) { | ||||
|                     Tween t = kvp.Value.tween; | ||||
|                     if (t.IsPlaying()) playingTweens++; | ||||
|                     else if (t.IsComplete()) completedTweens++; | ||||
|                     else pausedTweens++; | ||||
|                 } | ||||
|                 GUILayout.Label("Playing Tweens: " + playingTweens, Styles.previewStatusLabel); | ||||
|                 GUILayout.Label("Completed Tweens: " + completedTweens, Styles.previewStatusLabel); | ||||
| //                GUILayout.Label("Paused Tweens: " + playingTweens); | ||||
|             } | ||||
|             GUILayout.EndVertical(); | ||||
| 
 | ||||
|             return isPreviewing; | ||||
|         } | ||||
| 
 | ||||
| #if !(UNITY_4_3 || UNITY_4_4 || UNITY_4_5 || UNITY_4_6 || UNITY_5) | ||||
|         public static void StopAllPreviews(PlayModeStateChange state) | ||||
|         { | ||||
|             StopAllPreviews(); | ||||
|         } | ||||
| #endif | ||||
| 
 | ||||
|         public static void StopAllPreviews() | ||||
|         { | ||||
|             _TmpKeys.Clear(); | ||||
|             foreach (KeyValuePair<DOTweenAnimation,TweenInfo> kvp in _AnimationToTween) { | ||||
|                 _TmpKeys.Add(kvp.Key); | ||||
|             } | ||||
|             StopPreview(_TmpKeys); | ||||
|             _TmpKeys.Clear(); | ||||
|             _AnimationToTween.Clear(); | ||||
| 
 | ||||
|             DOTweenEditorPreview.Stop(); | ||||
| #if UNITY_4_3 || UNITY_4_4 || UNITY_4_5 || UNITY_4_6 || UNITY_5 | ||||
|             UnityEditor.EditorApplication.playmodeStateChanged -= StopAllPreviews; | ||||
| #else | ||||
|             UnityEditor.EditorApplication.playModeStateChanged -= StopAllPreviews; | ||||
| #endif | ||||
| //            EditorApplication.playmodeStateChanged -= StopAllPreviews; | ||||
| 
 | ||||
|             InternalEditorUtility.RepaintAllViews(); | ||||
|         } | ||||
| 
 | ||||
| #endregion | ||||
| 
 | ||||
| #region Methods | ||||
| 
 | ||||
|         static void StartupGlobalPreview() | ||||
|         { | ||||
|             DOTweenEditorPreview.Start(); | ||||
| #if UNITY_4_3 || UNITY_4_4 || UNITY_4_5 || UNITY_4_6 || UNITY_5 | ||||
|             UnityEditor.EditorApplication.playmodeStateChanged += StopAllPreviews; | ||||
| #else | ||||
|             UnityEditor.EditorApplication.playModeStateChanged += StopAllPreviews; | ||||
| #endif | ||||
| //            EditorApplication.playmodeStateChanged += StopAllPreviews; | ||||
|         } | ||||
| 
 | ||||
|         static void AddAnimationToGlobalPreview(DOTweenAnimation src) | ||||
|         { | ||||
|             if (!src.isActive) return; // Ignore sources whose tweens have been set to inactive | ||||
|             if (_previewOnlyIfSetToAutoPlay && !src.autoPlay) return; | ||||
| 
 | ||||
|             Tween t = src.CreateEditorPreview(); | ||||
|             if (t == null) return; | ||||
|             _AnimationToTween.Add(src, new TweenInfo(src, t, src.isFrom)); | ||||
|             // Tween setup | ||||
|             DOTweenEditorPreview.PrepareTweenForPreview(t); | ||||
|         } | ||||
| 
 | ||||
|         static void StopPreview(GameObject go) | ||||
|         { | ||||
|             _TmpKeys.Clear(); | ||||
|             foreach (KeyValuePair<DOTweenAnimation,TweenInfo> kvp in _AnimationToTween) { | ||||
|                 if (kvp.Key.gameObject != go) continue; | ||||
|                 _TmpKeys.Add(kvp.Key); | ||||
|             } | ||||
|             StopPreview(_TmpKeys); | ||||
|             _TmpKeys.Clear(); | ||||
| 
 | ||||
|             if (_AnimationToTween.Count == 0) StopAllPreviews(); | ||||
|             else InternalEditorUtility.RepaintAllViews(); | ||||
|         } | ||||
| 
 | ||||
|         static void StopPreview(Tween t) | ||||
|         { | ||||
|             TweenInfo tInfo = null; | ||||
|             foreach (KeyValuePair<DOTweenAnimation,TweenInfo> kvp in _AnimationToTween) { | ||||
|                 if (kvp.Value.tween != t) continue; | ||||
|                 tInfo = kvp.Value; | ||||
|                 _AnimationToTween.Remove(kvp.Key); | ||||
|                 break; | ||||
|             } | ||||
|             if (tInfo == null) { | ||||
|                 Debug.LogWarning("DOTween Preview ► Couldn't find tween to stop"); | ||||
|                 return; | ||||
|             } | ||||
|             if (tInfo.isFrom) { | ||||
|                 int totLoops = tInfo.tween.Loops(); | ||||
|                 if (totLoops < 0 || totLoops > 1) { | ||||
|                     tInfo.tween.Goto(tInfo.tween.Duration(false)); | ||||
|                 } else tInfo.tween.Complete(); | ||||
|             } else tInfo.tween.Rewind(); | ||||
|             tInfo.tween.Kill(); | ||||
|             EditorUtility.SetDirty(tInfo.animation); // Refresh views | ||||
| 
 | ||||
|             if (_AnimationToTween.Count == 0) StopAllPreviews(); | ||||
|             else InternalEditorUtility.RepaintAllViews(); | ||||
|         } | ||||
| 
 | ||||
|         // Stops while iterating inversely, which deals better with tweens that overwrite each other | ||||
|         static void StopPreview(List<DOTweenAnimation> keys) | ||||
|         { | ||||
|             for (int i = keys.Count - 1; i > -1; --i) { | ||||
|                 DOTweenAnimation anim = keys[i]; | ||||
|                 TweenInfo tInfo = _AnimationToTween[anim]; | ||||
|                 if (tInfo.isFrom) { | ||||
|                     int totLoops = tInfo.tween.Loops(); | ||||
|                     if (totLoops < 0 || totLoops > 1) { | ||||
|                         tInfo.tween.Goto(tInfo.tween.Duration(false)); | ||||
|                     } else tInfo.tween.Complete(); | ||||
|                 } else tInfo.tween.Rewind(); | ||||
|                 tInfo.tween.Kill(); | ||||
|                 EditorUtility.SetDirty(anim); // Refresh views | ||||
|                 _AnimationToTween.Remove(anim); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
| #endregion | ||||
| 
 | ||||
|         // █████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | ||||
|         // ███ INTERNAL CLASSES ████████████████████████████████████████████████████████████████████████████████████████████████ | ||||
|         // █████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | ||||
| 
 | ||||
|         class TweenInfo | ||||
|         { | ||||
|             public DOTweenAnimation animation; | ||||
|             public Tween tween; | ||||
|             public bool isFrom; | ||||
|             public TweenInfo(DOTweenAnimation animation, Tween tween, bool isFrom) | ||||
|             { | ||||
|                 this.animation = animation; | ||||
|                 this.tween = tween; | ||||
|                 this.isFrom = isFrom; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         static class Styles | ||||
|         { | ||||
|             static bool _initialized; | ||||
| 
 | ||||
|             public static GUIStyle previewBox, previewLabel, btOption, btPreview, previewStatusLabel; | ||||
| 
 | ||||
|             public static void Init() | ||||
|             { | ||||
|                 if (_initialized) return; | ||||
| 
 | ||||
|                 _initialized = true; | ||||
| 
 | ||||
|                 previewBox = new GUIStyle(GUI.skin.box).Clone().Padding(1, 1, 0, 3) | ||||
|                     .Background(DeStylePalette.squareBorderCurved_darkBorders).Border(7, 7, 7, 7); | ||||
|                 previewLabel = new GUIStyle(GUI.skin.label).Clone(10, FontStyle.Bold).Padding(1, 0, 3, 0).Margin(3, 6, 0, 0).StretchWidth(false); | ||||
|                 btOption = DeGUI.styles.button.bBlankBorderCompact.MarginBottom(2).MarginRight(4); | ||||
|                 btPreview = EditorStyles.miniButton.Clone(Format.RichText); | ||||
|                 previewStatusLabel = EditorStyles.miniLabel.Clone().Padding(4, 0, 0, 0).Margin(0); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | @ -0,0 +1,8 @@ | |||
| fileFormatVersion: 2 | ||||
| guid: 22292a5f27a9a644ba9e6ad1bf863531 | ||||
| MonoImporter: | ||||
|   serializedVersion: 2 | ||||
|   defaultReferences: [] | ||||
|   executionOrder: 0 | ||||
|   icon: {instanceID: 0} | ||||
|   userData:  | ||||
|  | @ -0,0 +1,18 @@ | |||
| <?xml version="1.0"?> | ||||
| <doc> | ||||
|     <assembly> | ||||
|         <name>DOTweenProEditor</name> | ||||
|     </assembly> | ||||
|     <members> | ||||
|         <member name="T:DG.DOTweenEditor.Core.ColorPalette.Custom"> | ||||
|             <summary> | ||||
|             Custom colors | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:DG.DOTweenEditor.Core.StylePalette.Custom.Init"> | ||||
|             <summary> | ||||
|             Needs to be overridden in order to initialize new styles added from inherited classes | ||||
|             </summary> | ||||
|         </member> | ||||
|     </members> | ||||
| </doc> | ||||
|  | @ -0,0 +1,4 @@ | |||
| fileFormatVersion: 2 | ||||
| guid: 753a4f4ed73b17143923101226957756 | ||||
| TextScriptImporter: | ||||
|   userData:  | ||||
							
								
								
									
										
											BIN
										
									
								
								Assets/Plugins/Demigiant/DOTweenPro/Editor/DOTweenProEditor.dll
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								Assets/Plugins/Demigiant/DOTweenPro/Editor/DOTweenProEditor.dll
									
										
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							|  | @ -0,0 +1,22 @@ | |||
| fileFormatVersion: 2 | ||||
| guid: a6402d4311c862b4eb1325590d6466af | ||||
| PluginImporter: | ||||
|   serializedVersion: 1 | ||||
|   iconMap: {} | ||||
|   executionOrder: {} | ||||
|   isPreloaded: 0 | ||||
|   platformData: | ||||
|     Any: | ||||
|       enabled: 0 | ||||
|       settings: {} | ||||
|     Editor: | ||||
|       enabled: 1 | ||||
|       settings: | ||||
|         DefaultValueInitialized: true | ||||
|     WindowsStoreApps: | ||||
|       enabled: 0 | ||||
|       settings: | ||||
|         CPU: AnyCPU | ||||
|   userData:  | ||||
|   assetBundleName:  | ||||
|   assetBundleVariant:  | ||||
							
								
								
									
										35
									
								
								Assets/Plugins/Demigiant/DOTweenPro/readme.txt
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								Assets/Plugins/Demigiant/DOTweenPro/readme.txt
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,35 @@ | |||
| DOTween and DOTween Pro are copyright (c) 2014-2018 Daniele Giardini - Demigiant | ||||
| 
 | ||||
| // IMPORTANT!!! ///////////////////////////////////////////// | ||||
| // Upgrading DOTween from versions older than 1.2.000 /////// | ||||
| // (or DOTween Pro older than 1.0.000) ////////////////////// | ||||
| ------------------------------------------------------------- | ||||
| If you're upgrading your project from a version of DOTween older than 1.2.000 (or DOTween Pro older than 1.0.000) please follow these instructions carefully. | ||||
| 1) Import the new version in the same folder as the previous one, overwriting old files. A lot of errors will appear but don't worry | ||||
| 2) Close and reopen Unity (and your project). This is fundamental: skipping this step will cause a bloodbath | ||||
| 3) Open DOTween's Utility Panel (Tools > Demigiant > DOTween Utility Panel) if it doesn't open automatically, then press "Setup DOTween...": this will run the upgrade setup | ||||
| 4) From the Add/Remove Modules panel that opens, activate/deactivate Modules for Unity systems and for external assets (like TextMesh Pro) | ||||
| 
 | ||||
| // GET STARTED ////////////////////////////////////////////// | ||||
| 
 | ||||
| - After importing a new DOTween update, select DOTween's Utility Panel from the "Tools/Demigiant" menu (if it doesn't open automatically) and press the "Setup DOTween..." button to activate/deactivate Modules. You can also access a Preferences Tab from there to choose default settings for DOTween. | ||||
| 
 | ||||
| // VISUAL SCRIPTING (PRO ONLY) | ||||
| - To animate a gameObject, select it and choose "Add Component > DOTween > DOTween Animation" | ||||
| - To animate a gameObject along a path, select it and choose "Add Component > DOTween > DOTween Path" | ||||
| 
 | ||||
| // SCRIPTING | ||||
| - In your code, add "using DG.Tweening" to each class where you want to use DOTween. | ||||
| - You're ready to tween. Check out the links below for full documentation and license info. | ||||
| 
 | ||||
| 
 | ||||
| // LINKS /////////////////////////////////////////////////////// | ||||
| 
 | ||||
| DOTween website (documentation, examples, etc): http://dotween.demigiant.com | ||||
| DOTween license: http://dotween.demigiant.com/license.php | ||||
| DOTween repository (Google Code): https://code.google.com/p/dotween/ | ||||
| Demigiant website (documentation, examples, etc): http://www.demigiant.com | ||||
| 
 | ||||
| // NOTES ////////////////////////////////////////////////////// | ||||
| 
 | ||||
| - DOTween's Utility Panel can be found under "Tools > Demigiant > DOTween Utility Panel" and also contains other useful options, plus a tab to set DOTween's preferences | ||||
							
								
								
									
										4
									
								
								Assets/Plugins/Demigiant/DOTweenPro/readme.txt.meta
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								Assets/Plugins/Demigiant/DOTweenPro/readme.txt.meta
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,4 @@ | |||
| fileFormatVersion: 2 | ||||
| guid: aa8f07903bf128e44a7d0b91a63dedab | ||||
| TextScriptImporter: | ||||
|   userData:  | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue