2021-11-21 15:14:51 +08:00
// 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
2021-11-21 15:49:17 +08:00
#if false // TEXTMESHPRO_MARKER
2021-11-21 15:14:51 +08:00
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 bool targetIsSelf = true ; // If FALSE allows to set the target manually
public GameObject targetGO = null ; // Used in case targetIsSelf is FALSE
// If TRUE always uses the GO containing this DOTweenAnimation (and not the one containing the target) as DOTween's SetTarget target
public bool tweenTargetIsTargetGO = true ;
public float delay ;
public float duration = 1 ;
public Ease easeType = Ease . OutQuad ;
public AnimationCurve easeCurve = new AnimationCurve ( new Keyframe ( 0 , 0 ) , new Keyframe ( 1 , 1 ) ) ;
public LoopType loopType = LoopType . Restart ;
public int loops = 1 ;
public string id = "" ;
public bool isRelative ;
public bool isFrom ;
public bool isIndependentUpdate = false ;
public bool autoKill = true ;
public bool isActive = true ;
public bool isValid ;
public Component target ;
public DOTweenAnimationType animationType ;
public TargetType targetType ;
public TargetType forcedTargetType ; // Used when choosing between multiple targets
public bool autoPlay = true ;
public bool useTargetAsV3 ;
public float endValueFloat ;
public Vector3 endValueV3 ;
public Vector2 endValueV2 ;
public Color endValueColor = new Color ( 1 , 1 , 1 , 1 ) ;
public string endValueString = "" ;
public Rect endValueRect = new Rect ( 0 , 0 , 0 , 0 ) ;
public Transform endValueTransform ;
public bool optionalBool0 ;
public float optionalFloat0 ;
public int optionalInt0 ;
public RotateMode optionalRotationMode = RotateMode . Fast ;
public ScrambleMode optionalScrambleMode = ScrambleMode . None ;
public string optionalString ;
bool _tweenCreated ; // TRUE after the tweens have been created
int _playCount = - 1 ; // Used when calling DOPlayNext
#region Unity Methods
void Awake ( )
{
if ( ! isActive | | ! isValid ) return ;
if ( animationType ! = DOTweenAnimationType . Move | | ! useTargetAsV3 ) {
// Don't create tweens if we're using a RectTransform as a Move target,
// because that will work only inside Start
CreateTween ( ) ;
_tweenCreated = true ;
}
}
void Start ( )
{
if ( _tweenCreated | | ! isActive | | ! isValid ) return ;
CreateTween ( ) ;
_tweenCreated = true ;
}
void OnDestroy ( )
{
if ( tween ! = null & & tween . IsActive ( ) ) tween . Kill ( ) ;
tween = null ;
}
// Used also by DOTweenAnimationInspector when applying runtime changes and restarting
public void CreateTween ( )
{
// if (target == null) {
// Debug.LogWarning(string.Format("{0} :: This 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 DOTweenAnimationType . None :
break ;
case DOTweenAnimationType . Move :
if ( useTargetAsV3 ) {
isRelative = false ;
if ( endValueTransform = = null ) {
Debug . LogWarning ( string . Format ( "{0} :: This tween's TO target is NULL, a Vector3 of (0,0,0) will be used instead" , this . gameObject . name ) , this . gameObject ) ;
endValueV3 = Vector3 . zero ;
} else {
#if 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 DOTweenAnimationType . LocalMove :
tween = tweenGO . transform . DOLocalMove ( endValueV3 , duration , optionalBool0 ) ;
break ;
case DOTweenAnimationType . 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 DOTweenAnimationType . LocalRotate :
tween = tweenGO . transform . DOLocalRotate ( endValueV3 , duration , optionalRotationMode ) ;
break ;
case DOTweenAnimationType . 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 DOTweenAnimationType . UIWidthHeight :
tween = ( ( RectTransform ) target ) . DOSizeDelta ( optionalBool0 ? new Vector2 ( endValueFloat , endValueFloat ) : endValueV2 , duration ) ;
break ;
#endif
case DOTweenAnimationType . 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 = ( ( Image ) 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
2021-11-21 15:49:17 +08:00
#if false // TEXTMESHPRO_MARKER
2021-11-21 15:14:51 +08:00
case TargetType . TextMeshProUGUI :
tween = ( ( TextMeshProUGUI ) target ) . DOColor ( endValueColor , duration ) ;
break ;
case TargetType . TextMeshPro :
tween = ( ( TextMeshPro ) target ) . DOColor ( endValueColor , duration ) ;
break ;
#endif
}
break ;
case DOTweenAnimationType . Fade :
isRelative = false ;
switch ( targetType ) {
case TargetType . 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 = ( ( Image ) 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
2021-11-21 15:49:17 +08:00
#if false // TEXTMESHPRO_MARKER
2021-11-21 15:14:51 +08:00
case TargetType . TextMeshProUGUI :
tween = ( ( TextMeshProUGUI ) target ) . DOFade ( endValueFloat , duration ) ;
break ;
case TargetType . TextMeshPro :
tween = ( ( TextMeshPro ) target ) . DOFade ( endValueFloat , duration ) ;
break ;
#endif
}
break ;
case DOTweenAnimationType . Text :
#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
2021-11-21 15:49:17 +08:00
#if false // TEXTMESHPRO_MARKER
2021-11-21 15:14:51 +08:00
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 DOTweenAnimationType . 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 DOTweenAnimationType . PunchScale :
tween = tweenGO . transform . DOPunchScale ( endValueV3 , duration , optionalInt0 , optionalFloat0 ) ;
break ;
case DOTweenAnimationType . PunchRotation :
tween = tweenGO . transform . DOPunchRotation ( endValueV3 , duration , optionalInt0 , optionalFloat0 ) ;
break ;
case DOTweenAnimationType . ShakePosition :
switch ( targetType ) {
case TargetType . Transform :
tween = ( ( Transform ) target ) . DOShakePosition ( duration , endValueV3 , optionalInt0 , optionalFloat0 , optionalBool0 ) ;
break ;
#if true // UI_MARKER
case TargetType . RectTransform :
tween = ( ( RectTransform ) target ) . DOShakeAnchorPos ( duration , endValueV3 , optionalInt0 , optionalFloat0 , optionalBool0 ) ;
break ;
#endif
}
break ;
case DOTweenAnimationType . ShakeScale :
tween = tweenGO . transform . DOShakeScale ( duration , endValueV3 , optionalInt0 , optionalFloat0 ) ;
break ;
case DOTweenAnimationType . ShakeRotation :
tween = tweenGO . transform . DOShakeRotation ( duration , endValueV3 , optionalInt0 , optionalFloat0 ) ;
break ;
case DOTweenAnimationType . CameraAspect :
tween = ( ( Camera ) target ) . DOAspect ( endValueFloat , duration ) ;
break ;
case DOTweenAnimationType . CameraBackgroundColor :
tween = ( ( Camera ) target ) . DOColor ( endValueColor , duration ) ;
break ;
case DOTweenAnimationType . CameraFieldOfView :
tween = ( ( Camera ) target ) . DOFieldOfView ( endValueFloat , duration ) ;
break ;
case DOTweenAnimationType . CameraOrthoSize :
tween = ( ( Camera ) target ) . DOOrthoSize ( endValueFloat , duration ) ;
break ;
case DOTweenAnimationType . CameraPixelRect :
tween = ( ( Camera ) target ) . DOPixelRect ( endValueRect , duration ) ;
break ;
case DOTweenAnimationType . CameraRect :
tween = ( ( Camera ) target ) . DORect ( endValueRect , duration ) ;
break ;
}
if ( tween = = null ) return ;
if ( isFrom ) {
( ( Tweener ) tween ) . From ( isRelative ) ;
} else {
tween . SetRelative ( isRelative ) ;
}
GameObject setTarget = targetIsSelf | | ! tweenTargetIsTargetGO ? this . gameObject : targetGO ;
tween . SetTarget ( setTarget ) . SetDelay ( delay ) . SetLoops ( loops , loopType ) . SetAutoKill ( autoKill )
. OnKill ( ( ) = > tween = null ) ;
if ( isSpeedBased ) tween . SetSpeedBased ( ) ;
if ( easeType = = Ease . INTERNAL_Custom ) tween . SetEase ( easeCurve ) ;
else tween . SetEase ( easeType ) ;
if ( ! string . IsNullOrEmpty ( id ) ) tween . SetId ( id ) ;
tween . SetUpdate ( isIndependentUpdate ) ;
if ( hasOnStart ) {
if ( onStart ! = null ) tween . OnStart ( onStart . Invoke ) ;
} else onStart = null ;
if ( hasOnPlay ) {
if ( onPlay ! = null ) tween . OnPlay ( onPlay . Invoke ) ;
} else onPlay = null ;
if ( hasOnUpdate ) {
if ( onUpdate ! = null ) tween . OnUpdate ( onUpdate . Invoke ) ;
} else onUpdate = null ;
if ( hasOnStepComplete ) {
if ( onStepComplete ! = null ) tween . OnStepComplete ( onStepComplete . Invoke ) ;
} else onStepComplete = null ;
if ( hasOnComplete ) {
if ( onComplete ! = null ) tween . OnComplete ( onComplete . Invoke ) ;
} else onComplete = null ;
if ( hasOnRewind ) {
if ( onRewind ! = null ) tween . OnRewind ( onRewind . Invoke ) ;
} else onRewind = null ;
if ( autoPlay ) tween . Play ( ) ;
else tween . Pause ( ) ;
if ( hasOnTweenCreated & & onTweenCreated ! = null ) onTweenCreated . Invoke ( ) ;
}
#endregion
#region Public Methods
// These methods are here so they can be called directly via Unity's UGUI event system
public override void DOPlay ( )
{
DOTween . Play ( this . gameObject ) ;
}
public override void DOPlayBackwards ( )
{
DOTween . PlayBackwards ( this . gameObject ) ;
}
public override void DOPlayForward ( )
{
DOTween . PlayForward ( this . gameObject ) ;
}
public override void DOPause ( )
{
DOTween . Pause ( this . gameObject ) ;
}
public override void DOTogglePause ( )
{
DOTween . TogglePause ( this . gameObject ) ;
}
public override void DORewind ( )
{
_playCount = - 1 ;
// Rewind using Components order (in case there are multiple animations on the same property)
DOTweenAnimation [ ] anims = this . gameObject . GetComponents < DOTweenAnimation > ( ) ;
for ( int i = anims . Length - 1 ; i > - 1 ; - - i ) {
Tween t = anims [ i ] . tween ;
if ( t ! = null & & t . IsInitialized ( ) ) anims [ i ] . tween . Rewind ( ) ;
}
// DOTween.Rewind(this.gameObject);
}
/// <summary>
/// Restarts the tween
/// </summary>
/// <param name="fromHere">If TRUE, re-evaluates the tween's start and end values from its current position.
/// Set it to TRUE when spawning the same DOTweenAnimation in different positions (like when using a pooling system)</param>
public override void DORestart ( bool fromHere = false )
{
_playCount = - 1 ;
if ( tween = = null ) {
if ( Debugger . logPriority > 1 ) Debugger . LogNullTween ( tween ) ; return ;
}
if ( fromHere & & isRelative ) ReEvaluateRelativeTween ( ) ;
DOTween . Restart ( this . gameObject ) ;
}
public override void DOComplete ( )
{
DOTween . Complete ( this . gameObject ) ;
}
public override void DOKill ( )
{
DOTween . Kill ( this . gameObject ) ;
tween = null ;
}
#region Specifics
public void DOPlayById ( string id )
{
DOTween . Play ( this . gameObject , id ) ;
}
public void DOPlayAllById ( string id )
{
DOTween . Play ( id ) ;
}
public void DOPauseAllById ( string id )
{
DOTween . Pause ( id ) ;
}
public void DOPlayBackwardsById ( string id )
{
DOTween . PlayBackwards ( this . gameObject , id ) ;
}
public void DOPlayBackwardsAllById ( string id )
{
DOTween . PlayBackwards ( id ) ;
}
public void DOPlayForwardById ( string id )
{
DOTween . PlayForward ( this . gameObject , id ) ;
}
public void DOPlayForwardAllById ( string id )
{
DOTween . PlayForward ( id ) ;
}
public void DOPlayNext ( )
{
DOTweenAnimation [ ] anims = this . GetComponents < DOTweenAnimation > ( ) ;
while ( _playCount < anims . Length - 1 ) {
_playCount + + ;
DOTweenAnimation anim = anims [ _playCount ] ;
if ( anim ! = null & & anim . tween ! = null & & ! anim . tween . IsPlaying ( ) & & ! anim . tween . IsComplete ( ) ) {
anim . tween . Play ( ) ;
break ;
}
}
}
public void DORewindAndPlayNext ( )
{
_playCount = - 1 ;
DOTween . Rewind ( this . gameObject ) ;
DOPlayNext ( ) ;
}
public void DORewindAllById ( string id )
{
_playCount = - 1 ;
DOTween . Rewind ( id ) ;
}
public void DORestartById ( string id )
{
_playCount = - 1 ;
DOTween . Restart ( this . gameObject , id ) ;
}
public void DORestartAllById ( string id )
{
_playCount = - 1 ;
DOTween . Restart ( id ) ;
}
/// <summary>
/// Returns the tweens created by this DOTweenAnimation, in the same order as they appear in the Inspector (top to bottom)
/// </summary>
public List < Tween > GetTweens ( )
{
// return DOTween.TweensByTarget(this.gameObject);
List < Tween > result = new List < Tween > ( ) ;
DOTweenAnimation [ ] anims = this . GetComponents < DOTweenAnimation > ( ) ;
foreach ( DOTweenAnimation anim in anims ) result . Add ( anim . tween ) ;
return result ;
}
#endregion
#region Internal ( also used by Inspector )
public static TargetType TypeToDOTargetType ( Type t )
{
string str = t . ToString ( ) ;
int dotIndex = str . LastIndexOf ( "." ) ;
if ( dotIndex ! = - 1 ) str = str . Substring ( dotIndex + 1 ) ;
if ( str . IndexOf ( "Renderer" ) ! = - 1 & & ( str ! = "SpriteRenderer" ) ) str = "Renderer" ;
#if ! true // PHYSICS_MARKER
if ( str = = "Rigidbody" ) str = "Transform" ;
#endif
#if ! true // PHYSICS2D_MARKER
if ( str = = "Rigidbody2D" ) str = "Transform" ;
#endif
#if ! true // UI_MARKER
if ( str = = "RectTransform" ) str = "Transform" ;
#endif
return ( TargetType ) Enum . Parse ( typeof ( TargetType ) , str ) ;
}
// Editor preview system
/// <summary>
/// Previews the tween in the editor. Only for DOTween internal usage: don't use otherwise.
/// </summary>
public Tween CreateEditorPreview ( )
{
if ( Application . isPlaying ) return null ;
CreateTween ( ) ;
return tween ;
}
#endregion
#endregion
#region Private
// Returns the gameObject whose target component should be animated
GameObject GetTweenGO ( )
{
return targetIsSelf ? this . gameObject : targetGO ;
}
// Re-evaluate relative position of path
void ReEvaluateRelativeTween ( )
{
GameObject tweenGO = GetTweenGO ( ) ;
if ( tweenGO = = null ) {
Debug . LogWarning ( string . Format ( "{0} :: This DOTweenAnimation's target/GameObject is unset: the tween will not be created." , this . gameObject . name ) , this . gameObject ) ;
return ;
}
if ( animationType = = DOTweenAnimationType . Move ) {
( ( Tweener ) tween ) . ChangeEndValue ( tweenGO . transform . position + endValueV3 , true ) ;
} else if ( animationType = = DOTweenAnimationType . 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 ;
}
}
}