feature: DOTween setup

This commit is contained in:
Gerard Gascón 2024-01-28 10:59:35 +01:00
parent ccb92f680d
commit aeb7406366
352 changed files with 27281 additions and 0 deletions

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

View file

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 4d0390bd8b8ffd640b34fe25065ff1df
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:

View 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

View 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:

View 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

View file

@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 0a0cc3e90c4a6ea41bb14d7f35c577c3
timeCreated: 1587116610
licenseType: Store
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View 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>

View file

@ -0,0 +1,4 @@
fileFormatVersion: 2
guid: db7d7ef84c388bc4fbc3835d31a15306
TextScriptImporter:
userData:

Binary file not shown.

View 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:

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

View file

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 1c3190a1a1c53f449926f6d5542b4ce5
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 8fb0d65aa5b048649a3a785b82b8f8db
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:

View 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

View file

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: b590cd7c24ffa5d4faa5b6fa993cccad
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:

View file

@ -0,0 +1,5 @@
fileFormatVersion: 2
guid: 34ca5bde92f87fa4dbeb9593d201fde2
folderAsset: yes
DefaultImporter:
userData:

View file

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

View file

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: e0203fd81362bab4d842d87ad09ee76e
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:

View file

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

View file

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 22292a5f27a9a644ba9e6ad1bf863531
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:

View file

@ -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>

View file

@ -0,0 +1,4 @@
fileFormatVersion: 2
guid: 753a4f4ed73b17143923101226957756
TextScriptImporter:
userData:

View file

@ -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:

View 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

View file

@ -0,0 +1,4 @@
fileFormatVersion: 2
guid: aa8f07903bf128e44a7d0b91a63dedab
TextScriptImporter:
userData: