From 63c3549673899dcc5ffb7c833541f79eaa98f706 Mon Sep 17 00:00:00 2001 From: ThomasCharester Date: Thu, 26 Feb 2026 11:57:51 +0300 Subject: [PATCH] 2d progress --- .idea/.idea.Infra/.idea/workspace.xml | 158 +- .../Example/Platformer/Entity/Enemies/Bee.cs | 51 +- .../Example/Platformer/PlatformerState.cs | 2 + .../Race/Racer/Car/CarWheelRotatorPlayer.cs | 4 +- Assets/Code/Example/Race/UI/PlayerScores.cs | 10 +- Assets/Code/Example/Race/UI/WinScreen.cs | 10 +- .../Code/Infrastructure/App/PapaInstaller.cs | 3 + .../Infrastructure/UI/Panels/LoadingPanel.cs | 8 +- .../Infrastructure/UI/Panels/LogoPanel.cs | 8 +- Assets/DOTween/DOTween.XML | 3107 ----------------- Assets/DOTween/DOTween.XML.meta | 7 - Assets/DOTween/DOTween.dll | Bin 177664 -> 0 bytes Assets/DOTween/DOTween.dll.meta | 2 - Assets/DOTween/Editor/DOTweenEditor.XML | 144 - Assets/DOTween/Editor/DOTweenEditor.XML.meta | 7 - Assets/DOTween/Editor/DOTweenEditor.dll | Bin 70656 -> 0 bytes Assets/DOTween/Editor/DOTweenEditor.dll.meta | 2 - Assets/DOTween/Editor/Imgs/DOTweenIcon.png | Bin 1565 -> 0 bytes .../DOTween/Editor/Imgs/DOTweenIcon.png.meta | 130 - .../DOTween/Editor/Imgs/DOTweenMiniIcon.png | Bin 319 -> 0 bytes .../Editor/Imgs/DOTweenMiniIcon.png.meta | 130 - Assets/DOTween/Editor/Imgs/Footer.png | Bin 4409 -> 0 bytes Assets/DOTween/Editor/Imgs/Footer.png.meta | 130 - Assets/DOTween/Editor/Imgs/Footer_dark.png | Bin 4429 -> 0 bytes .../DOTween/Editor/Imgs/Footer_dark.png.meta | 130 - Assets/DOTween/Editor/Imgs/Header.jpg | Bin 22787 -> 0 bytes Assets/DOTween/Editor/Imgs/Header.jpg.meta | 130 - Assets/DOTween/Modules/DOTweenModuleAudio.cs | 198 -- .../Modules/DOTweenModuleAudio.cs.meta | 2 - .../Modules/DOTweenModuleEPOOutline.cs | 146 - .../Modules/DOTweenModuleEPOOutline.cs.meta | 2 - .../DOTween/Modules/DOTweenModulePhysics.cs | 216 -- .../Modules/DOTweenModulePhysics.cs.meta | 2 - .../DOTween/Modules/DOTweenModulePhysics2D.cs | 193 - .../Modules/DOTweenModulePhysics2D.cs.meta | 2 - Assets/DOTween/Modules/DOTweenModuleSprite.cs | 93 - .../Modules/DOTweenModuleSprite.cs.meta | 2 - Assets/DOTween/Modules/DOTweenModuleUI.cs | 662 ---- .../DOTween/Modules/DOTweenModuleUI.cs.meta | 2 - .../Modules/DOTweenModuleUnityVersion.cs | 389 --- .../Modules/DOTweenModuleUnityVersion.cs.meta | 2 - Assets/DOTween/Modules/DOTweenModuleUtils.cs | 167 - .../Modules/DOTweenModuleUtils.cs.meta | 2 - Assets/DOTween/readme.txt | 29 - Assets/DOTween/readme.txt.meta | 7 - Assets/{DOTween.meta => Plugins.meta} | 2 +- .../Editor.meta => Plugins/PrimeTween.meta} | 2 +- .../PrimeTween/PrimeTweenInstaller.asset | 19 + .../PrimeTween/PrimeTweenInstaller.asset.meta | 15 + .../PrimeTween/internal.meta} | 2 +- .../internal/PrimeTween.Installer.asmdef | 29 + .../internal/PrimeTween.Installer.asmdef.meta | 14 + .../internal/PrimeTweenInstaller.cs | 548 +++ .../internal/PrimeTweenInstaller.cs.meta | 18 + .../internal/com.kyrylokuzyk.primetween.tgz | Bin 0 -> 384502 bytes .../com.kyrylokuzyk.primetween.tgz.meta} | 3 +- .../Example/Platformer}/Bee.prefab | 192 +- .../Example/Platformer}/Bee.prefab.meta | 0 .../Example/Platformer}/Boar.prefab | 0 .../Example/Platformer}/Boar.prefab.meta | 0 .../Example/Platformer/Platformer.unity | 76 + .../Example/Platformer}/Snail.prefab | 0 .../Example/Platformer}/Snail.prefab.meta | 0 .../ConfigLocator.Generated.cs | 6 +- .../SystemConfigsReferences.Generated.cs | 4 +- Packages/manifest.json | 1 + Packages/packages-lock.json | 6 + ProjectSettings/Physics2DSettings.asset | 4 +- ProjectSettings/ProjectSettings.asset | 36 +- ProjectSettings/TagManager.asset | 2 +- 70 files changed, 1008 insertions(+), 6260 deletions(-) delete mode 100644 Assets/DOTween/DOTween.XML delete mode 100644 Assets/DOTween/DOTween.XML.meta delete mode 100644 Assets/DOTween/DOTween.dll delete mode 100644 Assets/DOTween/DOTween.dll.meta delete mode 100644 Assets/DOTween/Editor/DOTweenEditor.XML delete mode 100644 Assets/DOTween/Editor/DOTweenEditor.XML.meta delete mode 100644 Assets/DOTween/Editor/DOTweenEditor.dll delete mode 100644 Assets/DOTween/Editor/DOTweenEditor.dll.meta delete mode 100644 Assets/DOTween/Editor/Imgs/DOTweenIcon.png delete mode 100644 Assets/DOTween/Editor/Imgs/DOTweenIcon.png.meta delete mode 100644 Assets/DOTween/Editor/Imgs/DOTweenMiniIcon.png delete mode 100644 Assets/DOTween/Editor/Imgs/DOTweenMiniIcon.png.meta delete mode 100644 Assets/DOTween/Editor/Imgs/Footer.png delete mode 100644 Assets/DOTween/Editor/Imgs/Footer.png.meta delete mode 100644 Assets/DOTween/Editor/Imgs/Footer_dark.png delete mode 100644 Assets/DOTween/Editor/Imgs/Footer_dark.png.meta delete mode 100644 Assets/DOTween/Editor/Imgs/Header.jpg delete mode 100644 Assets/DOTween/Editor/Imgs/Header.jpg.meta delete mode 100644 Assets/DOTween/Modules/DOTweenModuleAudio.cs delete mode 100644 Assets/DOTween/Modules/DOTweenModuleAudio.cs.meta delete mode 100644 Assets/DOTween/Modules/DOTweenModuleEPOOutline.cs delete mode 100644 Assets/DOTween/Modules/DOTweenModuleEPOOutline.cs.meta delete mode 100644 Assets/DOTween/Modules/DOTweenModulePhysics.cs delete mode 100644 Assets/DOTween/Modules/DOTweenModulePhysics.cs.meta delete mode 100644 Assets/DOTween/Modules/DOTweenModulePhysics2D.cs delete mode 100644 Assets/DOTween/Modules/DOTweenModulePhysics2D.cs.meta delete mode 100644 Assets/DOTween/Modules/DOTweenModuleSprite.cs delete mode 100644 Assets/DOTween/Modules/DOTweenModuleSprite.cs.meta delete mode 100644 Assets/DOTween/Modules/DOTweenModuleUI.cs delete mode 100644 Assets/DOTween/Modules/DOTweenModuleUI.cs.meta delete mode 100644 Assets/DOTween/Modules/DOTweenModuleUnityVersion.cs delete mode 100644 Assets/DOTween/Modules/DOTweenModuleUnityVersion.cs.meta delete mode 100644 Assets/DOTween/Modules/DOTweenModuleUtils.cs delete mode 100644 Assets/DOTween/Modules/DOTweenModuleUtils.cs.meta delete mode 100644 Assets/DOTween/readme.txt delete mode 100644 Assets/DOTween/readme.txt.meta rename Assets/{DOTween.meta => Plugins.meta} (77%) rename Assets/{DOTween/Editor.meta => Plugins/PrimeTween.meta} (77%) create mode 100644 Assets/Plugins/PrimeTween/PrimeTweenInstaller.asset create mode 100644 Assets/Plugins/PrimeTween/PrimeTweenInstaller.asset.meta rename Assets/{DOTween/Editor/Imgs.meta => Plugins/PrimeTween/internal.meta} (77%) create mode 100644 Assets/Plugins/PrimeTween/internal/PrimeTween.Installer.asmdef create mode 100644 Assets/Plugins/PrimeTween/internal/PrimeTween.Installer.asmdef.meta create mode 100644 Assets/Plugins/PrimeTween/internal/PrimeTweenInstaller.cs create mode 100644 Assets/Plugins/PrimeTween/internal/PrimeTweenInstaller.cs.meta create mode 100644 Assets/Plugins/PrimeTween/internal/com.kyrylokuzyk.primetween.tgz rename Assets/{DOTween/Modules.meta => Plugins/PrimeTween/internal/com.kyrylokuzyk.primetween.tgz.meta} (67%) rename Assets/{Resources/Example/Platformer/Characters/Enemies/Bee => Resources_moved/Example/Platformer}/Bee.prefab (78%) rename Assets/{Resources/Example/Platformer/Characters/Enemies/Bee => Resources_moved/Example/Platformer}/Bee.prefab.meta (100%) rename Assets/{Resources/Example/Platformer/Characters/Enemies/Boar => Resources_moved/Example/Platformer}/Boar.prefab (100%) rename Assets/{Resources/Example/Platformer/Characters/Enemies/Boar => Resources_moved/Example/Platformer}/Boar.prefab.meta (100%) rename Assets/{Resources/Example/Platformer/Characters/Enemies/Snail => Resources_moved/Example/Platformer}/Snail.prefab (100%) rename Assets/{Resources/Example/Platformer/Characters/Enemies/Snail => Resources_moved/Example/Platformer}/Snail.prefab.meta (100%) diff --git a/.idea/.idea.Infra/.idea/workspace.xml b/.idea/.idea.Infra/.idea/workspace.xml index ac83830..cd5a35f 100644 --- a/.idea/.idea.Infra/.idea/workspace.xml +++ b/.idea/.idea.Infra/.idea/workspace.xml @@ -5,51 +5,73 @@ - - - - - - - - - - - - - - - - - - - - - - + + + + + - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - + + + + + + + + + + + + + @@ -125,10 +149,10 @@ - + @@ -173,58 +198,19 @@ - - file://$PROJECT_DIR$/Assets/Code/Infrastructure/App/States/GameplayState.cs - 141 - - - - - - - - - file://$PROJECT_DIR$/Assets/Code/Infrastructure/App/States/GameplayState.cs - 62 - - - - - - - file://$PROJECT_DIR$/Assets/Code/Infrastructure/App/States/MainMenuState.cs - 60 + 58 - - - - file://$PROJECT_DIR$/Assets/Code/Example/Race/RaceGame.cs - 62 - - - - - - - diff --git a/Assets/Code/Example/Platformer/Entity/Enemies/Bee.cs b/Assets/Code/Example/Platformer/Entity/Enemies/Bee.cs index bfa8722..6d48528 100644 --- a/Assets/Code/Example/Platformer/Entity/Enemies/Bee.cs +++ b/Assets/Code/Example/Platformer/Entity/Enemies/Bee.cs @@ -1,8 +1,5 @@ -using System; using System.Collections.Generic; -using DG.Tweening; -using DG.Tweening.Core; -using DG.Tweening.Plugins.Options; +using PrimeTween; using UnityEngine; namespace Code.Example.Platformer.Entity.Enemies @@ -10,50 +7,56 @@ namespace Code.Example.Platformer.Entity.Enemies public class Bee : Entity { [SerializeField] private List partolPoints; - private bool _onPatrol; - private bool _onPatrolMoveDamnit; - private int _currentPartolPoint; + [SerializeField] private bool onPatrol = true; + private int _currentPatrolPoint; - private Transform _currentTarget; - private TweenerCore _patrolAction; + private Vector3 _velocity = new Vector3(1,1,1); + [SerializeField] private Transform _currentTarget; + + private Tween _patrolAction; protected override void Move() { - if (_onPatrol && !_onPatrolMoveDamnit) - { - _onPatrolMoveDamnit = true; - _patrolAction = transform.DOMove(partolPoints[_currentPartolPoint].position, 3f); - _patrolAction.onComplete += OnControlPointReached; + if (onPatrol && !_patrolAction.isAlive) + { + _patrolAction = Tween + .PositionAtSpeed(transform,partolPoints[_currentPatrolPoint].position, 0.5f) + .OnComplete(target: this, target => target.OnControlPointReached()); } - else + else if(_currentTarget) { + var direction = _currentTarget.position - transform.position; direction.Normalize(); var targetPosition = _currentTarget.position + direction * -2f; UnityEngine.Debug.DrawLine(transform.position, targetPosition, Color.red); - - transform.DOMove(_currentTarget.position, 2f).onComplete += OnControlPointReached; + + transform.position = Vector3.SmoothDamp(transform.position,_currentTarget.position,ref _velocity, 1f); + // Tween + // .PositionAtSpeed(transform, _currentTarget.position, 1f).OnUpdate(transform, ); + // // .OnComplete(OnControlPointReached); } } private void OnControlPointReached() - { - if (++_currentPartolPoint >= partolPoints.Count) _currentPartolPoint = 0; - _onPatrolMoveDamnit = false; + { + if (++_currentPatrolPoint >= partolPoints.Count) _currentPatrolPoint = 0; } public void GotTarget(Transform other) { - _onPatrol = false; + onPatrol = false; + _currentTarget = other; - _patrolAction?.Complete(); + + _patrolAction.Stop(); } public void LostTarget() { - _onPatrol = true; - _currentTarget = null; + onPatrol = true; + _currentTarget = null; } } } \ No newline at end of file diff --git a/Assets/Code/Example/Platformer/PlatformerState.cs b/Assets/Code/Example/Platformer/PlatformerState.cs index bf28a65..4d55a14 100644 --- a/Assets/Code/Example/Platformer/PlatformerState.cs +++ b/Assets/Code/Example/Platformer/PlatformerState.cs @@ -1,4 +1,5 @@ using Code.Infrastructure.App; +using Code.Infrastructure.Audio; using Code.Infrastructure.Camera; using Code.Infrastructure.EventBus; using Code.Infrastructure.Generators; @@ -36,6 +37,7 @@ namespace Code.Example.Platformer private void LoadingCompleted() { + Context.AudioService.CancelMusic(AudioNames.UISounds,0); Context.UIService.ClosePanel(UIPanelType.Loading); } diff --git a/Assets/Code/Example/Race/Racer/Car/CarWheelRotatorPlayer.cs b/Assets/Code/Example/Race/Racer/Car/CarWheelRotatorPlayer.cs index 1df7655..aafc046 100644 --- a/Assets/Code/Example/Race/Racer/Car/CarWheelRotatorPlayer.cs +++ b/Assets/Code/Example/Race/Racer/Car/CarWheelRotatorPlayer.cs @@ -1,4 +1,4 @@ -using DG.Tweening; +using PrimeTween; using UnityEngine; namespace Code.Example.Race.Racer.Car @@ -15,7 +15,7 @@ namespace Code.Example.Race.Racer.Car { var wheelRotation = wheel.localRotation.eulerAngles; wheelRotation.y = amount; - wheel.DOLocalRotate(wheelRotation, 1f); + Tween.LocalRotation(wheel,wheelRotation, 1f); // wheel.localRotation = Quaternion.Euler(wheelRotation); } } diff --git a/Assets/Code/Example/Race/UI/PlayerScores.cs b/Assets/Code/Example/Race/UI/PlayerScores.cs index 6f06264..5496eb3 100644 --- a/Assets/Code/Example/Race/UI/PlayerScores.cs +++ b/Assets/Code/Example/Race/UI/PlayerScores.cs @@ -1,7 +1,7 @@ using System; using System.Collections.Generic; using Code.Infrastructure.UI; -using DG.Tweening; +using PrimeTween; using TMPro; using UnityEngine; using UnityEngine.UI; @@ -26,14 +26,14 @@ namespace Code.Example.Race.UI } public override void Open(Action callback = null) { - image.DOColor(shownColor, 1f); - scoreText.DOColor(shownColor, 1f).onComplete = () => callback?.Invoke(); + Tween.Color(image,shownColor, 1f); + Tween.Color(scoreText,shownColor, 1f).OnComplete( () => callback?.Invoke()); } public override void Close(Action callback = null) { - image.DOColor(hiddenColor, 1f); - scoreText.DOColor(hiddenColor, 1f).onComplete = () => callback?.Invoke(); + Tween.Color(image,hiddenColor, 1f); + Tween.Color(scoreText,hiddenColor, 1f).OnComplete( () => callback?.Invoke()); } } diff --git a/Assets/Code/Example/Race/UI/WinScreen.cs b/Assets/Code/Example/Race/UI/WinScreen.cs index 0461ac2..48b5292 100644 --- a/Assets/Code/Example/Race/UI/WinScreen.cs +++ b/Assets/Code/Example/Race/UI/WinScreen.cs @@ -1,6 +1,6 @@ using System; using Code.Infrastructure.UI; -using DG.Tweening; +using PrimeTween; using TMPro; using UnityEngine; using UnityEngine.UI; @@ -17,14 +17,14 @@ namespace Code.Example.Race.UI public void SetText(string text) => winText.text = text; public override void Open(Action callback = null) { - image.DOColor(shownColor, 1f); - winText.DOColor(shownColor, 1f).onComplete = () => callback?.Invoke(); + Tween.Color(image,shownColor, 1f); + Tween.Color(winText,shownColor, 1f).OnComplete( () => callback?.Invoke()); } public override void Close(Action callback = null) { - image.DOColor(hiddenColor, 1f); - winText.DOColor(hiddenColor, 1f).onComplete = () => callback?.Invoke(); + Tween.Color(image,hiddenColor, 1f); + Tween.Color(winText,hiddenColor, 1f).OnComplete( () => callback?.Invoke()); } } } \ No newline at end of file diff --git a/Assets/Code/Infrastructure/App/PapaInstaller.cs b/Assets/Code/Infrastructure/App/PapaInstaller.cs index 122d25d..40981e6 100644 --- a/Assets/Code/Infrastructure/App/PapaInstaller.cs +++ b/Assets/Code/Infrastructure/App/PapaInstaller.cs @@ -13,6 +13,7 @@ using Reflex.Injectors; using Unity.Cinemachine; using UnityEngine; using UnityEngine.Rendering.Universal; +using UnityEngine.SceneManagement; using Resolution = Reflex.Enums.Resolution; namespace Code.Infrastructure.App @@ -32,6 +33,8 @@ namespace Code.Infrastructure.App { public void InstallBindings(ContainerBuilder containerBuilder) { + if(SceneManager.GetActiveScene().buildIndex != 0) SceneManager.LoadScene(0, LoadSceneMode.Single); + InitLoadings(); containerBuilder.RegisterType(typeof(EventBus.EventBus), Lifetime.Singleton, Resolution.Eager); diff --git a/Assets/Code/Infrastructure/UI/Panels/LoadingPanel.cs b/Assets/Code/Infrastructure/UI/Panels/LoadingPanel.cs index 08f4875..c4d821d 100644 --- a/Assets/Code/Infrastructure/UI/Panels/LoadingPanel.cs +++ b/Assets/Code/Infrastructure/UI/Panels/LoadingPanel.cs @@ -1,5 +1,5 @@ -using System; -using DG.Tweening; +using System; +using PrimeTween; using UnityEngine; using UnityEngine.UI; @@ -12,12 +12,12 @@ namespace Code.Infrastructure.UI.Panels [SerializeField] private Color hiddenColor; public override void Open(Action callback = null) { - image.DOColor(shownColor, 1f).onComplete = () => callback?.Invoke(); + Tween.Color(image,shownColor, 1f).OnComplete( () => callback?.Invoke()); } public override void Close(Action callback = null) { - image.DOColor(hiddenColor, 1f).onComplete += () => callback?.Invoke(); + Tween.Color(image,hiddenColor, 1f).OnComplete( () => callback?.Invoke()); } } } \ No newline at end of file diff --git a/Assets/Code/Infrastructure/UI/Panels/LogoPanel.cs b/Assets/Code/Infrastructure/UI/Panels/LogoPanel.cs index 3c150c2..36ff523 100644 --- a/Assets/Code/Infrastructure/UI/Panels/LogoPanel.cs +++ b/Assets/Code/Infrastructure/UI/Panels/LogoPanel.cs @@ -1,5 +1,5 @@ -using System; -using DG.Tweening; +using System; +using PrimeTween; using UnityEngine; using UnityEngine.UI; @@ -12,12 +12,12 @@ namespace Code.Infrastructure.UI.Panels [SerializeField] private Color hiddenColor; public override void Open(Action callback = null) { - image.DOColor(shownColor, 1f).onComplete = () => callback?.Invoke(); + Tween.Color(image,shownColor, 1f).OnComplete( () => callback?.Invoke()); } public override void Close(Action callback = null) { - image.DOColor(hiddenColor, 1f).onComplete += () => callback?.Invoke(); + Tween.Color(image,hiddenColor, 1f).OnComplete( () => callback?.Invoke()); } } } \ No newline at end of file diff --git a/Assets/DOTween/DOTween.XML b/Assets/DOTween/DOTween.XML deleted file mode 100644 index f56085a..0000000 --- a/Assets/DOTween/DOTween.XML +++ /dev/null @@ -1,3107 +0,0 @@ - - - - DOTween - - - - - Types of autoPlay behaviours - - - - No tween is automatically played - - - Only Sequences are automatically played - - - Only Tweeners are automatically played - - - All tweens are automatically played - - - - What axis to constrain in case of Vector tweens - - - - Called the first time the tween is set in a playing state, after any eventual delay - - - - Used in place of System.Func, which is not available in mscorlib. - - - - - Used in place of System.Action. - - - - - Public so it can be used by lose scripts related to DOTween (like DOTweenAnimation) - - - - - Used to separate DOTween class from the MonoBehaviour instance (in order to use static constructors on DOTween). - Contains all instance-based methods - - - - Used internally inside Unity Editor, as a trick to update DOTween's inspector at every frame - - - - Directly sets the current max capacity of Tweeners and Sequences - (meaning how many Tweeners and Sequences can be running at the same time), - so that DOTween doesn't need to automatically increase them in case the max is reached - (which might lead to hiccups when that happens). - Sequences capacity must be less or equal to Tweeners capacity - (if you pass a low Tweener capacity it will be automatically increased to match the Sequence's). - Beware: use this method only when there are no tweens running. - - Max Tweeners capacity. - Default: 200 - Max Sequences capacity. - Default: 50 - - - - This class contains a C# port of the easing equations created by Robert Penner (http://robertpenner.com/easing). - - - - - Easing equation function for a bounce (exponentially decaying parabolic bounce) easing in: accelerating from zero velocity. - - - Current time (in frames or seconds). - - - Expected easing duration (in frames or seconds). - - Unused: here to keep same delegate for all ease types. - Unused: here to keep same delegate for all ease types. - - The eased value. - - - - - Easing equation function for a bounce (exponentially decaying parabolic bounce) easing out: decelerating from zero velocity. - - - Current time (in frames or seconds). - - - Expected easing duration (in frames or seconds). - - Unused: here to keep same delegate for all ease types. - Unused: here to keep same delegate for all ease types. - - The eased value. - - - - - Easing equation function for a bounce (exponentially decaying parabolic bounce) easing in/out: acceleration until halfway, then deceleration. - - - Current time (in frames or seconds). - - - Expected easing duration (in frames or seconds). - - Unused: here to keep same delegate for all ease types. - Unused: here to keep same delegate for all ease types. - - The eased value. - - - - - Returns a value between 0 and 1 (inclusive) based on the elapsed time and ease selected. - Use this method if you don't care about , otherwise use - - - - - USE THIS FOR CUSTOM PLUGINS when you want to be able to use . - Returns a value that is from 0 to 1 if is not incremental, otherwise from 0 to (1 * completed loops) - - - - - Returns a value between 0 and 1 (inclusive) based on the elapsed time and ease selected - - - - - Used to interpret AnimationCurves as eases. - Public so it can be used by external ease factories - - - - - Behaviour in case a tween nested inside a Sequence fails and is captured by safe mode - - - - If the Sequence contains other elements, kill the failed tween but preserve the rest - - - Kill the whole Sequence - - - - Log types thrown by errors captured and prevented by safe mode - - - - No logs. NOT RECOMMENDED - - - Throw a normal log - - - Throw a warning log (default) - - - Throw an error log - - - - Additional notices passed to plugins when updating. - Public so it can be used by custom plugins. Internally, only PathPlugin uses it - - - - - None - - - - - Lets the plugin know that we restarted or rewinded - - - - - OnRewind callback behaviour (can only be set via DOTween's Utility Panel) - - - - - When calling Rewind or PlayBackwards/SmoothRewind, OnRewind callbacks will be fired only if the tween isn't already rewinded - - - - - When calling Rewind, OnRewind callbacks will always be fired, even if the tween is already rewinded. - When calling PlayBackwards/SmoothRewind instead, OnRewind callbacks will be fired only if the tween isn't already rewinded - - - - - When calling Rewind or PlayBackwards/SmoothRewind, OnRewind callbacks will always be fired, even if the tween is already rewinded - - - - - Public only so custom shortcuts can access some of these methods - - - - - INTERNAL: used by DO shortcuts and Modules to set special startup mode - - - - - INTERNAL: used by DO shortcuts and Modules to set the tween as blendable - - - - - INTERNAL: used by DO shortcuts and Modules to prevent a tween from using a From setup even if passed - - - - - Used to dispatch commands that need to be captured externally, usually by Modules - - - - - Various utils - - - - - Returns a Vector3 with z = 0 - - - - - Returns the 2D angle between two vectors - - - - - Returns a point on a circle with the given center and radius, - using Unity's circle coordinates (0° points up and increases clockwise) - - - - - Uses approximate equality on each axis instead of Unity's Vector3 equality, - because the latter fails (in some cases) when assigning a Vector3 to a transform.position and then checking it. - - - - - Looks for the type within all possible project assembly names - - - - NO-GC METHOD: changes the start value of a tween and rewinds it (without pausing it). - Has no effect with tweens that are inside Sequences - The new start value - If bigger than 0 applies it as the new tween duration - - - NO-GC METHOD: changes the end value of a tween and rewinds it (without pausing it). - Has no effect with tweens that are inside Sequences - The new end value - If TRUE the start value will become the current target's value, otherwise it will stay the same - - - NO-GC METHOD: changes the end value of a tween and rewinds it (without pausing it). - Has no effect with tweens that are inside Sequences - The new end value - If bigger than 0 applies it as the new tween duration - If TRUE the start value will become the current target's value, otherwise it will stay the same - - - NO-GC METHOD: changes the start and end value of a tween and rewinds it (without pausing it). - Has no effect with tweens that are inside Sequences - The new start value - The new end value - If bigger than 0 applies it as the new tween duration - - - - Struct that stores two colors (used for LineRenderer tweens) - - - - - Used for tween callbacks - - - - - Used for tween callbacks - - - - - Used for custom and animationCurve-based ease functions. Must return a value between 0 and 1. - - - - - Straight Quaternion plugin. Instead of using Vector3 values accepts Quaternion values directly. - Beware: doesn't work with LoopType.Incremental (neither directly nor if inside a LoopType.Incremental Sequence). - To use it, call DOTween.To with the plugin parameter overload, passing it PureQuaternionPlugin.Plug() as first parameter - (do not use any of the other public PureQuaternionPlugin methods): - DOTween.To(PureQuaternionPlugin.Plug(), ()=> myQuaternionProperty, x=> myQuaternionProperty = x, myQuaternionEndValue, duration); - - - - - Plug this plugin inside a DOTween.To call. - Example: - DOTween.To(PureQuaternionPlugin.Plug(), ()=> myQuaternionProperty, x=> myQuaternionProperty = x, myQuaternionEndValue, duration); - - - - INTERNAL: do not use - - - INTERNAL: do not use - - - INTERNAL: do not use - - - INTERNAL: do not use - - - INTERNAL: do not use - - - INTERNAL: do not use - - - INTERNAL: do not use - - - INTERNAL: do not use - - - - Extra non-tweening-related curve methods - - - - - Cubic bezier curve methods - - - - - Calculates a point along the given Cubic Bezier segment-curve. - - Segment start point - Start point's control point/handle - Segment end point - End point's control point/handle - 0-1 percentage along which to retrieve point - - - - Returns an array containing a series of points along the given Cubic Bezier segment-curve. - - Start point - Start point's control point/handle - End point - End point's control point/handle - Cloud resolution (min: 2) - - - - Calculates a series of points along the given Cubic Bezier segment-curve and adds them to the given list. - - Start point - Start point's control point/handle - End point - End point's control point/handle - Cloud resolution (min: 2) - - - - Main DOTween class. Contains static methods to create and control tweens in a generic way - - - - DOTween's version - - - If TRUE (default) makes tweens slightly slower but safer, automatically taking care of a series of things - (like targets becoming null while a tween is playing). - Default: TRUE - - - Log type when safe mode reports capturing an error and preventing it - - - Behaviour in case a tween nested inside a Sequence fails (and is caught by safe mode). - Default: NestedTweenFailureBehaviour.TryToPreserveSequence - - - If TRUE you will get a DOTween report when exiting play mode (only in the Editor). - Useful to know how many max Tweeners and Sequences you reached and optimize your final project accordingly. - Beware, this will slightly slow down your tweens while inside Unity Editor. - Default: FALSE - - - Global DOTween global timeScale (default: 1). - The final timeScale of a non-timeScaleIndependent tween is: - Unity's Time.timeScale * DOTween.timeScale * tween.timeScale - while the final timeScale of a timeScaleIndependent tween is: - DOTween.unscaledTimeScale * DOTween.timeScale * tween.timeScale - - - DOTween timeScale applied only to timeScaleIndependent tweens (default: 1). - The final timeScale of a timeScaleIndependent tween is: - DOTween.unscaledTimeScale * DOTween.timeScale * tween.timeScale - - - If TRUE, DOTween will use Time.smoothDeltaTime instead of Time.deltaTime for UpdateType.Normal and UpdateType.Late tweens - (unless they're set as timeScaleIndependent, in which case a value between the last timestep - and will be used instead). - Setting this to TRUE will lead to smoother animations. - Default: FALSE - - - If is TRUE, this indicates the max timeStep that an independent update call can last. - Setting this to TRUE will lead to smoother animations. - Default: FALSE - - - DOTween's log behaviour. - Default: LogBehaviour.ErrorsOnly - - - Used to intercept DOTween's logs. If this method isn't NULL, DOTween will call it before writing a log via Unity's own Debug log methods. - Return TRUE if you want DOTween to proceed with the log, FALSE otherwise. - This method must return a bool and accept two parameters: - - LogType: the type of Unity log that DOTween is trying to log - - object: the log message that DOTween wants to log - - - If TRUE draws path gizmos in Unity Editor (if the gizmos button is active). - Deactivate this if you want to avoid gizmos overhead while in Unity Editor - - - Gets/sets the max Tweeners capacity (automatically increased by DOTween when necessary). - You can also set both Tweeners and Sequences capacity via the static method - - - Gets/sets the max Sequences capacity (automatically increased by DOTween when necessary). - You can also set both Tweeners and Sequences capacity via the static method - - - If TRUE activates various debug options - - - Stores the target id so it can be used to give more info in case of safeMode error capturing. - Only active if both debugMode and useSafeMode are TRUE - - - Default updateType for new tweens. - Default: UpdateType.Normal - - - Sets whether Unity's timeScale should be taken into account by default or not. - Default: false - - - Default autoPlay behaviour for new tweens. - Default: AutoPlay.All - - - Default autoKillOnComplete behaviour for new tweens. - Default: TRUE - - - Default loopType applied to all new tweens. - Default: LoopType.Restart - - - If TRUE all newly created tweens are set as recyclable, otherwise not. - Default: FALSE - - - Default ease applied to all new Tweeners (not to Sequences which always have Ease.Linear as default). - Default: Ease.InOutQuad - - - Default overshoot/amplitude used for eases - Default: 1.70158f - - - Default period used for eases - Default: 0 - - - Used internally. Assigned/removed by DOTweenComponent.Create/DestroyInstance - - - - Must be called once, before the first ever DOTween call/reference, - otherwise it will be called automatically and will use default options. - Calling it a second time won't have any effect. - You can chain SetCapacity to this method, to directly set the max starting size of Tweeners and Sequences: - DOTween.Init(false, false, LogBehaviour.Default).SetCapacity(100, 20); - - If TRUE all new tweens will be set for recycling, meaning that when killed, - instead of being destroyed, they will be put in a pool and reused instead of creating new tweens. This option allows you to avoid - GC allocations by reusing tweens, but you will have to take care of tween references, since they might result active - even if they were killed (since they might have been respawned and are now being used for other tweens). - If you want to automatically set your tween references to NULL when a tween is killed - you can use the OnKill callback like this: - .OnKill(()=> myTweenReference = null) - You can change this setting at any time by changing the static property, - or you can set the recycling behaviour for each tween separately, using: - SetRecyclable(bool recyclable) - Default: FALSE - If TRUE makes tweens slightly slower but safer, automatically taking care of a series of things - (like targets becoming null while a tween is playing). - You can change this setting at any time by changing the static property. - Default: FALSE - Type of logging to use. - You can change this setting at any time by changing the static property. - Default: ErrorsOnly - - - - Directly sets the current max capacity of Tweeners and Sequences - (meaning how many Tweeners and Sequences can be running at the same time), - so that DOTween doesn't need to automatically increase them in case the max is reached - (which might lead to hiccups when that happens). - Sequences capacity must be less or equal to Tweeners capacity - (if you pass a low Tweener capacity it will be automatically increased to match the Sequence's). - Beware: use this method only when there are no tweens running. - - Max Tweeners capacity. - Default: 200 - Max Sequences capacity. - Default: 50 - - - - Kills all tweens, clears all cached tween pools and plugins and resets the max Tweeners/Sequences capacities to the default values. - - If TRUE also destroys DOTween's gameObject and resets its initializiation, default settings and everything else - (so that next time you use it it will need to be re-initialized) - - - - Clears all cached tween pools. - - - - - Checks all active tweens to find and remove eventually invalid ones (usually because their targets became NULL) - and returns the total number of invalid tweens found and removed. - IMPORTANT: this will cause an error on UWP platform, so don't use it there - BEWARE: this is a slightly expensive operation so use it with care - - - - - Updates all tweens that are set to . - - Manual deltaTime - Unscaled delta time (used with tweens set as timeScaleIndependent) - - - Tweens a property or field to the given value using default plugins - A getter for the field or property to tween. - Example usage with lambda:()=> myProperty - A setter for the field or property to tween - Example usage with lambda:x=> myProperty = x - The end value to reachThe tween's duration - - - Tweens a property or field to the given value using default plugins - A getter for the field or property to tween. - Example usage with lambda:()=> myProperty - A setter for the field or property to tween - Example usage with lambda:x=> myProperty = x - The end value to reachThe tween's duration - - - Tweens a property or field to the given value using default plugins - A getter for the field or property to tween. - Example usage with lambda:()=> myProperty - A setter for the field or property to tween - Example usage with lambda:x=> myProperty = x - The end value to reachThe tween's duration - - - Tweens a property or field to the given value using default plugins - A getter for the field or property to tween. - Example usage with lambda:()=> myProperty - A setter for the field or property to tween - Example usage with lambda:x=> myProperty = x - The end value to reachThe tween's duration - - - Tweens a property or field to the given value using default plugins - A getter for the field or property to tween. - Example usage with lambda:()=> myProperty - A setter for the field or property to tween - Example usage with lambda:x=> myProperty = x - The end value to reachThe tween's duration - - - Tweens a property or field to the given value using default plugins - A getter for the field or property to tween. - Example usage with lambda:()=> myProperty - A setter for the field or property to tween - Example usage with lambda:x=> myProperty = x - The end value to reachThe tween's duration - - - Tweens a property or field to the given value using default plugins - A getter for the field or property to tween. - Example usage with lambda:()=> myProperty - A setter for the field or property to tween - Example usage with lambda:x=> myProperty = x - The end value to reachThe tween's duration - - - Tweens a property or field to the given value using default plugins - A getter for the field or property to tween. - Example usage with lambda:()=> myProperty - A setter for the field or property to tween - Example usage with lambda:x=> myProperty = x - The end value to reachThe tween's duration - - - Tweens a property or field to the given value using default plugins - A getter for the field or property to tween. - Example usage with lambda:()=> myProperty - A setter for the field or property to tween - Example usage with lambda:x=> myProperty = x - The end value to reachThe tween's duration - - - Tweens a property or field to the given value using default plugins - A getter for the field or property to tween. - Example usage with lambda:()=> myProperty - A setter for the field or property to tween - Example usage with lambda:x=> myProperty = x - The end value to reachThe tween's duration - - - Tweens a property or field to the given value using default plugins - A getter for the field or property to tween. - Example usage with lambda:()=> myProperty - A setter for the field or property to tween - Example usage with lambda:x=> myProperty = x - The end value to reachThe tween's duration - - - Tweens a property or field to the given value using default plugins - A getter for the field or property to tween. - Example usage with lambda:()=> myProperty - A setter for the field or property to tween - Example usage with lambda:x=> myProperty = x - The end value to reachThe tween's duration - - - Tweens a property or field to the given value using default plugins - A getter for the field or property to tween. - Example usage with lambda:()=> myProperty - A setter for the field or property to tween - Example usage with lambda:x=> myProperty = x - The end value to reachThe tween's duration - - - Tweens a property or field to the given value using default plugins - A getter for the field or property to tween. - Example usage with lambda:()=> myProperty - A setter for the field or property to tween - Example usage with lambda:x=> myProperty = x - The end value to reachThe tween's duration - - - Tweens a property or field to the given value using a custom plugin - The plugin to use. Each custom plugin implements a static Get() method - you'll need to call to assign the correct plugin in the correct way, like this: - CustomPlugin.Get() - A getter for the field or property to tween. - Example usage with lambda:()=> myProperty - A setter for the field or property to tween - Example usage with lambda:x=> myProperty = x - The end value to reachThe tween's duration - - - Tweens only one axis of a Vector3 to the given value using default plugins. - A getter for the field or property to tween. - Example usage with lambda:()=> myProperty - A setter for the field or property to tween - Example usage with lambda:x=> myProperty = x - The end value to reachThe tween's duration - The axis to tween - - - Tweens only the alpha of a Color to the given value using default plugins - A getter for the field or property to tween. - Example usage with lambda:()=> myProperty - A setter for the field or property to tween - Example usage with lambda:x=> myProperty = x - The end value to reachThe tween's duration - - - Tweens a virtual property from the given start to the given end value - and implements a setter that allows to use that value with an external method or a lambda - Example: - To(MyMethod, 0, 12, 0.5f); - Where MyMethod is a function that accepts a float parameter (which will be the result of the virtual tween) - The action to perform with the tweened value - The value to start from - The end value to reach - The duration of the virtual tween - - - - Punches a Vector3 towards the given direction and then back to the starting one - as if it was connected to the starting position via an elastic. - This tween type generates some GC allocations at startup - A getter for the field or property to tween. - Example usage with lambda:()=> myProperty - A setter for the field or property to tween - Example usage with lambda:x=> myProperty = x - The direction and strength of the punch - The duration of the tween - Indicates how much will the punch vibrate - Represents how much (0 to 1) the vector will go beyond the starting position when bouncing backwards. - 1 creates a full oscillation between the direction and the opposite decaying direction, - while 0 oscillates only between the starting position and the decaying direction - - - Shakes a Vector3 with the given values. - A getter for the field or property to tween. - Example usage with lambda:()=> myProperty - A setter for the field or property to tween - Example usage with lambda:x=> myProperty = x - The duration of the tween - The shake strength - Indicates how much will the shake vibrate - Indicates how much the shake will be random (0 to 180 - values higher than 90 kind of suck, so beware). - Setting it to 0 will shake along a single direction and behave like a random punch. - If TRUE only shakes on the X Y axis (looks better with things like cameras). - If TRUE the shake will automatically fadeOut smoothly within the tween's duration, otherwise it will not - Randomness mode - - - Shakes a Vector3 with the given values. - A getter for the field or property to tween. - Example usage with lambda:()=> myProperty - A setter for the field or property to tween - Example usage with lambda:x=> myProperty = x - The duration of the tween - The shake strength on each axis - Indicates how much will the shake vibrate - Indicates how much the shake will be random (0 to 180 - values higher than 90 kind of suck, so beware). - Setting it to 0 will shake along a single direction and behave like a random punch. - If TRUE the shake will automatically fadeOut smoothly within the tween's duration, otherwise it will not - Randomness mode - - - Tweens a property or field to the given values using default plugins. - Ease is applied between each segment and not as a whole. - This tween type generates some GC allocations at startup - A getter for the field or property to tween. - Example usage with lambda:()=> myProperty - A setter for the field or property to tween - Example usage with lambda:x=> myProperty = x - The end values to reach for each segment. This array must have the same length as durations - The duration of each segment. This array must have the same length as endValues - - - - Returns a new to be used for tween groups. - Mind that Sequences don't have a target applied automatically like Tweener creation shortcuts, - so if you want to be able to kill this Sequence when calling DOTween.Kill(target) you'll have to add - the target manually; you can do that directly by using the overload instead of this one - - - - - Returns a new to be used for tween groups, and allows to set a target - (because Sequences don't have their target set automatically like Tweener creation shortcuts). - That way killing/controlling tweens by target will apply to this Sequence too. - - The target of the Sequence. Relevant only for static target-based methods like DOTween.Kill(target), - useless otherwise - - - Completes all tweens and returns the number of actual tweens completed - (meaning tweens that don't have infinite loops and were not already complete) - For Sequences only: if TRUE also internal Sequence callbacks will be fired, - otherwise they will be ignored - - - Completes all tweens with the given ID or target and returns the number of actual tweens completed - (meaning the tweens that don't have infinite loops and were not already complete) - For Sequences only: if TRUE internal Sequence callbacks will be fired, - otherwise they will be ignored - - - Flips all tweens (changing their direction to forward if it was backwards and viceversa), - then returns the number of actual tweens flipped - - - Flips the tweens with the given ID or target (changing their direction to forward if it was backwards and viceversa), - then returns the number of actual tweens flipped - - - Sends all tweens to the given position (calculating also eventual loop cycles) and returns the actual tweens involved - - - Sends all tweens with the given ID or target to the given position (calculating also eventual loop cycles) - and returns the actual tweens involved - - - Kills all tweens and returns the number of actual tweens killed - If TRUE completes the tweens before killing them - - - Kills all tweens and returns the number of actual tweens killed - If TRUE completes the tweens before killing them - Eventual IDs or targets to exclude from the killing - - - Kills all tweens with the given ID or target and returns the number of actual tweens killed - If TRUE completes the tweens before killing them - - - Kills all tweens with the given target and the given ID, and returns the number of actual tweens killed - If TRUE completes the tweens before killing them - - - Pauses all tweens and returns the number of actual tweens paused - - - Pauses all tweens with the given ID or target and returns the number of actual tweens paused - (meaning the tweens that were actually playing and have been paused) - - - Plays all tweens and returns the number of actual tweens played - (meaning tweens that were not already playing or complete) - - - Plays all tweens with the given ID or target and returns the number of actual tweens played - (meaning the tweens that were not already playing or complete) - - - Plays all tweens with the given target and the given ID, and returns the number of actual tweens played - (meaning the tweens that were not already playing or complete) - - - Plays backwards all tweens and returns the number of actual tweens played - (meaning tweens that were not already started, playing backwards or rewinded) - - - Plays backwards all tweens with the given ID or target and returns the number of actual tweens played - (meaning the tweens that were not already started, playing backwards or rewinded) - - - Plays backwards all tweens with the given target and ID and returns the number of actual tweens played - (meaning the tweens that were not already started, playing backwards or rewinded) - - - Plays forward all tweens and returns the number of actual tweens played - (meaning tweens that were not already playing forward or complete) - - - Plays forward all tweens with the given ID or target and returns the number of actual tweens played - (meaning the tweens that were not already playing forward or complete) - - - Plays forward all tweens with the given target and ID and returns the number of actual tweens played - (meaning the tweens that were not already started, playing backwards or rewinded) - - - Restarts all tweens, then returns the number of actual tweens restarted - - - Restarts all tweens with the given ID or target, then returns the number of actual tweens restarted - If TRUE includes the eventual tweens delays, otherwise skips them - If >= 0 changes the startup delay of all involved tweens to this value, otherwise doesn't touch it - - - Restarts all tweens with the given target and the given ID, and returns the number of actual tweens played - (meaning the tweens that were not already playing or complete) - If TRUE includes the eventual tweens delays, otherwise skips them - If >= 0 changes the startup delay of all involved tweens to this value, otherwise doesn't touch it - - - Rewinds and pauses all tweens, then returns the number of actual tweens rewinded - (meaning tweens that were not already rewinded) - - - Rewinds and pauses all tweens with the given ID or target, then returns the number of actual tweens rewinded - (meaning the tweens that were not already rewinded) - - - Smoothly rewinds all tweens (delays excluded), then returns the number of actual tweens rewinding/rewinded - (meaning tweens that were not already rewinded). - A "smooth rewind" animates the tween to its start position, - skipping all elapsed loops (except in case of LoopType.Incremental) while keeping the animation fluent. - Note that a tween that was smoothly rewinded will have its play direction flipped - - - Smoothly rewinds all tweens (delays excluded) with the given ID or target, then returns the number of actual tweens rewinding/rewinded - (meaning the tweens that were not already rewinded). - A "smooth rewind" animates the tween to its start position, - skipping all elapsed loops (except in case of LoopType.Incremental) while keeping the animation fluent. - Note that a tween that was smoothly rewinded will have its play direction flipped - - - Toggles the play state of all tweens and returns the number of actual tweens toggled - (meaning tweens that could be played or paused, depending on the toggle state) - - - Toggles the play state of all tweens with the given ID or target and returns the number of actual tweens toggled - (meaning the tweens that could be played or paused, depending on the toggle state) - - - - Returns TRUE if a tween with the given ID or target is active. - You can also use this to know if a shortcut tween is active for a given target. - Example: - transform.DOMoveX(45, 1); // transform is automatically added as the tween target - DOTween.IsTweening(transform); // Returns true - - The target or ID to look for - If FALSE (default) returns TRUE as long as a tween for the given target/ID is active, - otherwise also requires it to be playing - - - - Returns the total number of active tweens (so both Tweeners and Sequences). - A tween is considered active if it wasn't killed, regardless if it's playing or paused - - - - - Returns the total number of active Tweeners. - A Tweener is considered active if it wasn't killed, regardless if it's playing or paused - - - - - Returns the total number of active Sequences. - A Sequence is considered active if it wasn't killed, regardless if it's playing or paused - - - - - Returns the total number of active and playing tweens. - A tween is considered as playing even if its delay is actually playing - - - - - Returns a the total number of active tweens with the given id. - - If TRUE returns only the tweens with the given ID that are currently playing - - - - Returns a list of all active tweens in a playing state. - Returns NULL if there are no active playing tweens. - Beware: each time you call this method a new list is generated, so use it for debug only - - If NULL creates a new list, otherwise clears and fills this one (and thus saves allocations) - - - - Returns a list of all active tweens in a paused state. - Returns NULL if there are no active paused tweens. - Beware: each time you call this method a new list is generated, so use it for debug only - - If NULL creates a new list, otherwise clears and fills this one (and thus saves allocations) - - - - Returns a list of all active tweens with the given id. - Returns NULL if there are no active tweens with the given id. - Beware: each time you call this method a new list is generated - - If TRUE returns only the tweens with the given ID that are currently playing - If NULL creates a new list, otherwise clears and fills this one (and thus saves allocations) - - - - Returns a list of all active tweens with the given target. - Returns NULL if there are no active tweens with the given target. - Beware: each time you call this method a new list is generated - If TRUE returns only the tweens with the given target that are currently playing - If NULL creates a new list, otherwise clears and fills this one (and thus saves allocations) - - - - - Creates virtual tweens that can be used to change other elements via their OnUpdate calls - - - - - Tweens a virtual float. - You can add regular settings to the generated tween, - but do not use OnUpdate or you will overwrite the onVirtualUpdate parameter - - The value to start from - The value to tween to - The duration of the tween - A callback which must accept a parameter of type float, called at each update - - - - Tweens a virtual int. - You can add regular settings to the generated tween, - but do not use OnUpdate or you will overwrite the onVirtualUpdate parameter - - The value to start from - The value to tween to - The duration of the tween - A callback which must accept a parameter of type int, called at each update - - - - Tweens a virtual Vector2. - You can add regular settings to the generated tween, - but do not use OnUpdate or you will overwrite the onVirtualUpdate parameter - - The value to start from - The value to tween to - The duration of the tween - A callback which must accept a parameter of type Vector3, called at each update - - - - Tweens a virtual Vector3. - You can add regular settings to the generated tween, - but do not use OnUpdate or you will overwrite the onVirtualUpdate parameter - - The value to start from - The value to tween to - The duration of the tween - A callback which must accept a parameter of type Vector3, called at each update - - - - Tweens a virtual Color. - You can add regular settings to the generated tween, - but do not use OnUpdate or you will overwrite the onVirtualUpdate parameter - - The value to start from - The value to tween to - The duration of the tween - A callback which must accept a parameter of type Color, called at each update - - - Returns a value based on the given ease and lifetime percentage (0 to 1) - The value to start from when lifetimePercentage is 0 - The value to reach when lifetimePercentage is 1 - The time percentage (0 to 1) at which the value should be taken - The type of ease - - - Returns a value based on the given ease and lifetime percentage (0 to 1) - The value to start from when lifetimePercentage is 0 - The value to reach when lifetimePercentage is 1 - The time percentage (0 to 1) at which the value should be taken - The type of ease - Eventual overshoot to use with Back ease - - - Returns a value based on the given ease and lifetime percentage (0 to 1) - The value to start from when lifetimePercentage is 0 - The value to reach when lifetimePercentage is 1 - The time percentage (0 to 1) at which the value should be taken - The type of ease - Eventual amplitude to use with Elastic easeType - Eventual period to use with Elastic easeType - - - Returns a value based on the given ease and lifetime percentage (0 to 1) - The value to start from when lifetimePercentage is 0 - The value to reach when lifetimePercentage is 1 - The time percentage (0 to 1) at which the value should be taken - The AnimationCurve to use for ease - - - Returns a value based on the given ease and lifetime percentage (0 to 1) - The value to start from when lifetimePercentage is 0 - The value to reach when lifetimePercentage is 1 - The time percentage (0 to 1) at which the value should be taken - The type of ease - - - Returns a value based on the given ease and lifetime percentage (0 to 1) - The value to start from when lifetimePercentage is 0 - The value to reach when lifetimePercentage is 1 - The time percentage (0 to 1) at which the value should be taken - The type of ease - Eventual overshoot to use with Back ease - - - Returns a value based on the given ease and lifetime percentage (0 to 1) - The value to start from when lifetimePercentage is 0 - The value to reach when lifetimePercentage is 1 - The time percentage (0 to 1) at which the value should be taken - The type of ease - Eventual amplitude to use with Elastic easeType - Eventual period to use with Elastic easeType - - - Returns a value based on the given ease and lifetime percentage (0 to 1) - The value to start from when lifetimePercentage is 0 - The value to reach when lifetimePercentage is 1 - The time percentage (0 to 1) at which the value should be taken - The AnimationCurve to use for ease - - - Fires the given callback after the given time. - Callback delay - Callback to fire when the delay has expired - If TRUE (default) ignores Unity's timeScale - - - - Don't assign this! It's assigned automatically when creating 0 duration tweens - - - - - Don't assign this! It's assigned automatically when setting the ease to an AnimationCurve or to a custom ease function - - - - - Allows to wrap ease method in special ways, adding extra features - - - - - Converts the given ease so that it also creates a stop-motion effect, by playing the tween at the given FPS - - FPS at which the tween should be played - Ease type - - - - Converts the given ease so that it also creates a stop-motion effect, by playing the tween at the given FPS - - FPS at which the tween should be played - AnimationCurve to use for the ease - - - - Converts the given ease so that it also creates a stop-motion effect, by playing the tween at the given FPS - - FPS at which the tween should be played - Custom ease function to use - - - - Used to allow method chaining with DOTween.Init - - - - - Directly sets the current max capacity of Tweeners and Sequences - (meaning how many Tweeners and Sequences can be running at the same time), - so that DOTween doesn't need to automatically increase them in case the max is reached - (which might lead to hiccups when that happens). - Sequences capacity must be less or equal to Tweeners capacity - (if you pass a low Tweener capacity it will be automatically increased to match the Sequence's). - Beware: use this method only when there are no tweens running. - - Max Tweeners capacity. - Default: 200 - Max Sequences capacity. - Default: 50 - - - - Behaviour that can be assigned when chaining a SetLink to a tween - - - - Pauses the tween when the link target is disabled - - - Pauses the tween when the link target is disabled, plays it when it's enabled - - - Pauses the tween when the link target is disabled, restarts it when it's enabled - - - Plays the tween when the link target is enabled - - - Restarts the tween when the link target is enabled - - - Kills the tween when the link target is disabled - - - Kills the tween when the link target is destroyed (becomes NULL). This is always active even if another behaviour is chosen - - - Completes the tween when the link target is disabled - - - Completes and kills the tween when the link target is disabled - - - Rewinds the tween (delay excluded) when the link target is disabled - - - Rewinds and kills the tween when the link target is disabled - - - - Path mode (used to determine correct LookAt orientation) - - - - Ignores the path mode (and thus LookAt behaviour) - - - Regular 3D path - - - 2D top-down path - - - 2D side-scroller path - - - - Type of path to use with DOPath tweens - - - - Linear, composed of straight segments between each waypoint - - - Curved path (which uses Catmull-Rom curves) - - - EXPERIMENTAL: Curved path (which uses Cubic Bezier curves, where each point requires two extra control points) - - - - Tweens a Vector2 along a circle. - EndValue represents the center of the circle, start and end value degrees are inside options - ChangeValue x is changeValue°, y is unused - - - - - Path control point - - - - - Path waypoints (modified by PathPlugin when setting relative end/change value or by CubicBezierDecoder) and by DOTweenPathInspector - - - - - Minimum input points necessary to create the path (doesn't correspond to actual waypoints required) - - - - - Gets the point on the path at the given percentage (0 to 1) - - The percentage (0 to 1) at which to get the point - If TRUE constant speed is taken into account, otherwise not - - - - Base interface for all tween plugins options - - - - Resets the plugin - - - - This plugin generates some GC allocations at startup - - - - - Path plugin works exclusively with Transforms - - - - - Rotation mode used with DORotate methods - - - - - Fastest way that never rotates beyond 360° - - - - - Fastest way that rotates beyond 360° - - - - - Adds the given rotation to the transform using world axis and an advanced precision mode - (like when using transform.Rotate(Space.World)). - In this mode the end value is is always considered relative - - - - - Adds the given rotation to the transform's local axis - (like when rotating an object with the "local" switch enabled in Unity's editor or using transform.Rotate(Space.Self)). - In this mode the end value is is always considered relative - - - - - Type of scramble to apply to string tweens - - - - - No scrambling of characters - - - - - A-Z + a-z + 0-9 characters - - - - - A-Z characters - - - - - a-z characters - - - - - 0-9 characters - - - - - Custom characters - - - - - Type of randomness to apply to a shake tween - - - - Default, full randomness - - - Creates a more balanced randomness that looks more harmonic - - - - Methods that extend Tween objects and allow to control or get data from them - - - - Completes the tween - - - Completes the tween - For Sequences only: if TRUE also internal Sequence callbacks will be fired, - otherwise they will be ignored - - - Optional: indicates that the tween creation has ended, to be used (optionally) as the last element of tween chaining creation.
- This method won't do anything except in case of 0-duration tweens, - where it will complete them immediately instead of waiting for the next internal update routine - (unless they're nested in a Sequence, in which case the Sequence will still be the one in control and this method will be ignored)
-
- - Flips the direction of this tween (backwards if it was going forward or viceversa) - - - Forces the tween to initialize its settings immediately - - - Send the tween to the given position in time - Time position to reach - (if higher than the whole tween duration the tween will simply reach its end) - If TRUE will play the tween after reaching the given position, otherwise it will pause it - - - Send the tween to the given position in time while also executing any callback between the previous time position and the new one - Time position to reach - (if higher than the whole tween duration the tween will simply reach its end) - If TRUE will play the tween after reaching the given position, otherwise it will pause it - - - Kills the tween - If TRUE completes the tween before killing it - - - - Forces this tween to update manually, regardless of the set via SetUpdate. - Note that the tween will still be subject to normal tween rules, so if for example it's paused this method will do nothing. - Also note that if you only want to update this tween instance manually you'll have to set it to anyway, - so that it's not updated automatically. - - Manual deltaTime - Unscaled delta time (used with tweens set as timeScaleIndependent) - - - Pauses the tween - - - Plays the tween - - - Sets the tween in a backwards direction and plays it - - - Sets the tween in a forward direction and plays it - - - Restarts the tween from the beginning - Ignored in case of Sequences. If TRUE includes the eventual tween delay, otherwise skips it - Ignored in case of Sequences. If >= 0 changes the startup delay to this value, otherwise doesn't touch it - - - Rewinds and pauses the tween - Ignored in case of Sequences. If TRUE includes the eventual tween delay, otherwise skips it - - - Smoothly rewinds the tween (delays excluded). - A "smooth rewind" animates the tween to its start position, - skipping all elapsed loops (except in case of LoopType.Incremental) while keeping the animation fluent. - If called on a tween who is still waiting for its delay to happen, it will simply set the delay to 0 and pause the tween. - Note that a tween that was smoothly rewinded will have its play direction flipped - - - Plays the tween if it was paused, pauses it if it was playing - - - Send a path tween to the given waypoint. - Has no effect if this is not a path tween. - BEWARE, this is a special utility method: - it works only with Linear eases. Also, the lookAt direction might be wrong after calling this and might need to be set manually - (because it relies on a smooth path movement and doesn't work well with jumps that encompass dramatic direction changes) - Waypoint index to reach - (if higher than the max waypoint index the tween will simply go to the last one) - If TRUE will play the tween after reaching the given waypoint, otherwise it will pause it - - - - Creates a yield instruction that waits until the tween is killed or complete. - It can be used inside a coroutine as a yield. - Example usage:yield return myTween.WaitForCompletion(); - - - - - Creates a yield instruction that waits until the tween is killed or rewinded. - It can be used inside a coroutine as a yield. - Example usage:yield return myTween.WaitForRewind(); - - - - - Creates a yield instruction that waits until the tween is killed. - It can be used inside a coroutine as a yield. - Example usage:yield return myTween.WaitForKill(); - - - - - Creates a yield instruction that waits until the tween is killed or has gone through the given amount of loops. - It can be used inside a coroutine as a yield. - Example usage:yield return myTween.WaitForElapsedLoops(2); - - Elapsed loops to wait for - - - - Creates a yield instruction that waits until the tween is killed or has reached the given position (loops included, delays excluded). - It can be used inside a coroutine as a yield. - Example usage:yield return myTween.WaitForPosition(2.5f); - - Position (loops included, delays excluded) to wait for - - - - Creates a yield instruction that waits until the tween is killed or started - (meaning when the tween is set in a playing state the first time, after any eventual delay). - It can be used inside a coroutine as a yield. - Example usage:yield return myTween.WaitForStart(); - - - - Returns the total number of loops completed by this tween - - - Returns the eventual delay set for this tween - - - Returns the eventual elapsed delay set for this tween - - - Returns the duration of this tween (delays excluded). - NOTE: when using settings like SpeedBased, the duration will be recalculated when the tween starts - If TRUE returns the full duration loops included, - otherwise the duration of a single loop cycle - - - Returns the elapsed time for this tween (delays exluded) - If TRUE returns the elapsed time since startup loops included, - otherwise the elapsed time within the current loop cycle - - - Returns the elapsed percentage (0 to 1) of this tween (delays exluded) - If TRUE returns the elapsed percentage since startup loops included, - otherwise the elapsed percentage within the current loop cycle - - - Returns the elapsed percentage (0 to 1) of this tween (delays exluded), - based on a single loop, and calculating eventual backwards Yoyo loops as 1 to 0 instead of 0 to 1 - - - Returns FALSE if this tween has been killed or is NULL, TRUE otherwise. - BEWARE: if this tween is recyclable it might have been spawned again for another use and thus return TRUE anyway. - When working with recyclable tweens you should take care to know when a tween has been killed and manually set your references to NULL. - If you want to be sure your references are set to NULL when a tween is killed you can use the OnKill callback like this: - .OnKill(()=> myTweenReference = null) - - - Returns TRUE if this tween was reversed and is set to go backwards - - - NOTE: To check if a tween was simply set to go backwards see . - Returns TRUE if this tween is going backwards for any of these reasons: - - The tween was reversed and is going backwards on a straight loop - - The tween was reversed and is going backwards on an odd Yoyo loop - - The tween is going forward but on an even Yoyo loop - IMPORTANT: if used inside a tween's callback, this will return a result concerning the exact frame when it's asked, - so for example in a callback at the end of a Yoyo loop step this method will never return FALSE - because the frame will never end exactly there and the tween will already be going backwards when the callback is fired - - - Returns TRUE if the tween is complete - (silently fails and returns FALSE if the tween has been killed) - - - Returns TRUE if this tween was set to be timeScale independent via the tween.SetUpdate method - - - Returns TRUE if this tween has been initialized - - - Returns TRUE if this tween is playing - - - Returns the total number of loops set for this tween - (returns -1 if the loops are infinite) - - - - Returns a point on a path based on the given path percentage. - Returns Vector3.zero if this is not a path tween, if the tween is invalid, or if the path is not yet initialized. - A path is initialized after its tween starts, or immediately if the tween was created with the Path Editor (DOTween Pro feature). - You can force a path to be initialized by calling myTween.ForceInit(). - - Percentage of the path (0 to 1) on which to get the point - - - - Returns an array of points that can be used to draw the path. - Note that this method generates allocations, because it creates a new array. - Returns NULL if this is not a path tween, if the tween is invalid, or if the path is not yet initialized. - A path is initialized after its tween starts, or immediately if the tween was created with the Path Editor (DOTween Pro feature). - You can force a path to be initialized by calling myTween.ForceInit(). - - How many points to create for each path segment (waypoint to waypoint). - Only used in case of non-Linear paths - - - - Returns the length of a path. - Returns -1 if this is not a path tween, if the tween is invalid, or if the path is not yet initialized. - A path is initialized after its tween starts, or immediately if the tween was created with the Path Editor (DOTween Pro feature). - You can force a path to be initialized by calling myTween.ForceInit(). - - - - - Types of loop - - - - Each loop cycle restarts from the beginning - - - The tween moves forward and backwards at alternate cycles - - - Continuously increments the tween at the end of each loop cycle (A to B, B to B+(A-B), and so on), thus always moving "onward". - In case of String tweens works only if the tween is set as relative - - - - Controls other tweens as a group - - - - - Methods that extend known Unity objects and allow to directly create and control tweens from their instances - - - - Tweens a Camera's aspect to the given value. - Also stores the camera as the tween's target so it can be used for filtered operations - The end value to reachThe duration of the tween - - - Tweens a Camera's backgroundColor to the given value. - Also stores the camera as the tween's target so it can be used for filtered operations - The end value to reachThe duration of the tween - - - Tweens a Camera's farClipPlane to the given value. - Also stores the camera as the tween's target so it can be used for filtered operations - The end value to reachThe duration of the tween - - - Tweens a Camera's fieldOfView to the given value. - Also stores the camera as the tween's target so it can be used for filtered operations - The end value to reachThe duration of the tween - - - Tweens a Camera's nearClipPlane to the given value. - Also stores the camera as the tween's target so it can be used for filtered operations - The end value to reachThe duration of the tween - - - Tweens a Camera's orthographicSize to the given value. - Also stores the camera as the tween's target so it can be used for filtered operations - The end value to reachThe duration of the tween - - - Tweens a Camera's pixelRect to the given value. - Also stores the camera as the tween's target so it can be used for filtered operations - The end value to reachThe duration of the tween - - - Tweens a Camera's rect to the given value. - Also stores the camera as the tween's target so it can be used for filtered operations - The end value to reachThe duration of the tween - - - Shakes a Camera's localPosition along its relative X Y axes with the given values. - Also stores the camera as the tween's target so it can be used for filtered operations - The duration of the tween - The shake strength - Indicates how much will the shake vibrate - Indicates how much the shake will be random (0 to 180 - values higher than 90 kind of suck, so beware). - Setting it to 0 will shake along a single direction. - If TRUE the shake will automatically fadeOut smoothly within the tween's duration, otherwise it will not - Randomness mode - - - Shakes a Camera's localPosition along its relative X Y axes with the given values. - Also stores the camera as the tween's target so it can be used for filtered operations - The duration of the tween - The shake strength on each axis - Indicates how much will the shake vibrate - Indicates how much the shake will be random (0 to 180 - values higher than 90 kind of suck, so beware). - Setting it to 0 will shake along a single direction. - If TRUE the shake will automatically fadeOut smoothly within the tween's duration, otherwise it will not - Randomness mode - - - Shakes a Camera's localRotation. - Also stores the camera as the tween's target so it can be used for filtered operations - The duration of the tween - The shake strength - Indicates how much will the shake vibrate - Indicates how much the shake will be random (0 to 180 - values higher than 90 kind of suck, so beware). - Setting it to 0 will shake along a single direction. - If TRUE the shake will automatically fadeOut smoothly within the tween's duration, otherwise it will not - Randomness mode - - - Shakes a Camera's localRotation. - Also stores the camera as the tween's target so it can be used for filtered operations - The duration of the tween - The shake strength on each axis - Indicates how much will the shake vibrate - Indicates how much the shake will be random (0 to 180 - values higher than 90 kind of suck, so beware). - Setting it to 0 will shake along a single direction. - If TRUE the shake will automatically fadeOut smoothly within the tween's duration, otherwise it will not - Randomness mode - - - Tweens a Light's color to the given value. - Also stores the light as the tween's target so it can be used for filtered operations - The end value to reachThe duration of the tween - - - Tweens a Light's intensity to the given value. - Also stores the light as the tween's target so it can be used for filtered operations - The end value to reachThe duration of the tween - - - Tweens a Light's shadowStrength to the given value. - Also stores the light as the tween's target so it can be used for filtered operations - The end value to reachThe duration of the tween - - - Tweens a LineRenderer's color to the given value. - Also stores the LineRenderer as the tween's target so it can be used for filtered operations. - Note that this method requires to also insert the start colors for the tween, - since LineRenderers have no way to get them. - The start value to tween from - The end value to reachThe duration of the tween - - - Tweens a Material's color to the given value. - Also stores the material as the tween's target so it can be used for filtered operations - The end value to reachThe duration of the tween - - - Tweens a Material's named color property to the given value. - Also stores the material as the tween's target so it can be used for filtered operations - The end value to reach - The name of the material property to tween (like _Tint or _SpecColor) - The duration of the tween - - - Tweens a Material's named color property with the given ID to the given value. - Also stores the material as the tween's target so it can be used for filtered operations - The end value to reach - The ID of the material property to tween (also called nameID in Unity's manual) - The duration of the tween - - - Tweens a Material's alpha color to the given value - (will have no effect unless your material supports transparency). - Also stores the material as the tween's target so it can be used for filtered operations - The end value to reachThe duration of the tween - - - Tweens a Material's alpha color to the given value - (will have no effect unless your material supports transparency). - Also stores the material as the tween's target so it can be used for filtered operations - The end value to reach - The name of the material property to tween (like _Tint or _SpecColor) - The duration of the tween - - - Tweens a Material's alpha color with the given ID to the given value - (will have no effect unless your material supports transparency). - Also stores the material as the tween's target so it can be used for filtered operations - The end value to reach - The ID of the material property to tween (also called nameID in Unity's manual) - The duration of the tween - - - Tweens a Material's named float property to the given value. - Also stores the material as the tween's target so it can be used for filtered operations - The end value to reach - The name of the material property to tween - The duration of the tween - - - Tweens a Material's named float property with the given ID to the given value. - Also stores the material as the tween's target so it can be used for filtered operations - The end value to reach - The ID of the material property to tween (also called nameID in Unity's manual) - The duration of the tween - - - Tweens a Material's texture offset to the given value. - Also stores the material as the tween's target so it can be used for filtered operations - The end value to reach - The duration of the tween - - - Tweens a Material's named texture offset property to the given value. - Also stores the material as the tween's target so it can be used for filtered operations - The end value to reach - The name of the material property to tween - The duration of the tween - - - Tweens a Material's texture scale to the given value. - Also stores the material as the tween's target so it can be used for filtered operations - The end value to reach - The duration of the tween - - - Tweens a Material's named texture scale property to the given value. - Also stores the material as the tween's target so it can be used for filtered operations - The end value to reach - The name of the material property to tween - The duration of the tween - - - Tweens a Material's named Vector property to the given value. - Also stores the material as the tween's target so it can be used for filtered operations - The end value to reach - The name of the material property to tween - The duration of the tween - - - Tweens a Material's named Vector property with the given ID to the given value. - Also stores the material as the tween's target so it can be used for filtered operations - The end value to reach - The ID of the material property to tween (also called nameID in Unity's manual) - The duration of the tween - - - Tweens a TrailRenderer's startWidth/endWidth to the given value. - Also stores the TrailRenderer as the tween's target so it can be used for filtered operations - The end startWidth to reachThe end endWidth to reach - The duration of the tween - - - Tweens a TrailRenderer's time to the given value. - Also stores the TrailRenderer as the tween's target so it can be used for filtered operations - The end value to reachThe duration of the tween - - - Tweens a Transform's position to the given value. - Also stores the transform as the tween's target so it can be used for filtered operations - The end value to reachThe duration of the tween - If TRUE the tween will smoothly snap all values to integers - - - Tweens a Transform's X position to the given value. - Also stores the transform as the tween's target so it can be used for filtered operations - The end value to reachThe duration of the tween - If TRUE the tween will smoothly snap all values to integers - - - Tweens a Transform's Y position to the given value. - Also stores the transform as the tween's target so it can be used for filtered operations - The end value to reachThe duration of the tween - If TRUE the tween will smoothly snap all values to integers - - - Tweens a Transform's Z position to the given value. - Also stores the transform as the tween's target so it can be used for filtered operations - The end value to reachThe duration of the tween - If TRUE the tween will smoothly snap all values to integers - - - Tweens a Transform's localPosition to the given value. - Also stores the transform as the tween's target so it can be used for filtered operations - The end value to reachThe duration of the tween - If TRUE the tween will smoothly snap all values to integers - - - Tweens a Transform's X localPosition to the given value. - Also stores the transform as the tween's target so it can be used for filtered operations - The end value to reachThe duration of the tween - If TRUE the tween will smoothly snap all values to integers - - - Tweens a Transform's Y localPosition to the given value. - Also stores the transform as the tween's target so it can be used for filtered operations - The end value to reachThe duration of the tween - If TRUE the tween will smoothly snap all values to integers - - - Tweens a Transform's Z localPosition to the given value. - Also stores the transform as the tween's target so it can be used for filtered operations - The end value to reachThe duration of the tween - If TRUE the tween will smoothly snap all values to integers - - - Tweens a Transform's rotation to the given value. - Also stores the transform as the tween's target so it can be used for filtered operations - The end value to reachThe duration of the tween - Rotation mode - - - Tweens a Transform's rotation to the given value using pure quaternion values. - Also stores the transform as the tween's target so it can be used for filtered operations. - PLEASE NOTE: DORotate, which takes Vector3 values, is the preferred rotation method. - This method was implemented for very special cases, and doesn't support LoopType.Incremental loops - (neither for itself nor if placed inside a LoopType.Incremental Sequence) - - The end value to reachThe duration of the tween - - - Tweens a Transform's localRotation to the given value. - Also stores the transform as the tween's target so it can be used for filtered operations - The end value to reachThe duration of the tween - Rotation mode - - - Tweens a Transform's rotation to the given value using pure quaternion values. - Also stores the transform as the tween's target so it can be used for filtered operations. - PLEASE NOTE: DOLocalRotate, which takes Vector3 values, is the preferred rotation method. - This method was implemented for very special cases, and doesn't support LoopType.Incremental loops - (neither for itself nor if placed inside a LoopType.Incremental Sequence) - - The end value to reachThe duration of the tween - - - Tweens a Transform's localScale to the given value. - Also stores the transform as the tween's target so it can be used for filtered operations - The end value to reachThe duration of the tween - - - Tweens a Transform's localScale uniformly to the given value. - Also stores the transform as the tween's target so it can be used for filtered operations - The end value to reachThe duration of the tween - - - Tweens a Transform's X localScale to the given value. - Also stores the transform as the tween's target so it can be used for filtered operations - The end value to reachThe duration of the tween - - - Tweens a Transform's Y localScale to the given value. - Also stores the transform as the tween's target so it can be used for filtered operations - The end value to reachThe duration of the tween - - - Tweens a Transform's Z localScale to the given value. - Also stores the transform as the tween's target so it can be used for filtered operations - The end value to reachThe duration of the tween - - - Tweens a Transform's rotation so that it will look towards the given world position. - Also stores the transform as the tween's target so it can be used for filtered operations - The position to look atThe duration of the tween - Eventual axis constraint for the rotation - The vector that defines in which direction up is (default: Vector3.up) - - - EXPERIMENTAL Tweens a Transform's rotation so that it will look towards the given world position, - while also updating the lookAt position every frame - (contrary to which calculates the lookAt rotation only once, when the tween starts). - Also stores the transform as the tween's target so it can be used for filtered operations - The position to look atThe duration of the tween - Eventual axis constraint for the rotation - The vector that defines in which direction up is (default: Vector3.up) - - - Punches a Transform's localPosition towards the given direction and then back to the starting one - as if it was connected to the starting position via an elastic. - The direction and strength of the punch (added to the Transform's current position) - The duration of the tween - Indicates how much will the punch vibrate - Represents how much (0 to 1) the vector will go beyond the starting position when bouncing backwards. - 1 creates a full oscillation between the punch direction and the opposite direction, - while 0 oscillates only between the punch and the start position - If TRUE the tween will smoothly snap all values to integers - - - Punches a Transform's localScale towards the given size and then back to the starting one - as if it was connected to the starting scale via an elastic. - The punch strength (added to the Transform's current scale) - The duration of the tween - Indicates how much will the punch vibrate - Represents how much (0 to 1) the vector will go beyond the starting size when bouncing backwards. - 1 creates a full oscillation between the punch scale and the opposite scale, - while 0 oscillates only between the punch scale and the start scale - - - Punches a Transform's localRotation towards the given size and then back to the starting one - as if it was connected to the starting rotation via an elastic. - The punch strength (added to the Transform's current rotation) - The duration of the tween - Indicates how much will the punch vibrate - Represents how much (0 to 1) the vector will go beyond the starting rotation when bouncing backwards. - 1 creates a full oscillation between the punch rotation and the opposite rotation, - while 0 oscillates only between the punch and the start rotation - - - Shakes a Transform's localPosition with the given values. - The duration of the tween - The shake strength - Indicates how much will the shake vibrate - Indicates how much the shake will be random (0 to 180 - values higher than 90 kind of suck, so beware). - Setting it to 0 will shake along a single direction. - If TRUE the tween will smoothly snap all values to integers - If TRUE the shake will automatically fadeOut smoothly within the tween's duration, otherwise it will not - Randomness mode - - - Shakes a Transform's localPosition with the given values. - The duration of the tween - The shake strength on each axis - Indicates how much will the shake vibrate - Indicates how much the shake will be random (0 to 180 - values higher than 90 kind of suck, so beware). - Setting it to 0 will shake along a single direction. - If TRUE the tween will smoothly snap all values to integers - If TRUE the shake will automatically fadeOut smoothly within the tween's duration, otherwise it will not - Randomness mode - - - Shakes a Transform's localRotation. - The duration of the tween - The shake strength - Indicates how much will the shake vibrate - Indicates how much the shake will be random (0 to 180 - values higher than 90 kind of suck, so beware). - Setting it to 0 will shake along a single direction. - If TRUE the shake will automatically fadeOut smoothly within the tween's duration, otherwise it will not - Randomness mode - - - Shakes a Transform's localRotation. - The duration of the tween - The shake strength on each axis - Indicates how much will the shake vibrate - Indicates how much the shake will be random (0 to 180 - values higher than 90 kind of suck, so beware). - Setting it to 0 will shake along a single direction. - If TRUE the shake will automatically fadeOut smoothly within the tween's duration, otherwise it will not - Randomness mode - - - Shakes a Transform's localScale. - The duration of the tween - The shake strength - Indicates how much will the shake vibrate - Indicates how much the shake will be random (0 to 180 - values higher than 90 kind of suck, so beware). - Setting it to 0 will shake along a single direction. - If TRUE the shake will automatically fadeOut smoothly within the tween's duration, otherwise it will not - Randomness mode - - - Shakes a Transform's localScale. - The duration of the tween - The shake strength on each axis - Indicates how much will the shake vibrate - Indicates how much the shake will be random (0 to 180 - values higher than 90 kind of suck, so beware). - Setting it to 0 will shake along a single direction. - If TRUE the shake will automatically fadeOut smoothly within the tween's duration, otherwise it will not - Randomness mode - - - Tweens a Transform's position to the given value, while also applying a jump effect along the Y axis. - Returns a Sequence instead of a Tweener. - Also stores the transform as the tween's target so it can be used for filtered operations - The end value to reach - Power of the jump (the max height of the jump is represented by this plus the final Y offset) - Total number of jumps - The duration of the tween - If TRUE the tween will smoothly snap all values to integers - - - Tweens a Transform's localPosition to the given value, while also applying a jump effect along the Y axis. - Returns a Sequence instead of a Tweener. - Also stores the transform as the tween's target so it can be used for filtered operations - The end value to reach - Power of the jump (the max height of the jump is represented by this plus the final Y offset) - Total number of jumps - The duration of the tween - If TRUE the tween will smoothly snap all values to integers - - - Tweens a Transform's position through the given path waypoints, using the chosen path algorithm. - Also stores the transform as the tween's target so it can be used for filtered operations - The waypoints to go through - The duration of the tween - The type of path: Linear (straight path), CatmullRom (curved CatmullRom path) or CubicBezier (curved with control points) - The path mode: 3D, side-scroller 2D, top-down 2D - The resolution of the path (useless in case of Linear paths): higher resolutions make for more detailed curved paths but are more expensive. - Defaults to 10, but a value of 5 is usually enough if you don't have dramatic long curves between waypoints - The color of the path (shown when gizmos are active in the Play panel and the tween is running) - - - Tweens a Transform's localPosition through the given path waypoints, using the chosen path algorithm. - Also stores the transform as the tween's target so it can be used for filtered operations - The waypoint to go through - The duration of the tween - The type of path: Linear (straight path), CatmullRom (curved CatmullRom path) or CubicBezier (curved with control points) - The path mode: 3D, side-scroller 2D, top-down 2D - The resolution of the path: higher resolutions make for more detailed curved paths but are more expensive. - Defaults to 10, but a value of 5 is usually enough if you don't have dramatic long curves between waypoints - The color of the path (shown when gizmos are active in the Play panel and the tween is running) - - - IMPORTANT: Unless you really know what you're doing, you should use the overload that accepts a Vector3 array instead. - Tweens a Transform's position via the given path. - Also stores the transform as the tween's target so it can be used for filtered operations - The path to use - The duration of the tween - The path mode: 3D, side-scroller 2D, top-down 2D - - - IMPORTANT: Unless you really know what you're doing, you should use the overload that accepts a Vector3 array instead. - Tweens a Transform's localPosition via the given path. - Also stores the transform as the tween's target so it can be used for filtered operations - The path to use - The duration of the tween - The path mode: 3D, side-scroller 2D, top-down 2D - - - Tweens a Tween's timeScale to the given value. - Also stores the Tween as the tween's target so it can be used for filtered operations - The end value to reachThe duration of the tween - - - Tweens a Light's color to the given value, - in a way that allows other DOBlendableColor tweens to work together on the same target, - instead than fight each other as multiple DOColor would do. - Also stores the Light as the tween's target so it can be used for filtered operations - The value to tween toThe duration of the tween - - - Tweens a Material's color to the given value, - in a way that allows other DOBlendableColor tweens to work together on the same target, - instead than fight each other as multiple DOColor would do. - Also stores the Material as the tween's target so it can be used for filtered operations - The value to tween toThe duration of the tween - - - Tweens a Material's named color property to the given value, - in a way that allows other DOBlendableColor tweens to work together on the same target, - instead than fight each other as multiple DOColor would do. - Also stores the Material as the tween's target so it can be used for filtered operations - The value to tween to - The name of the material property to tween (like _Tint or _SpecColor) - The duration of the tween - - - Tweens a Material's named color property with the given ID to the given value, - in a way that allows other DOBlendableColor tweens to work together on the same target, - instead than fight each other as multiple DOColor would do. - Also stores the Material as the tween's target so it can be used for filtered operations - The value to tween to - The ID of the material property to tween (also called nameID in Unity's manual) - The duration of the tween - - - Tweens a Transform's position BY the given value (as if you chained a SetRelative), - in a way that allows other DOBlendableMove tweens to work together on the same target, - instead than fight each other as multiple DOMove would do. - Also stores the transform as the tween's target so it can be used for filtered operations - The value to tween byThe duration of the tween - If TRUE the tween will smoothly snap all values to integers - - - Tweens a Transform's localPosition BY the given value (as if you chained a SetRelative), - in a way that allows other DOBlendableMove tweens to work together on the same target, - instead than fight each other as multiple DOMove would do. - Also stores the transform as the tween's target so it can be used for filtered operations - The value to tween byThe duration of the tween - If TRUE the tween will smoothly snap all values to integers - - - EXPERIMENTAL METHOD - Tweens a Transform's rotation BY the given value (as if you chained a SetRelative), - in a way that allows other DOBlendableRotate tweens to work together on the same target, - instead than fight each other as multiple DORotate would do. - Also stores the transform as the tween's target so it can be used for filtered operations - The value to tween byThe duration of the tween - Rotation mode - - - EXPERIMENTAL METHOD - Tweens a Transform's lcoalRotation BY the given value (as if you chained a SetRelative), - in a way that allows other DOBlendableRotate tweens to work together on the same target, - instead than fight each other as multiple DORotate would do. - Also stores the transform as the tween's target so it can be used for filtered operations - The value to tween byThe duration of the tween - Rotation mode - - - Punches a Transform's localRotation BY the given value and then back to the starting one - as if it was connected to the starting rotation via an elastic. Does it in a way that allows other - DOBlendableRotate tweens to work together on the same target - The punch strength (added to the Transform's current rotation) - The duration of the tween - Indicates how much will the punch vibrate - Represents how much (0 to 1) the vector will go beyond the starting rotation when bouncing backwards. - 1 creates a full oscillation between the punch rotation and the opposite rotation, - while 0 oscillates only between the punch and the start rotation - - - Tweens a Transform's localScale BY the given value (as if you chained a SetRelative), - in a way that allows other DOBlendableScale tweens to work together on the same target, - instead than fight each other as multiple DOScale would do. - Also stores the transform as the tween's target so it can be used for filtered operations - The value to tween byThe duration of the tween - - - - Completes all tweens that have this target as a reference - (meaning tweens that were started from this target, or that had this target added as an Id) - and returns the total number of tweens completed - (meaning the tweens that don't have infinite loops and were not already complete) - - For Sequences only: if TRUE also internal Sequence callbacks will be fired, - otherwise they will be ignored - - - - Completes all tweens that have this target as a reference - (meaning tweens that were started from this target, or that had this target added as an Id) - and returns the total number of tweens completed - (meaning the tweens that don't have infinite loops and were not already complete) - - For Sequences only: if TRUE also internal Sequence callbacks will be fired, - otherwise they will be ignored - - - - Kills all tweens that have this target as a reference - (meaning tweens that were started from this target, or that had this target added as an Id) - and returns the total number of tweens killed. - - If TRUE completes the tween before killing it - - - - Kills all tweens that have this target as a reference - (meaning tweens that were started from this target, or that had this target added as an Id) - and returns the total number of tweens killed. - - If TRUE completes the tween before killing it - - - - Flips the direction (backwards if it was going forward or viceversa) of all tweens that have this target as a reference - (meaning tweens that were started from this target, or that had this target added as an Id) - and returns the total number of tweens flipped. - - - - - Flips the direction (backwards if it was going forward or viceversa) of all tweens that have this target as a reference - (meaning tweens that were started from this target, or that had this target added as an Id) - and returns the total number of tweens flipped. - - - - - Sends to the given position all tweens that have this target as a reference - (meaning tweens that were started from this target, or that had this target added as an Id) - and returns the total number of tweens involved. - - Time position to reach - (if higher than the whole tween duration the tween will simply reach its end) - If TRUE will play the tween after reaching the given position, otherwise it will pause it - - - - Sends to the given position all tweens that have this target as a reference - (meaning tweens that were started from this target, or that had this target added as an Id) - and returns the total number of tweens involved. - - Time position to reach - (if higher than the whole tween duration the tween will simply reach its end) - If TRUE will play the tween after reaching the given position, otherwise it will pause it - - - - Pauses all tweens that have this target as a reference - (meaning tweens that were started from this target, or that had this target added as an Id) - and returns the total number of tweens paused. - - - - - Pauses all tweens that have this target as a reference - (meaning tweens that were started from this target, or that had this target added as an Id) - and returns the total number of tweens paused. - - - - - Plays all tweens that have this target as a reference - (meaning tweens that were started from this target, or that had this target added as an Id) - and returns the total number of tweens played. - - - - - Plays all tweens that have this target as a reference - (meaning tweens that were started from this target, or that had this target added as an Id) - and returns the total number of tweens played. - - - - - Plays backwards all tweens that have this target as a reference - (meaning tweens that were started from this target, or that had this target added as an Id) - and returns the total number of tweens played. - - - - - Plays backwards all tweens that have this target as a reference - (meaning tweens that were started from this target, or that had this target added as an Id) - and returns the total number of tweens played. - - - - - Plays forward all tweens that have this target as a reference - (meaning tweens that were started from this target, or that had this target added as an Id) - and returns the total number of tweens played. - - - - - Plays forward all tweens that have this target as a reference - (meaning tweens that were started from this target, or that had this target added as an Id) - and returns the total number of tweens played. - - - - - Restarts all tweens that have this target as a reference - (meaning tweens that were started from this target, or that had this target added as an Id) - and returns the total number of tweens restarted. - - - - - Restarts all tweens that have this target as a reference - (meaning tweens that were started from this target, or that had this target added as an Id) - and returns the total number of tweens restarted. - - - - - Rewinds all tweens that have this target as a reference - (meaning tweens that were started from this target, or that had this target added as an Id) - and returns the total number of tweens rewinded. - - - - - Rewinds all tweens that have this target as a reference - (meaning tweens that were started from this target, or that had this target added as an Id) - and returns the total number of tweens rewinded. - - - - - Smoothly rewinds all tweens that have this target as a reference - (meaning tweens that were started from this target, or that had this target added as an Id) - and returns the total number of tweens rewinded. - - - - - Smoothly rewinds all tweens that have this target as a reference - (meaning tweens that were started from this target, or that had this target added as an Id) - and returns the total number of tweens rewinded. - - - - - Toggles the paused state (plays if it was paused, pauses if it was playing) of all tweens that have this target as a reference - (meaning tweens that were started from this target, or that had this target added as an Id) - and returns the total number of tweens involved. - - - - - Toggles the paused state (plays if it was paused, pauses if it was playing) of all tweens that have this target as a reference - (meaning tweens that were started from this target, or that had this target added as an Id) - and returns the total number of tweens involved. - - - - - This class serves only as a utility class to store tween settings to apply on multiple tweens. - It is in no way needed otherwise, since you can directly apply tween settings to a tween via chaining - - - - A variable you can eventually Clear and reuse when needed, - to avoid instantiating TweenParams objects - - - Creates a new TweenParams object, which you can use to store tween settings - to pass to multiple tweens via myTween.SetAs(myTweenParms) - - - Clears and resets this TweenParams instance using default values, - so it can be reused without instantiating another one - - - Sets the autoKill behaviour of the tween. - Has no effect if the tween has already started - If TRUE the tween will be automatically killed when complete - - - Sets an ID for the tween, which can then be used as a filter with DOTween's static methods. - The ID to assign to this tween. Can be an int, a string, an object or anything else. - - - Sets an ID for the tween, which can then be used as a filter with DOTween's static methods. - The ID to assign to this tween. Can be an int, a string, an object or anything else. - - - Sets an ID for the tween, which can then be used as a filter with DOTween's static methods. - The ID to assign to this tween. Can be an int, a string, an object or anything else. - - - Sets the target for the tween, which can then be used as a filter with DOTween's static methods. - IMPORTANT: use it with caution. If you just want to set an ID for the tween use SetId instead. - When using shorcuts the shortcut target is already assigned as the tween's target, - so using this method will overwrite it and prevent shortcut-operations like myTarget.DOPause from working correctly. - The target to assign to this tween. Can be an int, a string, an object or anything else. - - - Sets the looping options for the tween. - Has no effect if the tween has already started - Number of cycles to play (-1 for infinite - will be converted to 1 in case the tween is nested in a Sequence) - Loop behaviour type (default: LoopType.Restart) - - - Sets the ease of the tween. - If applied to Sequences eases the whole sequence animation - Eventual overshoot or amplitude to use with Back or Elastic easeType (default is 1.70158) - Eventual period to use with Elastic easeType (default is 0) - - - Sets the ease of the tween using an AnimationCurve. - If applied to Sequences eases the whole sequence animation - - - Sets the ease of the tween using a custom ease function. - If applied to Sequences eases the whole sequence animation - - - Sets the recycling behaviour for the tween. - If TRUE the tween will be recycled after being killed, otherwise it will be destroyed. - - - Sets the update type to the one defined in DOTween.defaultUpdateType (UpdateType.Normal unless changed) - and lets you choose if it should be independent from Unity's Time.timeScale - If TRUE the tween will ignore Unity's Time.timeScale - - - Sets the type of update (default or independent) for the tween - The type of update (default: UpdateType.Normal) - If TRUE the tween will ignore Unity's Time.timeScale - - - Sets the onStart callback for the tween. - Called the first time the tween is set in a playing state, after any eventual delay - - - Sets the onPlay callback for the tween. - Called when the tween is set in a playing state, after any eventual delay. - Also called each time the tween resumes playing from a paused state - - - Sets the onRewind callback for the tween. - Called when the tween is rewinded, - either by calling Rewind or by reaching the start position while playing backwards. - Rewinding a tween that is already rewinded will not fire this callback - - - Sets the onUpdate callback for the tween. - Called each time the tween updates - - - Sets the onStepComplete callback for the tween. - Called the moment the tween completes one loop cycle, even when going backwards - - - Sets the onComplete callback for the tween. - Called the moment the tween reaches its final forward position, loops included - - - Sets the onKill callback for the tween. - Called the moment the tween is killed - - - Sets the onWaypointChange callback for the tween. - Called when a path tween reaches a new waypoint - - - Sets a delayed startup for the tween. - Has no effect on Sequences or if the tween has already started - - - If isRelative is TRUE sets the tween as relative - (the endValue will be calculated as startValue + endValue instead than being used directly). - Has no effect on Sequences or if the tween has already started - - - If isSpeedBased is TRUE sets the tween as speed based - (the duration will represent the number of units the tween moves x second). - Has no effect on Sequences, nested tweens, or if the tween has already started - - - - Methods that extend Tween objects and allow to set their parameters - - - - Sets the autoKill behaviour of the tween to TRUE. - Has no effect if the tween has already started or if it's added to a Sequence - - - Sets the autoKill behaviour of the tween. - Has no effect if the tween has already started or if it's added to a Sequence - If TRUE the tween will be automatically killed when complete - - - Sets an ID for the tween (), which can then be used as a filter with DOTween's static methods. - The ID to assign to this tween. Can be an int, a string, an object or anything else. - - - Sets a string ID for the tween (), which can then be used as a filter with DOTween's static methods. - Filtering via string is 2X faster than using an object as an ID (using the alternate obejct overload) - The string ID to assign to this tween. - - - Sets an int ID for the tween (), which can then be used as a filter with DOTween's static methods. - Filtering via int is 4X faster than via object, 2X faster than via string (using the alternate object/string overloads) - The int ID to assign to this tween. - - - Allows to link this tween to a GameObject - so that it will be automatically killed when the GameObject is destroyed. - Has no effect if the tween is added to a Sequence - The link target (unrelated to the target set via SetTarget) - - - Allows to link this tween to a GameObject and assign a behaviour depending on it. - This will also automatically kill the tween when the GameObject is destroyed. - Has no effect if the tween is added to a Sequence - The link target (unrelated to the target set via SetTarget) - The behaviour to use ( is always evaluated even if you choose another one) - - - Sets the target for the tween, which can then be used as a filter with DOTween's static methods. - IMPORTANT: use it with caution. If you just want to set an ID for the tween use SetId instead. - When using shorcuts the shortcut target is already assigned as the tween's target, - so using this method will overwrite it and prevent shortcut-operations like myTarget.DOPause from working correctly. - The target to assign to this tween. Can be an int, a string, an object or anything else. - - - Sets the looping options for the tween. - Has no effect if the tween has already started - Number of cycles to play (-1 for infinite - will be converted to 1 in case the tween is nested in a Sequence) - - - Sets the looping options for the tween. - Has no effect if the tween has already started - Number of cycles to play (-1 for infinite - will be converted to 1 in case the tween is nested in a Sequence) - Loop behaviour type (default: LoopType.Restart) - - - Sets the ease of the tween. - If applied to Sequences eases the whole sequence animation - - - Sets the ease of the tween. - If applied to Sequences eases the whole sequence animation - - Eventual overshoot to use with Back or Flash ease (default is 1.70158 - 1 for Flash). - In case of Flash ease it must be an intenger and sets the total number of flashes that will happen. - Using an even number will complete the tween on the starting value, while an odd one will complete it on the end value. - - - - Sets the ease of the tween. - If applied to Sequences eases the whole sequence animation - Eventual amplitude to use with Elastic easeType or overshoot to use with Flash easeType (default is 1.70158 - 1 for Flash). - In case of Flash ease it must be an integer and sets the total number of flashes that will happen. - Using an even number will complete the tween on the starting value, while an odd one will complete it on the end value. - - Eventual period to use with Elastic or Flash easeType (default is 0). - In case of Flash ease it indicates the power in time of the ease, and must be between -1 and 1. - 0 is balanced, 1 weakens the ease with time, -1 starts the ease weakened and gives it power towards the end. - - - - Sets the ease of the tween using an AnimationCurve. - If applied to Sequences eases the whole sequence animation - - - Sets the ease of the tween using a custom ease function (which must return a value between 0 and 1). - If applied to Sequences eases the whole sequence animation - - - Allows the tween to be recycled after being killed. - - - Sets the recycling behaviour for the tween. - If TRUE the tween will be recycled after being killed, otherwise it will be destroyed. - - - Sets the update type to UpdateType.Normal and lets you choose if it should be independent from Unity's Time.timeScale - If TRUE the tween will ignore Unity's Time.timeScale - - - Sets the type of update for the tween - The type of update (defalt: UpdateType.Normal) - - - Sets the type of update for the tween and lets you choose if it should be independent from Unity's Time.timeScale - The type of update - If TRUE the tween will ignore Unity's Time.timeScale - - - EXPERIMENTAL: inverts this tween, so that it will play from the end to the beginning - (playing it backwards will actually play it from the beginning to the end). - Has no effect if the tween has already started or if it's added to a Sequence - - - EXPERIMENTAL: inverts this tween, so that it will play from the end to the beginning - (playing it backwards will actually play it from the beginning to the end). - Has no effect if the tween has already started or if it's added to a Sequence - If TRUE the tween will be inverted, otherwise it won't - - - Sets the onStart callback for the tween, clearing any previous onStart callback that was set. - Called the first time the tween is set in a playing state, after any eventual delay - - - Sets the onPlay callback for the tween, clearing any previous onPlay callback that was set. - Called when the tween is set in a playing state, after any eventual delay. - Also called each time the tween resumes playing from a paused state - - - Sets the onPause callback for the tween, clearing any previous onPause callback that was set. - Called when the tween state changes from playing to paused. - If the tween has autoKill set to FALSE, this is called also when the tween reaches completion. - - - Sets the onRewind callback for the tween, clearing any previous onRewind callback that was set. - Called when the tween is rewinded, - either by calling Rewind or by reaching the start position while playing backwards. - Rewinding a tween that is already rewinded will not fire this callback - - - Sets the onUpdate callback for the tween, clearing any previous onUpdate callback that was set. - Called each time the tween updates - - - Sets the onStepComplete callback for the tween, clearing any previous onStepComplete callback that was set. - Called the moment the tween completes one loop cycle, even when going backwards - - - Sets the onComplete callback for the tween, clearing any previous onComplete callback that was set. - Called the moment the tween reaches its final forward position, loops included - - - Sets the onKill callback for the tween, clearing any previous onKill callback that was set. - Called the moment the tween is killed - - - Sets the onWaypointChange callback for the tween, clearing any previous onWaypointChange callback that was set. - Called when a path tween's current waypoint changes - - - Sets the parameters of the tween (id, ease, loops, delay, timeScale, callbacks, etc) as the parameters of the given one. - Doesn't copy specific SetOptions settings: those will need to be applied manually each time. - Has no effect if the tween has already started. - NOTE: the tween's target will not be changed - Tween from which to copy the parameters - - - Sets the parameters of the tween (id, ease, loops, delay, timeScale, callbacks, etc) as the parameters of the given TweenParams. - Has no effect if the tween has already started. - TweenParams from which to copy the parameters - - - Adds the given tween to the end of the Sequence. - Has no effect if the Sequence has already started - The tween to append - - - Adds the given tween to the beginning of the Sequence, pushing forward the other nested content. - Has no effect if the Sequence has already started - The tween to prepend - - - Inserts the given tween at the same time position of the last tween, callback or interval added to the Sequence. - Note that, in case of a Join after an interval, the insertion time will be the time where the interval starts, not where it finishes. - Has no effect if the Sequence has already started - - - Inserts the given tween at the given time position in the Sequence, - automatically adding an interval if needed. - Has no effect if the Sequence has already started - The time position where the tween will be placed - The tween to insert - - - Adds the given interval to the end of the Sequence. - Has no effect if the Sequence has already started - The interval duration - - - Adds the given interval to the beginning of the Sequence, pushing forward the other nested content. - Has no effect if the Sequence has already started - The interval duration - - - Adds the given callback to the end of the Sequence. - Has no effect if the Sequence has already started - The callback to append - - - Adds the given callback to the beginning of the Sequence, pushing forward the other nested content. - Has no effect if the Sequence has already started - The callback to prepend - - - Inserts the given callback at the same time position of the last tween, callback or interval added to the Sequence. - Note that, in case of a Join after an interval, the insertion time will be the time where the interval starts, not where it finishes. - Has no effect if the Sequence has already started - /// <param name="callback">The callback to prepend</param> - - - Inserts the given callback at the given time position in the Sequence, - automatically adding an interval if needed. - Has no effect if the Sequence has already started - The time position where the callback will be placed - The callback to insert - - - Changes a TO tween into a FROM tween: sets the current target's position as the tween's endValue - then immediately sends the target to the previously set endValue. - - - Changes a TO tween into a FROM tween: sets the current target's position as the tween's endValue - then immediately sends the target to the previously set endValue. - If TRUE the FROM value will be calculated as relative to the current one - - - Changes a TO tween into a FROM tween: sets the current value of the target as the endValue, - and the previously passed endValue as the actual startValue. - If TRUE sets the target to from value immediately, otherwise waits for the tween to start - If TRUE the FROM value will be calculated as relative to the current one - - - Changes a TO tween into a FROM tween: sets the tween's starting value to the given one - and eventually sets the tween's target to that value immediately. - Value to start from - If TRUE sets the target to from value immediately, otherwise waits for the tween to start - If TRUE the FROM/TO values will be calculated as relative to the current ones - - - Changes a TO tween into a FROM tween: sets the tween's starting value to the given one - and eventually sets the tween's target to that value immediately. - Alpha value to start from (in case of Fade tweens) - If TRUE sets the target to from value immediately, otherwise waits for the tween to start - If TRUE the FROM/TO values will be calculated as relative to the current ones - - - Changes a TO tween into a FROM tween: sets the tween's starting value to the given one - and eventually sets the tween's target to that value immediately. - Value to start from (in case of Vector tweens that act on a single coordinate or scale tweens) - If TRUE sets the target to from value immediately, otherwise waits for the tween to start - If TRUE the FROM/TO values will be calculated as relative to the current ones - - - Changes a TO tween into a FROM tween: sets the tween's starting value to the given one - and eventually sets the tween's target to that value immediately. - Value to start from (in case of Vector tweens that act on a single coordinate or scale tweens) - If TRUE sets the target to from value immediately, otherwise waits for the tween to start - If TRUE the FROM/TO values will be calculated as relative to the current ones - - - Sets a delayed startup for the tween. - In case of Sequences behaves the same as , - which means the delay will repeat in case of loops (while with tweens it's ignored after the first loop cycle). - Has no effect if the tween has already started - - - EXPERIMENTAL: implemented in v1.2.340. - Sets a delayed startup for the tween with options to choose how the delay is applied in case of Sequences. - Has no effect if the tween has already started - Only used by types: If FALSE sets the delay as a one-time occurrence - (defaults to this for types), - otherwise as a Sequence interval which will repeat at the beginning of every loop cycle - - - Sets the tween as relative - (the endValue will be calculated as startValue + endValue instead than being used directly). - Has no effect on Sequences or if the tween has already started - - - If isRelative is TRUE sets the tween as relative - (the endValue will be calculated as startValue + endValue instead than being used directly). - Has no effect on Sequences or if the tween has already started - - - If isSpeedBased is TRUE sets the tween as speed based - (the duration will represent the number of units the tween moves x second). - Has no effect on Sequences, nested tweens, or if the tween has already started - - - If isSpeedBased is TRUE sets the tween as speed based - (the duration will represent the number of units the tween moves x second). - Has no effect on Sequences, nested tweens, or if the tween has already started - - - Options for float tweens - If TRUE the tween will smoothly snap all values to integers - - - Options for Vector2 tweens - If TRUE the tween will smoothly snap all values to integers - - - Options for Vector2 tweens - Selecting an axis will tween the vector only on that axis, leaving the others untouched - If TRUE the tween will smoothly snap all values to integers - - - Options for Vector3 tweens - If TRUE the tween will smoothly snap all values to integers - - - Options for Vector3 tweens - Selecting an axis will tween the vector only on that axis, leaving the others untouched - If TRUE the tween will smoothly snap all values to integers - - - Options for Vector4 tweens - If TRUE the tween will smoothly snap all values to integers - - - Options for Vector4 tweens - Selecting an axis will tween the vector only on that axis, leaving the others untouched - If TRUE the tween will smoothly snap all values to integers - - - Options for Quaternion tweens - If TRUE (default) the rotation will take the shortest route, and will not rotate more than 360°. - If FALSE the rotation will be fully accounted. Is always FALSE if the tween is set as relative - - - Options for Color tweens - If TRUE only the alpha value of the color will be tweened - - - Options for Vector4 tweens - If TRUE the tween will smoothly snap all values to integers - - - Options for Vector4 tweens - If TRUE, rich text will be interpreted correctly while animated, - otherwise all tags will be considered as normal text - The type of scramble to use, if any - 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 to use default ones - - - Options for Vector3Array tweens - If TRUE the tween will smoothly snap all values to integers - - - Options for Vector3Array tweens - If TRUE the tween will smoothly snap all values to integers - - - Options for ShapeCircle tweens - If TRUE the center you set in the DOTween.To method will be considered as relative - to the starting position of the target - If TRUE the tween will smoothly snap all values to integers - - - Options for Path tweens (created via the DOPath shortcut) - The eventual movement axis to lock. You can input multiple axis if you separate them like this: - AxisConstrain.X | AxisConstraint.Y - The eventual rotation axis to lock. You can input multiple axis if you separate them like this: - AxisConstrain.X | AxisConstraint.Y - - - Options for Path tweens (created via the DOPath shortcut) - If TRUE the path will be automatically closed - The eventual movement axis to lock. You can input multiple axis if you separate them like this: - AxisConstrain.X | AxisConstraint.Y - The eventual rotation axis to lock. You can input multiple axis if you separate them like this: - AxisConstrain.X | AxisConstraint.Y - - - Additional LookAt options for Path tweens (created via the DOPath shortcut). - Orients the target towards the given position. - Must be chained directly to the tween creation method or to a SetOptions - The position to look at - The eventual direction to consider as "forward". - If left to NULL defaults to the regular forward side of the transform - The vector that defines in which direction up is (default: Vector3.up) - - - Additional LookAt options for Path tweens (created via the DOPath shortcut). - Orients the target towards the given position with options to keep the Z rotation stable. - Must be chained directly to the tween creation method or to a SetOptions - The position to look at - If TRUE doesn't rotate the target along the Z axis - - - Additional LookAt options for Path tweens (created via the DOPath shortcut). - Orients the target towards another transform. - Must be chained directly to the tween creation method or to a SetOptions - The transform to look at - The eventual direction to consider as "forward". - If left to NULL defaults to the regular forward side of the transform - The vector that defines in which direction up is (default: Vector3.up) - - - Additional LookAt options for Path tweens (created via the DOPath shortcut). - Orients the target towards another transform with options to keep the Z rotation stable. - Must be chained directly to the tween creation method or to a SetOptions - The transform to look at - If TRUE doesn't rotate the target along the Z axis - - - Additional LookAt options for Path tweens (created via the DOPath shortcut). - Orients the target to the path, with the given lookAhead. - Must be chained directly to the tween creation method or to a SetOptions - The percentage of lookAhead to use (0 to 1) - The eventual direction to consider as "forward". - If left to NULL defaults to the regular forward side of the transform - The vector that defines in which direction up is (default: Vector3.up) - - - Additional LookAt options for Path tweens (created via the DOPath shortcut). - Orients the path with options to keep the Z rotation stable. - Must be chained directly to the tween creation method or to a SetOptions - The percentage of lookAhead to use (0 to 1) - If TRUE doesn't rotate the target along the Z axis - - - - Types of log behaviours - - - - Log only warnings and errors - - - Log warnings, errors and additional infos - - - Log only errors - - - - Indicates either a Tweener or a Sequence - - - - TimeScale for the tween - - - If TRUE the tween will play backwards - - - If TRUE the tween is completely inverted but without playing it backwards - (play backwards will actually play the tween in the original direction) - - - Object ID (usable for filtering with DOTween static methods). Can be anything except a string or an int - (use or for those) - - - String ID (usable for filtering with DOTween static methods). 2X faster than using an object id - - - Int ID (usable for filtering with DOTween static methods). 4X faster than using an object id, 2X faster than using a string id. - Default is -999 so avoid using an ID like that or it will capture all unset intIds - - - Tween target (usable for filtering with DOTween static methods). Automatically set by tween creation shortcuts - - - Called when the tween is set in a playing state, after any eventual delay. - Also called each time the tween resumes playing from a paused state - - - Called when the tween state changes from playing to paused. - If the tween has autoKill set to FALSE, this is called also when the tween reaches completion. - - - Called when the tween is rewinded, - either by calling Rewind or by reaching the start position while playing backwards. - Rewinding a tween that is already rewinded will not fire this callback - - - Called each time the tween updates - - - Called the moment the tween completes one loop cycle - - - Called the moment the tween reaches completion (loops included) - - - Called the moment the tween is killed - - - Called when a path tween's current waypoint changes - - - Tweeners-only (ignored by Sequences), returns TRUE if the tween was set as relative - - - - Set by SetTarget if DOTween's Debug Mode is on (see DOTween Utility Panel -> "Store GameObject's ID" debug option - - - - FALSE when tween is (or should be) despawned - set only by TweenManager - - - Gets and sets the time position (loops included, delays excluded) of the tween - - - Returns TRUE if the tween is set to loop (either a set number of times or infinitely) - - - TRUE after the tween was set in a play state at least once, AFTER any delay is elapsed - - - Time position within a single loop cycle - - - - Animates a single value - - - - Changes the start value of a tween and rewinds it (without pausing it). - Has no effect with tweens that are inside Sequences - The new start value - If bigger than 0 applies it as the new tween duration - - - Changes the end value of a tween and rewinds it (without pausing it). - Has no effect with tweens that are inside Sequences - The new end value - If bigger than 0 applies it as the new tween duration - If TRUE the start value will become the current target's value, otherwise it will stay the same - - - Changes the end value of a tween and rewinds it (without pausing it). - Has no effect with tweens that are inside Sequences - The new end value - If TRUE the start value will become the current target's value, otherwise it will stay the same - - - Changes the start and end value of a tween and rewinds it (without pausing it). - Has no effect with tweens that are inside Sequences - The new start value - The new end value - If bigger than 0 applies it as the new tween duration - - - - Used internally - - - - - Update type - - - - Updates every frame during Update calls - - - Updates every frame during LateUpdate calls - - - Updates using FixedUpdate calls - - - Updates using manual update calls - -
-
diff --git a/Assets/DOTween/DOTween.XML.meta b/Assets/DOTween/DOTween.XML.meta deleted file mode 100644 index 814057e..0000000 --- a/Assets/DOTween/DOTween.XML.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 619a29c7459169344b7a685b0b9ada64 -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/DOTween/DOTween.dll b/Assets/DOTween/DOTween.dll deleted file mode 100644 index 73235fc01a2d43cf393d9d7c897be3924bbbefeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 177664 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�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 - - - DOTweenEditor - - - - - Contains compatibility methods taken from DemiEditor (for when DOTween is without it) - - - - - Warning: some versions of this method don't have the includeInactive parameter so it won't be taken into account - - - - - Warning: some versions of this method don't have the includeInactive parameter so it won't be taken into account - - - - - Warning: some versions of this method don't have the includeInactive parameter so it won't be taken into account - - - - - Warning: some versions of this method don't have the includeInactive parameter so it won't be taken into account - - - - - Starts the update loop of tween in the editor. Has no effect during playMode. - - Eventual callback to call after every update - - - - Stops the update loop and clears the onPreviewUpdated callback. - - If TRUE also resets the tweened objects to their original state. - Note that this works by calling Rewind on all tweens, so it will work correctly - only if you have a single tween type per object and it wasn't killed - If TRUE also kills any cached tween - - - - Readies the tween for editor preview by setting its UpdateType to Manual plus eventual extra settings. - - The tween to ready - If TRUE (recommended) removes all callbacks (OnComplete/Rewind/etc) - If TRUE prevents the tween from being auto-killed at completion - If TRUE starts playing the tween immediately - - - Full major version + first minor version (ex: 2018.1f) - - - Major version - - - First minor version (ex: in 2018.1 it would be 1) - - - - Checks that the given editor texture use the correct import settings, - and applies them if they're incorrect. - - - - - Returns TRUE if setup is required - - - - - Returns TRUE if the file/directory at the given path exists. - - Path, relative to Unity's project folder - - - - - Converts the given project-relative path to a full path, - with backward (\) slashes). - - - - - Converts the given full path to a path usable with AssetDatabase methods - (relative to Unity's project folder, and with the correct Unity forward (/) slashes). - - - - - Connects to a asset. - If the asset already exists at the given path, loads it and returns it. - Otherwise, either returns NULL or automatically creates it before loading and returning it - (depending on the given parameters). - - Asset type - File path (relative to Unity's project folder) - If TRUE and the requested asset doesn't exist, forces its creation - - - - Full path for the given loaded assembly, assembly file included - - - - - Adds the given global define if it's not already present - - - - - Removes the given global define if it's present - - - - - Returns TRUE if the given global define is present in all the - or only in the given , depending on passed parameters. - - - to use. Leave NULL to check in all of them. - - - - Not used as menu item anymore, but as a utility function - - - - Full major version + first minor version (ex: 2018.1f) - - - Major version - - - First minor version (ex: in 2018.1 it would be 1) - - - diff --git a/Assets/DOTween/Editor/DOTweenEditor.XML.meta b/Assets/DOTween/Editor/DOTweenEditor.XML.meta deleted file mode 100644 index 2bf527a..0000000 --- a/Assets/DOTween/Editor/DOTweenEditor.XML.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 349bac8e4773b584b822ab83d3f94fef -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/DOTween/Editor/DOTweenEditor.dll b/Assets/DOTween/Editor/DOTweenEditor.dll deleted file mode 100644 index c2d87f934f951d96c83020e8dd51cc058c5ad46e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 70656 zcmce<34B|{wLd<(SH6EPXAMK3ZBR@JbiD@MCQXk3yl#14_g1d(O<2u4O0i zKJWkg3w-X`X6DS9nKR2BDQi!^M(9EaH~v2QNQejUq|b7OM+Rw#i)$Y$7T?K#s{R4j zny2bF4#X05BUZfMiVW5DMuvyu$+~UPI%{;eE;d}Zva7ppDBc%sEh_TOR#~rKCBzz+ zF6uvA6thcvQ8d&QxaJ8_=n}$^+{>GR*8yLSrw}EKYtn9Fkp28gLk>QDbg}$mQlqqU(h4I^~n1v%*U_zV<$C)wL9 z<>iw&nG}ITt}8lo5(zC+A2!2`OR^cN#-}_2oJT0~zi5XkEp|3anhMHR{;1U{vO7GREibRMoqu~{PJ@G?&yhcXKQb_ zt8B`~AZPV)CqfCQogjqG-o;qxXnTE?|sKy)R5#T%)Uqy!g zKW@LOsUnGL%t~itrpYizqpeO+JuyCsfB5l@Ia)=bP3zVRZUsXCG#G7!g&L_Kh`0U(JG>q?WTneyWG z2lC=%+8CwVqK#38$1dRv&@(6HGiyRV+87laE|AaoY|6SiRSaJ9OfAjN>J+9ACiz*N z!m5Z#epaW@5t!s>bqaBfNq$z-&^DT3W7#}SwBm_i>1U>SEhIjp+-yXd;c{cFiJl&s zxQ$SriOJcZ*_{$o+7!~#$6O4aRpvstnS%tTNdTkJFc*=aeWC!v-!P9Q!RSN*YHgTH zNO1o|0jg}6$C2Q#69uTPw8bqhf*q6VF&CD!cx63WT+L<+5`@D>FxN1wGYq3L*DB(g za1bS_%C!s&62qv@HH*0154N*s;2UyjV{n{2X~J(l6FuE%@dN@U)+C0ssK&&=1T(0Z z=q{it6~z|RnCMDiRw*Xh9aOcXxIJ`%p2#0rW*}Q;z{C>A;6kYKOi&qN)R_s&o9f5} zWgSMsA*d6q}5b(s|TVG>g%WE(AJYmBV zht+|38*hHqR}tM41RCek+2y z__S4s3Dk$!7z`DG1`-(JBGhE{l16Bzb%37%>!18Awt95p8`e|wv`%%45j|Y02U|VX zPk@ICtzXe2&wAA%c~?rbJeHK=VVLt#s<{Aw{4yPJBn*ec9yu-pzVd?d!tx?%BAJPx zB--%TjlUuMElvY)*Ya5n$gzNjV+2qzQxXoheDa#?^ZFb*6+^t$gm%(k3dy+X39;gT-a+f$&XwF82?FH zPdTGMU;s>%rA` zn!$EaqyMjK8an0(F_$Av*wq{~u_HCKbRA{h4qh4&$DN{t;ZlAC zOoUD&T@OykDCZ|HY|0NA(3*OIgmNghVM?U)6n}sVIb2%Q%dxmBXH&HBr&3hkcn5^O z(CkuSt^iix8C!`*7`|MEXUO9TnyZ1lpf|lBpmQSdmS4P3Tq+I)Q1Eowo%C>l%LUanPN~H^kyNWPHJT*cVXqc2bwc&< zVy&DU6e>3n#sJap0MTlIFaa>1p^qVgFgWO|p{BgBN24wjYQj1~;{Xp$e~SF?b2J6f z#+Dt8=BY3tMa>Yd;YUHBFjVOA?&H;lH+Wj1*MkF+x2SR4VIM!_nv&}SN78)fm!8-R zBDlpDYGu-hp9UK3O)i&2dgP zeF^>AYi@;h9hGiIfSpHKo7;f3Ot)@=g2!w2f-=#5zJ`6BAFh;z^B7o;RPepuI^HWr z5>aUQj5u06)P(g*Kgdxy+hq;_GptjfW5i>?<+weIxaJN(UiZyGUT8gk3W(ch6reF1 zAWOQ??F!E$CORoP7RID!;fu{&{uF88@x!Lsz?sBn5we`X3s2v0G%Ze)UpIZR+d=m zBoMu_5`?ZSae|XTW4TdVbT_UoKdVzAMe?&c6;>oa;bXVB9qmGx;-Zh_p41H+Qk zL|FzCGY+{LTRc_-EsP~w6c2MbWMB~v7D-Hu7{eSvS{h)63I7@ahAfWngoOKZR!pPT zFi{I5ZcRwXJS#@IZY2TCHJbNnE#6cs45ToeCdAxG={FI;U^h&RQlq&^(-R0SMiccR zHzJn&Xz>Jc3NCatYi1Hyqd5vVin_WQE8}MqClKF74?Vt{9>Mq?dbs1~;1P(A0h;Fm zG~Y){HAAlDv_Lac)-JLY{nck(OxQTEs{)5~vLTPx(-<~>>wc1@AoI}-XYc`Q{5;SF zo`44fIt^5gdGmar)mNTK<^?=fW4_9sCwd&ud90&ySd|{DJ%?50u}+@IGEXMcFF@XC zBercL2B4eb5?5*+#6B*&wn7zdSexuTP_AL^%uSGOPnxs@kxg&r;J3%jHv5 zxV^E)u;yo}8HTksOU*Q_SeB~IM-dJZaprypSzuUyaFB(DRaB5ErMAeh<~qn?!&>Da zr=cJRiFLqU2Z_bjgATIPuwHkNWrkH>m@TLrKFW{|7gO7}!oLV>{%0Z-D$A&WrvsSl z$ALele_6b1g?X*-{jyXiRIO z2W9!WEcSbajzx|MV?!Zdsq0XMj%m%)tUW_dZgumsNXlm#VBHT}G`Sq0*oYk5*sJUXigip;z8CASFBsu~^&sha_%KNJqFFBx|2)bJlo_GpQ43?A z#y)ImW?}qVlFct-qV~A>7eF>K!MgG5i1r)7(`dWy&qK8y_Pb@u>miy@;}bS~^wCEw zlSNYf7ZxA3{zIrrIchV_WquJ^g-e51QmZuv!1xjvw}i^4YDO9{^9|1z5Er-+>%H8D zx!$lnp#_^WW9f+i%?-34*?=c~f@w?+ZtJ_S(!2p>TE|UOJ0>dz46i5mfmv;+6^V0sY{8odaS;i6!A z9!Mj7G+=Xp37Hu)4w*NhSdORW&4i5r9AWs%#R_%DG_TW8Can|xg4k05Kj-9@ZbP9d z0*4LNJ{AWU8XU3_H_oK|GijYdwWbevCg>J;ta13q;2@MnaKrlj+AM?CfF2Lms@Auq zR&ETeZ$m+LQ@uRo@}w8rw&sMntRdEqDG9B(WI?phOi^jMDTv1c8Mw14Xq}oOb8=G< zj|JARCzgTeiQ)F|viXXW-a&^cM>mcRGO}3oU5a8IJo=+rOgC6JOuEATV zx|cmd%&W=b3yV^;DXKo?#>zJ24uo96G=hw~d9_)J2*wdvGrx>XI8GX39Q`7I{-CvB zjb|NK0s~TzTDJkKHRHDee+J7%^@jg-=95(hnE$4%-fJU?DO&y zR${_}4RjWPse=ytvhx~Mmh3XDe7_h8npnhR33*iv!8=gq4pn>n?tLtZBiz$LbWy0l z??!k+Q1>o)DWB5vII-%HUIyqppecDLOyr>}8&)sz;4ohRTPYI(SNcg8SQpd0>rb`A zn^>7^sjmZRYza1{z6RuwaSM_szKR5mX_C-n7%D%chflH|L!LN!sPG}$7-l#0T71kj zPXXTW)RRvhpV~h$Gc=HqKsLyXBy_4_kU=1P&8;#qq8838D4rl2{#d^t>xpl@mcjm+ z!755^>D&x9IDDuk&`KPX;<^PfzksxTjwW)x+%RDQkOAe+i77 zyr<{Fxi76(K1mHAky?WsZw1QW0`w}wY9eea-1$s{-Me||GD>8c5^>64T^bqDVUoc# z@9|+Ge^Rk*-b);LuRmhml!#LXYD;9s#F4%>#7^W~Mg8ooY~E+qmeiI^4DO6 z7F-qMBcg>`z^8|+HQiutURck=J4GtdycZx8)FulKK;V;X%B8jD87hGnnw*KT&%6&R zcM`X`wz2tiI{YzGpMg2b^lw8fed`wM$V>Q`-vLuYb??VBG>t0$UBdFrf5XFk03a`1 zpyw64%?F9^)qy<(EL^A|V3mlV`LM01A@j0%hPWLI@@i_gE|lGZ<%0P=O0YGUCI-lV z2kA4v4;cReK;jXA^d`ts1mcf^ERX*Xkm<_!V>TMVC-Eat@&B+{#@ORT|Cnf0%DrR` zN)M(9l_mTH5?KPqfjdPY7=HrHTrq-$J4JvE;QGgZO4(8pnFFGWJ4K*6{E9?upLV4>5P`j@U+PprngW^0@Avi^3tc1n1C`~ zqGUWLlGXk+DG{i2w9+%skz(r4+^OTwQaU1KhiNR}F5{6Mhr4~IxBREAI4%1Vd-vmK&`QV@`?V>JFtB&+1avVdQKmd0--bppyi_hcj( ztL_v54mPqo6Umk|#(xb(EHTNTT%)&9N&;MNWBfPJsoWBO9uH1DTsQWffpFZ8u>n8OU*?WEuO?G*@7dDuG0LgV#oypEJ>v(Dll^0SN zoL16-D`BfE{sI)zeN-y~(s78kPI5aH^?x!&8OC>VXx=A9n)^{XQXFVd3 zdg~d9G*~Z7WR~?FA!(ZY_+3p<`BXDsgty0s!PkQ3AR1g78v-FW!V4}0&Ogg5-Nk{pO_%e!?Zi3 z1>eI%W%4@2<{Je5ixsIR?DQ57&v>Cco(z@to6t%986aGodW#+&^KCp@0@~OpC8SX9 zP}Rn`+;!5*4G-M1tl{b({(V{EFG$0S3SMuR?|`&^1)EY7JXHF3N#}lmMwUy+iICeP zlN@0^Rh6mJUy&;8vt9?s{2S$cV)aB>xz!5}cQd&KA}!?rvbb$b!yZts^vKKBzvpCN zn12Vm$$EMc{~yeMC5P_`nEy=zE+h3G&;s*)K)jXQQk41tSeZNZPkQ8~KBR|{`WHQD z8GEa&tL$?V2F%}43ioVJ{1CLQis|+M`Us@tP0#SKLRP#vHqV-GV}7?(r}sIWC64nr z&n&~pWyn&S9D~8x{?vZ3UUgZ`n{Q&kQzsUOtu+E zW+&Qpm_$XgNPL^a7oXMslQ0ENtpDc^qhBfYtMIr2tIdf{{@!5{Rm()va|?O% zF#5P^MGl>jt6y5HYL!!onNq(Nk1IZxYt-VyB&w5%>M2ocZlW^}lc+%^nnj7O$VtRA z?G!CmCtFO;qnJDRqdCqUj(DaqPBWw&AM!Xv-x{8cxt-@M58smuO|ve7z2Db!`&9_x=V z9I@$;ZGTf}RlpYt87=lAu)NM5fSL82nPK5gjL#@`FL*||VO~a}k2RxK!G-q1aZyI1 zmUBAYcrY>q49pN?AtW_nx*>BZ@Ze%q@Hk8xqB*an-LX>OI$ElZ2|QD@!%zwjBEW^q z+~IuP3?sv)kViN19SJ*=q^NIiKqY%0b%bBTKl$FDxVjaC$@DAoBkTA5q(yWK&Y z8BxCl^F*45UdHt^-Ff{Ccg;%ZzM`Qum|8InW_sUxDIxf{$L1qvJ|k~w(5-cL`$<0c zCF@L^+0^VFTLAUCst-TMZMgXQ4Ttq(IPd7rC^4%k5-jW7O;V^!wXETbOxym%`^ zomaDb8Jaq=W|d^vVAFBHNBpd`Rx}Y^WnIb7YU>?-PPcZ> zA%2bZHa*i9AdAEzxGQ}LFod$*DPkEC?z5sM8vYnKjBi5SK2bPM!bOJ>-bli>sf9Uj z)Nbdv$a!BCJ7J98LsRo`xr~i{gUC5($#KF`)KF4NSgw?sOiBsMl~UtLDPg%%YDOs~ zELTbm$`wu#mMf*El~TfTrPRn$N?5Lxnp;W<%au|?OREUWk<#4e7CxQ7WZ>7*7eYl( zUj&%C7yy?)2@jZXm0>-GR!N;fwA??^;!>f0Ya|_Ry(x8gDALGGaT`vh zV=g^x6_26JbE;@<0<+RQ{;-KUnkOepQCnHtNy4pmSUYgxxdm<0;^X5UdJpUhn9B}Z z*7Z}B#UbQ5l5p>us;m_CEbCR$;XXE{4u>pv2s+%ur_|vPHj{L?pHHR3{+0K)m(Xgt z75(V<%xpkxpL{&B8o8-%_*bZgOHFhE!_jer&DMq-9o!A!>D@emT*VDay*Hd^ViGXu zvWT3opL9KXrJS!nNPQMAXbA<=^i0*EB;0;K8`@KSJqRbjH&B94R^6qKS;9 zes_+Tyw0mjDbC9glYcD=(^8ykHu>0^8Mei_c9Wkink;1MT*JxNJWoh*uI1!!p4Oxo z4&-ZyRa>g$AtmVRX#g!CP!6~8yOs{bO!{cn(XflXt>dikRX6Xa>06h~t6j!>1-bdQ zR@!I6FTni2qd8ufEz$_ZBkaVfAwvsn6#*HSU8Rr%Y zc(v)-$Je#+74Hi$t~~pocP{j_v2TLp??7^rmSR54Pz%%rKSEgMdx)Qc4G8ysjlX5< z3(fJk<;A9%xDZ1Ie+sS&`*n|XD^Xz>wINveLZu3>Sm@L)%mI*5)qc*ir><#(($< z7!{KrUyIB$mvwKEWv>G-u}4}ag)zEVpUg};vPJmNcGcq75BsOr8BjtuafarV9JQBL2N zc|$YV$A0fVX@&HDSPT06Xn``X-)pzQud}YDuBZCQ{i3JbRS1&%;y>|hqP{3Em*XN` zz?V&?nba86;+^=WSy8^~r;GC)tq{_~Mfnc@m*_2(`I9{FWzT26rgp&L`T6I7omA*$tmA1o&guL3_&n#-puhnPnwC!5Am&ZIQ!xDFUGWVIH@ zH)?#%>r$i!9z7JVn(pgU$D;bLp$>&lkiUQyw0@433epcsgc?&+Q*fnGT7Vp~F=Yh$y?KYeqV`|7=_xk|Fa+I3t zy5Be@bS4j@yGuG)hZ8z^|4%#j3s5_cj2=53W{eZaWy)0XPeZihbVZy&#HV9B#vjM1 zcNk^AL9cF+Z_x2LyouMci3DL1D#temwR5kV%A|=*ZH!W7Ok!f9Nx^aQVUYSQZzRaS z-;(Zy6X~J?w}pC9ZqX$KoLSTL1h#h^)3e*YkD!eaWzmHMzKf962nBH3%tE@5AWvU7 zCE}bBo?#2=Rsvs0m?|aRO30?pG^mu%MXMEyzvYljD<;#z4^AiiEeD?;`JPV%~x-{ynUKL%xK9lm!v!juY*u z(iqh!yab9=XEO<7+HR(lS%)~ZCpjR5U#p_(N+5eO_iQl#(r#`;<{D~y0~flFO6Vmc zBu%iu6Kpj+m8~;FvrVjkxfUzTD5ayXf*6d3iZv7C%fM?86Wz=(w?l6B1JEzru;B<5 zd`ELS+T%1gex48Qku~iv?GDovN+XF4gncx4@q*@0U}5hwK&A6YHRrV(6)CX7IRbgR16%&IH7f!NN{c?>t1S#&yK1~&+j1=Fx1{FbExbNfY z)AnVw2`37F%6bmkMKX94=36HnrN(!W+z5j8uMErjU><%-gnvbZ4{yw26dvBhKT8x^ zX9ebqkunvBXyup53rr3%#LVPY=H{O#0gHZ>#F1Yf|JqU3O_MxmU5#@B>CuFUMk zp$PK(IPIMuTjpb*AeUd;x$tGBBbPbl^(AMGvmIGZb$o$ZjmtQ75uX)Wq&(H!j!9fY z|9cgGXWV3iJ!>iVBBh_Ava_AUIwh-5-Q@}lI=e>afxeSy z?nubw)<<$zP4;3Uote0K(xaU4Jz_Zn5&um@P#&b{C5-i!|dzJsf_>#KT zr;f|ikp_XYj@dzBZO>{^x8|!~N|kNCoNUf^cnq4d89~cj<+BIDRfW@FcGfOCxUFAjwP=|0r75M#KEs;YsfsY1$^_%sgH>18qWp^%XNIl3JMoaE3)CkYRPKVQLdQnC-gR=9U;a#Hmgs8M&-)m zCmVRIO<64pKTfS|II@PaS`?U^7G?vLbzWABLKa{7QmX7HY${zG%(Cqwov)gJVw-g> zGO_jpaMTEvs|@#fVdwthq)XBmeVUYEcz*46EYPxmZjlhOq^9n4jWW9N}7uOp9S`g0xsL(`Y8 zn8JjhiAm?kru$b;kuJdLrZ&A9{-)oy((tA9y${Q!hbCSVd(XxXmf+J=jy)8@vOKqO ziyo{q!n_YN(R}jPYpj{8u#DP@AYtAHUa5=k5J)c0t0b3W6uv-M=xr%1bswq-qD;RV zzivgbE32EJ9E$KGS=j9P!pn>?95~=oK>!CsCBkMGd!}N0d&0%}QwhTJb^28#W9)9^ zC4acaZ;agwLY9j)oUcii6jUX-!($r9XgU$3H5)JXXcTtfFLY+*m1IADng-t`z%!W7 zPs7Ac(kKz3WwzXyAotkvnYnVAPrj0C_^}@zg6h12e?C!d=Yv6Rj&T~HXgqqii|K-X zJHW3yE2!sIkbgy_&+vSOEH3np-9yeW$;&5u*=ssO^Fs25M0^E_TWWM`W`>xi zTR4Q168ai@pt&`>Pj5ao^JBu_K%V$9;crsb)Q)*#8+!--k)s1YI7}TD?aux71Q=p1 zK+ZhU#;N%r;#MU0kJCU=x_G6LNy5L#5XS`S<3sFm>h>tFqx(}GE`h;}Pa*!!UeG$P z^_Y3bE;yDrd14Uo0lW;Fl@ek$UdSwN1>T*sV#ECj(l`S<)~&0-+te+-heMwd@MfL3 zsdFWsPlB$S2D)P~o~aYU%;p*2&CiFo#Rsm1^y30lIu;##Hvwh|41Iw&Ljr9emf*Pz zf9Tgd^k@iTYeaVk#ZmYx!XKr__K5#ThAdeZ5Niec7~+A_-!vGat&Ct^>BSAx#GYBi zZz=uRbVJ<8@LYy(%(_yukwi}%vXww z#Y5AH|9k&$8cIb|<7kN??wh$!GsN0jg6&l#y;B^o<16Y_yUPtR*7CFI{i36uEcaG< z8Uo@1kEg*W_H%Aq1?j&u^MhueI4E8z_KDwm34RIEfOv0)2ln(sCm?=NM`?dIm*C}d z2!`uPnugRTQiYW2vAS3AGl#|g-Q_-UEpqUQf#z3=4N+J|IxRKCc@U+Pist6gl7RRP zatMgR1`p~ouVi<5K#YcnGoX1I4vJ&Yx`w!k^FN4u{whuZ=dWS~;AU~^bdo+ljqLC6 z5iG4GU#(^jJU^T8qnYy?_TfF{r1NeG@xRG=UR+FdTrl0!aFpw9&h7Jl(mCYYrv=0- zEmXT7ux}S3|IK1Ox`j`iTtPLur-i(II(!}wc;N<{Z-!3{@nw`=Ebc@8#dxc7?My>h z+!h^kc9)lm4Ge!ijqrvb!7Bv8VYHM_ES^p|KUs4pEF9t*bH>3D!@v7m+W zU(`r>-VG`I!yc=vq1rt)n|e!v`@>e?0r65Zajw#+#Amtm8~ua}Zr@pR34gVS;4bbD zb84xr{}cB6gx*U0vtehc_;dr+eO3#>lhOJ<5uZi;_wz?f!0}RlxOkeUVY4_36MU)Y zZYXUk71J4B?k#OHL|yUE&~8Hf2LX&!7ycEB67hE9YxT!7=}-jyKZ0>_gV0gJUZ!p*s=kCzf{qtooj`pJx;k=s z6f3af#a-f7Q2<+>)Zj7K-H3;Nkfs? z1T;jru3DoHv0%PfsCNR+ZE_il#Cz3Gxfh8W ztCM+)#Mc4+;*{zw(46C;910k&^pI75F^F>y;CwMlk3i>njreEGAXqYuU|T-HpH&mQ z8b5CXk1;%sb>1!}{+DWre_9>EA2a?dhJRuxn13(h0mhGJ_?-&U|0(=)YC2MN$bD-1 z%>sgJ3kil8|2D&|41X?&FW`q$(~DaUp^lSl>Y7XTylFm$h`+38dqF^KW%yws;Xh*d znVEz?&G-mQZ)NCXxR&9?3}0cLuQU8UbAH2c7Q=fq$|qJs@JZ%;$nXHeFLA0%7=9bj zFaB1u1Msg^1dnUpQLsoHm_34?GtihUs26kLf0wu%{&b1C&F>(6%hU$!RV|r! zYI@P^eJEw#41)itCs;m>;17Y@IzP<21)PT%o?mqfJp8D*o#9u}MlNv|;9{{BBXisn)Yac zTMS|iC#fe2^2E`I+CqG`a&7&87I;LOsq@7}egnU{|2w9x_jmh^w{pq^9`eY@!AgHB>>=dy2Yq7EzaC_eizf;3Dcn zMQvkhBUZn#Ow`SKzMxnugB=;4wIx!yp_)Ep(LRjzjmD#de5 zUGM!@dB3Yl{7%Ze#T99Hm3UQBY<0DmH;>X?FRpI>?}BP^hoX`*{#7ttY@IJu-j-u+TOABX- zgG%$H>W^Hr#fM6^DL|Bttv9t%H1M=GTNE&Ly>|v=jiOY^!jLtJY9-q;qu?TY$IHBsvnbp=Xq5}#JoPNoJFbzLpVMisTGj;IS1^&^&Dt*Boxb(5lA zV`{&m{>9XH6?HdLk148*^L$28^O^dCq7GD0d2cA{_Ik1!@7UNc_tmE{{@z!zQ=o}1 zevFj$R6MQC5niUQ_X_VvE>lcXvY_{A%@mcA;uf1L9+#TpZx}~&#h(@Rk6=wJN&#u$HJg+SWnyyhfsG zmP=~I+^)hUVxFSjnX#$xIPpD2MdzMTxKylbCryf326l$0F|`+W{I?e_6aU8{>ktQ- zx?Y@vIME^grl@^PZS0_2GVW-%wsMWK-T)0k{pCV0JdY3r&WTMU&(|rd1 zeV|*{5cRm&f^~nF_*1u(o$jpwb=pQrJuv4Rh3m!OCP{6nIZ(JkJhE9*mjoXwJXLHw zO;Yn)DQU|Y;-oW3cD-l{{jBf|F@oCy)JC75eo#A8 z+^eV+h)ZV*v6W=ki&bd9GsSF04OKi>c&4b~?fzbIOUprRtN2qNY3>y*6~8OoDi%j2 zbwb{&g}vf?iW)C_qp(lR-Y#VYjqeuri?1u{3kClyJWHH3AY})AdeNZR8Y4>jEG`mE zNuR~VrA*2C#ld#3h^tM!JWJ>sGi$)uOY#Q$MR_JT1{LdP$ve~yV7rfkjGOkIduIN_o(ahyZ* z+zFcJiW8NlPrM+`6=_Aa3;I>bE104@mwLv<9T}} z<4{P$zJ~B!tbaK8C7m=IaX6)m3;4uoGKZv^xM^Cp+^75!m-&+o`|}9qnPgP}lYmRi z4iSEDV+n5499vmZ;ub})$|bJy$W)&MQl1;Vr0J~D8(jC-y_EC!xOP?}>D*kAh1h|@Tc60$!9Y2_z)gOdCy7ItElmZ)2 zcTJqh{MEI@IURM>1W9%AOE+-{*TlQ*NvS{EM^dSOxZcITv?zaXk?oOffmAc8?!SS@ zT%wk9?wdilY@-hLrz}Ob)K_cs#oBro_A@lMRRQ`i%GTn{U_Qe(hV2YH8J@y$3&RLt zg@`e}li_WE2L831we{8FG8f_d0ZrzV;H+Y!ZyBJcb~WIuo;85?H1vr1+O*;U(Wd>V zWl*$h&v-0EukU;IK)S8veDS;(DETb--^jm0?BV=R(axE9BWA15`M)e8+S>X%L`?g7 z@m+ui%I*?3h;JbB?G-<2d06Zhi(QW)=Rxyvu~Rz(E0Vq90r2-|t*y_B18j4f);8w_ zalUpPY`9FT$4+FwST_3=u~!RYFVv=;W4vr?U<#V6$>ql2zs`>S6uwCoQa%|g{GWjr#Pj-TEl+E0?8!5@za7wT^Sq+p!1yWB!+`(P zV}N;Xzw4)sMS!#!aG_>zkp|q5t1u(!aj!F2KjD9tV85>J8+7{tOp1*O$KmogZj7 zgR^JGTdpeiwQ~vHG?%1%1J6MJn}G`9cYUwqFYed%Pt{bQ+%Gl!1NbQLEm~~_&MEZw zaOyYTJ&JR~^HHM`(dK@>s^9gJYmv7s?(@?|uD+l4fuo3oZt1^&Zq- za>arK9}BkU6iCD%%{@;mz5;iHUak*Y#G;kpca)kj@p&6uaO zTFf$gwJwHt<7{!S_8vonIkz!h!ua6&2g|J_FUq8X!@7m+~DEt;Ic>?|Ub?Co~w7(2|V7vp|<%zl0A(GIn zTIivEUhdg1&Y5F+E^`kyv;ZF4umGGBaSFU&oQ^jN`^C-PW5N099O4AHFTLdLL zLWh@VJTCRTqc51*0T}VD2mI;G)0wj!X-}DM0bew8m*;@?!OX{TlXlnK#}P}fpY<+U zhg$Xqz^{6q7nQ}|^z3)jDuwHt?Nd8Std|0q{M*HSAyr zp3m@3XnMu{NbAMB)8*hl3r;C+&roh&*UMNs7rNd7EOBZ05`y1F{Bl>&S1c-B^8jmH zD*)?U>maRX>1kD7;N8ssG{au;LvVJ8H;Z1xTQmG?h%SP443{(9$}r9F zR)&u-e3ap1uFr|?;ujfzi6MTd2RXPH>e}bTL&f!sw==wu;a3=@b<(_*;iD3FkBRq- z9>H$jEO?ROOAK9kY!$g$W^uirr0ook5#JTR7JtHet;rR3#a+L5z2SNftFF&zztjFpdr$jF ztJF8^qxx6$d-U(?&+32GFLt}~9?APvUcOOo9BUkBoNTN&HXENYb{ZEL4;wEU4W0`< zmw9gXc(L#BW4s8wWitSO8pg&3??-&t>tRQWJ-HWeT#M*8+(f;$ph$>ITm=8lu$1A$ z60abBEU*Z09>dSfAdY_;!6o?wpR6W$O*QF^GQ6Rd@GW%&f5P~$8NSZY#ry+|2N^$x z;r$h)|J{1Zt(WoXUgG?{W(nZmst9&9FDdehCe*D2?}9b_=fRH6h5G3DyAbs&5f=f{ zza*Roz7NnVE=G+@#Ag99G?2oD+bkhsJQKuyer1p87z z4P(I%Jj}jr!C0YxF}nirDBNbj*#vfR8g_5f0T&>(CKlqK=GCyGuLnE^<4F^XL?hs_ zZ2My5t%)||s^R8K3*d3cNfS$v2SzF?sk0dRoM*Q83zc1tOHvD}Be|O^VYxvubzi;60DX|i}j`Os8@%tY2 zu9NlSU54I;=kwx=#y7P6_@_F)ojeOP96v^vv&>Czf^%ua75^BUZdOnn<({ z4z?!}(PU!THYIND?M=olBHKt?CYyicWb?)9(cxaa0a`aYI2hSB7zNt7YIt-gYAI^H z743`lMv^4ixGNeRUJ)4_+!pEG0lK|68H*1CSrbbnDdli-;R2cC0&!}T%vnH&h^1@e zeWQcXW#U9!#)=HCjBbw&M|;*p`y;)3dN!WCV5Qg?-JKk@qQLs2$)15oVr3VXwlOvo z9fWdw_u7@KRtr@4@WK^V6m}}jUMI03Iut+KmMAs&Pv)tF8Cn^z-il8wG|QOU#8rJU zRCr>VoLWp!$(A#Lt*VI9Ca{&ZbYx;;DHEA1Pi$4i$_!dJb&9TGT#FMct;nwKXmWIf zh_2zz;lv0x5|L8Z)0R%C>lvmGtKt(mlmHF0z#^q7^AWJL5>QQYK3atv!~MXiXW95rWH*goR7R;LHbf)61JKGyc>G1Ji~tR`-HIki2LnB74aR$S z08j2%uyWNfMTrG@CebG(BvE-gryOY$yeYPH)C#z^Pq9gIH(IgFYo0Ax^ zV#y3O8ngL*(e}~4SllKfPJ%kxT3AS9M_D9`=}g$Pvd|`D838#bsuCsR{ryxOaz4VJ zP>sezX9N5dBPRMHMpBlH4`a}r9gFVTG}4DK)F)(|L2C3_qGf`WvB+S&pOQr}e87#t zLEy#C0TJsHOAiY9hkWh9au z=pKwD1~$ewL`McAz0t|J#1hI=sLEt%CWpzQ2v2zHQN(1~h!v-iJhd>E=;}UA4zEcm zR}aP`N$JrOqY8;7R??X37>&WtYoo)XE8;^#kzouD2i`tHVM|aHK``AA-9-p>Bbpui zt@tR&wUHfmR9PEM4#Z`j>P)Ceqj)G+VSUlt9@u>FqRyJoN|~vkT@2tN9#oTqX?J%vJ=a!Mb8>UpTx$v zBD;n+NA`@w5n3~hlVVsES-k^$6bGGRBw|HZ?e1mc5Eajk?}*w;j z-6=+g6Xe!DTGL1lnVHN`Z-qIT ztiE`XR_tgp#hGgPtvqC>QU0+LZ0hVz?t$~SCGF_Zm&=fJlG?}?(KuZnp@5 z**1~1OL8WrS=>QWcv=yq^^KFMmbDvVy#o~B93pAeVAkkuNnSX~8epntvoe*3i4rHH zJCYJ#9UoR02f_>$8{Qt@7T>KBu>UAxtcwis80IH!0*AH@?y;FGu{fcPmt>IoFsV~p z3?WDkU^SAAPz0ido@8xu#3forM=ZF6ReDC`l137-gbF1BYsEeamtr$5(ilT9+(sNM zK%Kn|sMPRAWAFC)p08)x*R5~3r+xaGLzPj0@05bq}{#o zktlYeRuWs-K}nqyw_@kO#WpSD62(J-IViIu=tl6yAmFfxB|sv9IfIpC@Ml!UeMYI_ zXar&p%d}&Ha?)~b$edGY%fy(o*v{byFUzH1iapB2jf>ozh)7}x1#%j>Yo^-p*k_(H zW=%XkB6Xyp_6)^5H7AH9CB+t!^TBk`x&r%->_!T>T+en5V&66tTNB&H3e?ds|3$1= z1T!Xq!tV;-8_Nus)jsQ_B)1MN;mM=~V&hTR|+UbJA@MdJo5FtR9W@oJFv z4DCs5AGeKC-lH)G#jDYN>e5*aBtA8kpv7L6X9okG8>e7fk-q2<_M($TG|^(5B(O)G zEW}E2d#r!dV&6>`uZ$*ot=I_dud_l~H%_r3IvCl_SRyO8O~vHYH`<$=ELagA*<;1} z2OJ`_Z)B+5vLbt?QpaL!*db7{itIqy+hSN5I;7MlJOa6oAtFfvqd+2O)96&Y_ss6G z$3B?gL~@{t*l_P4mYnv$RRNC|=!meYb9ZBVCwex=h8dw?F{JRG0mRa%B^9L$oCMa|hz9y1Lc4A|_yK6flCufA|6>*I7AyggGY#hL0Odp0bTRsx$ zW1RA}adJp3AzO{~93g;~%9|tBFtImbjocd5&^V7|pQ( zOA)!}#=ym%PB}pBQYY@C&~|*nfg{YpLE1@fjJL1sAcRw8kUmtNiAdiz`$+>Rs~{I% z_I%{rcVzU?)$B2l;cd4wQN?bI+m_IpJ%evo=CM_g%%+$t;~=R7-VpQA5c^os}K7qW4LJi(nYwmaIlIo1bq)ou(sg_8*F9!>TRNFkNOOCw2=+(D9b z7iU7)n&@!9%3h(XhWiqmW8fjcT1kl}?2|2Q5g^%Q#U`Fg3(WI;JdK4+uZ43z3}_eav~!Iy;Y5=bT%8j`7>8NsV(5RIK%J+4^1KhLNnY#3F*8;L!=sGIh=xN> z+P;eI1XQSp^OD=qm~x2Q1nr7NM?5|ljSRD-caK8)Eo_b^?i$sCQ?8u^opcL(y2c46 zc^u9mzYh1c561e3sjXMWhaxeV^$ILeAa!ss+oHempiwBT8gPimrcfx0XQ+hD#@rC2 z&5S^t?xCY4J}gwW*+E6k*23Zi_Q$HxGAV+A`LT-RakX*GEs8`48+OTSBWJ~}3=zXP zvI)7O=l3Bti_*qumW}o0RD_kCYNK>yY%?fksFfj2PB?(3HA?Owi&LbI8!#2ndn;0= zvh8;dIHAXa77a-gOd`Xj!`U28EI|uLXiZ!@ipk4KdzO{En%FtARQYxceMY@|u(dGB z*c|lM-Y8CV zMazSVj?rXNd4YPCB6;ae#{-HUiI0qqI8>7uGTS1SgR@QMvjGtlN7t4*-232Ldu!U>{-qsGUYZpjCL~UhoC|99dKjU$t8f*N)J# zPbCf`l^N#hVE5inyLC#$3t67JK=k2{+O2)KcOWh+n|-B$cd6hd&>U0o5Xmr4CbLQu zy0cU-C+4N4Y#JG$;RU+VfPCpCGlD-hN`3KNpFo8!L}XLTH7i&nnG7)^)v-9jzG$VB zF+hH(X$T{L1Ait8@oRF`*BnfFAAu&C_%N!Nl~C7oykL?sI{U)Oj!1S>$;J>XMllf$ zDFT}=x7tm8L`-1ApQVuR?w9npcv*)hD%5!j~TJYi~?{gwye zHk*KIfv}rp^o+*TYxIOYb73FVKMeQc6))FPzRu{#yzWZS#z7w6WYVa$Su4LXj*oOl zt+QijY&%O^EH|Fm``U6|Dd0>*`Nj609QBC#>UM&#_28;WvSd8Do)&(6_Stm;p+1@O z-kZ-s)vh9e9bkgrh9%@~5o@=8bVJySno;+{Q7djK5QSmG2dzY^edDU#m>7{l8bUiJ z%7%`F5xW6GO2*VB+?^;z=XFWC_(m>+@V7+Sj3Qg(LxJX z`?M;7yFN7a^3hd7-TP1kMQUt6=s=e$#g}FV)pearL2_bq$YtehHcZV-NVNN5XQ7qw zzFQTB{rvWXpfFC0tHDTrLT=op+wAcuBD9(B&Kw3LIV{#haUr;oNFnay%S^wLCVui_G- z2d9+0|3g;TJYe5EXuAOo!gp$vSDZMFhRmUr6xjP8G(*neY%2vgl*EIb2By0Eq3Dfq z9CgcKpg1%v=;e$I4@klLQ3oS4NLJH6KbuO9oHZDgif0eLTopz4$RjdENkh;uX!UFY zYN;%PO_{*S*dotrRYLZ1HWO)>irI>dL(3%gWeK@7SVcEbXy>44yB9e4c36~aXShYZ z47X`D9_YBmX2~T2x4zAa^GY18L?_#{C`rf_bVBrjb7JhAp*Tk&M~mRtH5->W4RPr3 zkkS*5T@PN_5+xUa$V^@;;i3~FCf_ypDU$o8!l%A8C|5WfuQCHUNjCy8A@kgi$waQx zDAbWFah8ION|H!^%GCrNNy`m@I59G0qcB!Ay^^g*3o8_P(X9h{6rS1opoZY}(77b- zbMS74-gePgr592*n#_7YE?N0H6arOmvTOTxl$v{|fqkH^L1YbfawU$J{WwsOp;~g* zVrWau(Z+bsLWT6xR2ki#6|{Zzfj;D*Gs zgO#oQj-Mtwz63yLyYgnurrv4PEjz%2$q8mx|W3Doh&Eo!hzF30l}=r<%QZxQ2JG*r1#pU58bpy+WXssH!2O)VXkhZ-5Cl6>=JF zv_nH9)0rP`Vae^8gT|~we&A7rt__kdYuU4>TxQu!Ny$|x^>~GKqrwVR&Ym#ovV-?T z2M6Q31kTm70rjNlZZMo-jW|a-+)>Bnvd<FWGaiWu9~cPm@}s- zbq{ODl-egn2S+;MyV;d^^(|e>uk_$PfsAv?Ne83Hb%ll;;NP;v2B# z>Dw0X+oQVV$*zDe)}%sBR#8j;^iWCGlX{zV_KG!>|AR0C$VIxuH=ZL8IFCbV>759+IVMzu5Nc( ztA<996#^zq0D>=4tj0HrhVc!fF5JjJOGI%a9|Kry$8Fs`_-0WQKS;U>@))=<0a!ol zM{#F=s+0-Q37rV%62q;2q@QE!wL=0gILhe&ohfIQt>@H8{I6{37IFM?Vp6QdvyW^! zOc@jGXjzFeH;P@*kHX?sm3kE4xxza(&=J5P&TqRA3nyx?M|pARbi)G{JT-#SC#5-I z>NKm6C;6FdK4NCwujYu^F+Xgc&bHvp6-P0qd{=|07%Jz&_cr1$F?;u~3mj>{? zHu40%zOi;|I!E;N(8MxwTk5Es zcFrv?SN~)BRr-?uX>rbqe0BjiBpFny4Yz@_*aAy4X05nuBzxRwY@l*}K?I#b~BPZDGPD57Lp4utH=@PmN((FiUtK^_jc1MYwr zfe|=~9~|Hi7=eKV0RkL?1Coaea0r4R5BG3MoaFnurgyq$cPUD~^Etp#+Mns4s_Lrh zs_N?A85%Ft?{s;ZRZq3ot#7P)YN&Cm<{VXnZjT44g8Jrz+HZhs`zebDuAFG#mUJy0 z15MK%aDElvZfY5>;YL7oA8mL9naB-yKFOcQ4=Ppeca`dE#iP0C5NM!w;|F6g-lZLW zXN8-IG_O4X=frx-;|gB@Qc1y{0uIIh(29zi7K|@r?e>VXFIyOd1%@# zP`n5ewXEfSMUQL6hT9`hY@UJMA;OqNZ*pQB5L~(z61uLS%`%|D;pB;3<#1P{{?u5y zZgdJRb3mQO_-5fQu7SpR^cYa8@<*;nZDIy6iBfOz8c-qIimq!IpiGQ1N@#&^;QBVe zl6kQnHWi)1Br~p}EF~;fSx8qjj1{ypOdd$4H0lNk=xHs-KoCuBgyIO@h#1GM1 zwGM!iW&Bem^KC#!0CS3U*HJ6q-bN`}ZFl8%1iywf{TkOL{q{8PSHrh&qc-H&g4O}m zu$|yx1XF95F*7!;2B*`$ZfwtPFgDgT8(Z4X;HjtCZe!70H?|ayLu=jGYx`mn1haYtmgp>Am_zM@_?lhFiP|ZQVmvKdR$AD`UpQ$b1jqh}245Juo#rTExEwoxjd)#9Pa-h{kHcxwj zTd;JXs#0x)nj%Z1rp=>I9n8a!@UBaO1YNZ1uKzlLQ4Q!>%$a;p+x=4*;WEZ_OKaH) z%@I0u`kQ6l;sWaC@STqM6%31O)HMV&^q_3d{;={`C(;Y0D@F0AS-&K-sVI7?JmM9l+_se*>iUt z*X~qPu%TSfoAwINRpRw9I6DGca$c!K&n~Dl>JpYh2Ej@%j)G$JrK!7}s z){~$^wM!X;RimK>;|!=gkCrF#J^~B|a#}x$d88pHT()b@0gI}<-&hS?R(@rHZI>Oa zB7og*Ofubtoje)ERAI=?Adtbd8fw<^9MqE&sjf#ST_4Rd&8_Mj#rKJ%M0K5qS|i16 zuDe;ADbqb(MLQaQ)1!86^{AC~5em)V9N=QDQ4)w&Nl%K$D%Jf23X^K4pH*V@vr23I zmVnpomy~4sC8c^~WdxAd!DBPB+O;*ZTAA)~3ZuHgaV6ZVU0XfevNFs$lX_edpi zBU8F9SSV?7B7G@Ax%?b^axD=QJ!NsNldl`C4+EjXRBttm#Qy#3{b-fO_dHr90_ zORL1P)s_3DiW|?zIERy5Rik?5tB#??A&eCDTg%`X%`lB@j0_sh zEKKsYahUiql;cLLxVCDlKcCcz1bPb^s1-ehXk<76V+f2jlBBa^Mw8kw3NfFs`i_-! zo6`v(*9_8k5w5JRsY>*z14s%DLrBb1NTz|=?HK*3_{>*OQLbd@F@m6%6WR%jo{<7) zGEkC#oH~+`=U4=$_(o9=rm5aUn>A!VBm*KeO3Qt~PvzulS*W9jHg#05Sf>f!(yb&$ zp3~pgHSO%n(d@H0N&d1uGcKf-s>%$^9elSbH-7%6#vt-AkgjXG$QhB8$cPliC==)$ z*}66x#ArA&pggQ!*HC^-bD#awX{|0_!}U$*!EtbKP>=hjwZ}nvxeiNXO0MOoInuT< zRJy%ucqt?hnPH*e83Pd|S(T4e+>v6nrm%6DQz+B$^{XMCPiS(d#W> zrF@dI(kmF3NHi(gISfjvrAE5O#I5T%P32=GGgW(xsdZ7W2vlnfCtSvzuheOp60W6) zhwF$ztX*ZSgL+5oZPYHHR3crvW$IGO>jcNn3*au3-fZ2VeowltpnjhM9ErbWCyv^x zib9n-)uyq%jWUJ`D+y)Pvqj(_KbX|D$81B_u=a?iag>wVq>N#8Gl718xz}izho`Si zfDR@-X>4RqO(;2!vA?VnzhiI%ZQu!xPNUUHv}L;eEzl*iUblaakglPGb2AP7Vqj0R znz42zbp8xCbiX&+K$}<>u5id(((;rABO9V+ulsdd&L8Q$0I3qTSAC9QEQ4KMx&}_B zc_Y+fN{!LtlqNyz08X<-B_#9HA-a$Tv>LKyIvipbLn*KsS8%y1%1dQ80_OH2m#Lyc zVwj~Tx8fLAaQl%vEs_Sdm5?e&!LXi@r%=tsh)D@>xo@U1DH0RREn)da1G5a{<|V2l z`#M~9oCOy%sz0FAn8Z5TkWSqmv4Ts3 zNeUYSv2iP7Y#O&JV-z$y4uy3XIW5+}SEp5GhiL*(XsX36!GP{En5CqFv4Al#X0M?! z+4`-0-`Yoq@9v~|J={U7EA5V<1MWYX8vaxH$I!#u`UW^%RjHzvw+4$?>NjB zO;~nR2EJ;20i1o21|HuA^>>x~^Sxf4Jo2i4k=jYI>I`7H*>w#F>a8Cqk6E>+L9wxo zv`iG5*>W-hl&Q?v%y>=WpyybJHIm8J*aS&@;BGt7zz}i_7&w*>D2zZPW)VzcXE_Ej zDWhn;4mFg0AY&Yu2c-WOuV^AF5y5SYQ%nzA(^wFr**GJoWcgs&%#qVHF>4lU50s8w zqBJThw_fq18vHZ#GV;8kqX^en-3Ba?K`L&>Hzq?#zIoqtvtU`vZ`X3_)6?**hR#{H zTltcg?3U|L64x2nwHLtCJD{HnM`q47tS&dFqE6X89tIwBCJ9VLHg@(#XH!mW9_|FB z&GRUX$r6a2PJZX;=3&W(r5}Fec`hkfX}v*(RX_ z*63Sn8Kg|cjj>prERhi_qqLU)I_%QNKB+@y@_<}1D~yCr809irjp>EgrG#c0JC={s za%v`%m5idic`lYQ^7Ht|1P^BlV>QDgshdgk&frk5$~eq57lq?G(qtrNa=#mC>lAP? z7OrXPDHo!Q!oYR8R-Y8{iuq{ia|atco7vK`hK@4=*?+cLp__g9NQjq4j? zzxB(;ejawk*naw&hFCLMU!z}U&NtQ^vm0z`n@LLTl^nyMUM;M^qKp4>XQFCPXS{-~ zH`ZUlR@)YwD@glV+ga?Uq}CGw*-m3K@B=FNAg=F*F{c>*>C+9Bf1LynI&(Tdl9W!* zG}<;%Ib(GipcGh2s;nOjU?x;3z!<8^l?rRkqRs>>bdp@k)9E%!kjP?;bV*Bb#&QnE zxPC^mg3|;R5)3e`AS2dl2Sss8C1a3dECU%JEW$9ILQ8&EgAyGxfVhC`8&=>TX%5#6 z@(Ff!mYuzbH3rOVSj4DL7KFx#azn&+3f!*P$l$AOS%+otseKebG00N=P3=G>w8346 zH23c?DFB7Kj(=PYsZK7{S0NWBx75l-T+!{C@W)8qma&9tvOUWHjiIKIj!ECqY^PzC zk%OFuqB-Y3bzXwCEca{;OwZjh=#rWx$iu86&5D5WyVuib{Hm0V$64a8EVy3i2Yhe4 zWGfk=m(>iMJ|py3@O>QX0Vblj^~}?LnY!X0P;><`I#X!3z)Mw>)~YMhvfVmul?g<+ z?iPnf35fPlHd-<}M=^SCvkxK&VYYe!@A%axbeqSI>^+~Cwftp{&Y+!ysI@&G3zFTk zR{uQb0aLJCcfWmL|c!3urYCd2y{r*QkS^OQL5JdOXY%WM`%5qgf2_Y#{l|v>5FHwXTto z#!TAf9v`z$j3zq1Yutg*pv5|^uW*CQ21)(dc#p%5_9wxWN&S7fW656SPwPR7(aOdu zQo8X;-sZ42ih>MeyNw&i@a#=`cHOJ|S3RPvHT~rtQGOJB_HeSy%u?$fi`;PV+nei= zYN$aB2x%v12Yv+_^ls5sWlm+2mXmz;6_`Or8Z?V$r-I28x>`y4&_R+!H#?BJ5(zYT z&LultjUzB?2*xuPFx}l%{2NHBFm*yhAX|L0GjmfXTUc`$=94Ci22YN2?+1+Zh>zq^ zBtPMfmRWS303&sbyBR!5@WEXaG0)6zaO{N4tN{($x)Y}#Knb@SnZ%R{Ph-P=Z8Lozno(-2;^UN4i$YPEjrlOz8$CLGJP#yI5Tp(RvQl zNVYIYB9gCciBloDg0?=g6Jy<;9R!77?_cf(I+l%;{ivGl}kwt5MLhpY(HyLHj6W^by8gS}k`? z=y1$rxJS^NyPC7LwyK{ynXLa40bC{`DUB&kj0YEIHHEzOiSqj-BDc3&FbdZG+ALlo5@jTXr=NqMte%pliD z6!e1L5|+()s*N~gvtDzBE6TO3`!ND$%uN`EIokA8KHD41fq4cktjKD^rmgvuXq?z@&;mXjPd(@dO#WSH6PzOETU zyCzATr_kF(5yEgYDR^>$P^6t$Z#QlcOUA{kiw(OvIK9dr47wZ3ULP53Hjru6Q_BpN zm6+ip#YVx@R(l&c^)>1lW4ThB7$d%wxWV1*R;^`>gX2|w<{M3mL`zKDh;`(FEo1K` z-9;fG#;8$cHk?&A6@weX7DalzCt!nHUXK2yobdfoLm-;orF$%#}RE$Bq zbGuYM!+1y1aa1qag0+8XEfU}cu2=o31gm5*U6BZdAnRSYalaz)G#^QkJcAdNDm^S? z=KX6Zy#c#w!f%-$^|Rx6Ergb!RXhci%;eLkMs)LJzP+WuGBaROZd8%#Win}!gJ2$y zp=dob%uY37adE|fRKf?^eHk&~NhraPpH7yRf~=R&gx-y`a{}4skFXmoPzsXL=*s0+6#@9GP*t7)7}DhAAf2<(C12j$NefPDoiu zm<0?Kkr@@kcTN_wJtCgkU36j!4ssG1*xcx0a3v-ng-SRq!<2g7Q1j53DxVQmx}QzP z+2|-fgC;!;Lra$qC~Goh_|kLZfl}ZS=TIbMr-)z$&p&L#zo)>uVV&~iDvl?jh7sAm zg89wV8vF1hQEohnszYnuiVa;f>_yLuOg4+WEso`m|a7HME}g0eN|?UB^y~vikU$Y ze(9mq7k~4kYd=_j_vH5;|A&8UDgNP)RZHx7K@K}Zd3-6Acp37|FT^=7^n*fARH=F) zYojtR{>}4)Vy-V54x(W^12-y{s`(VS8pErqB$l#hL{_X#{vH>w_$ z|1Cu?n!=-Z{b)2A^$R{Ahhf;FJRe9v=xCvs^P@`~h#wNhXs+mmMb#39y}i9?=k>N1 zi|i9kh0$f*y|-#fN=xgBZ?3EZKAHZRdHMB~*Tk`zq^FvlqP2>b{k zO^BrWG4ul(TK!Z$exyGt@5|Lk^6?o(8v=VDX)pRvDnP(H#_7qBS%6w7NM9J>10vd? zz*w*g3N{)-BY`vQEEfEruT=RUzzdoK0)C7tmVla&A5iVEFV_mz2hdpPY#UX~_t>Ee z+EwcgL}(mU-pk2H*aqZiMbJS{sq!6mA)PB>YYZj-Dd$j2>`_xOIa;Ww`7Pu$sKyKn z1GLf;Ehy$gK=*@I%oq&0RQ*|7(K8@9TYu<A&>FXRK~SpxhhN0E z4*X$GdaR<htash_-g2|mK2R40}vk5J`Dl~0qZHqPA2r-Vv@!Jhb~%I8t#zTw8_q~IP*66pZbz`PH6aW5|y_xVw} z*Gj?z{OQtroqnMMZ1Xy#wxmBmf^OTR`*-T0-PZ#JKEDu_iZ!H!gg=thQN$bRYt>93 zb2?QEM)C;;Sh}~@4FbuzLBbAvzmVudP=p{W?*V0@ zbZ;=N%Q6Thq24ur`c zs00MK3ux%2(ANet=q$Ek=$K~Ft|@APNJqs;z^gz#Ywuzg=xVgJ0Cw8G z5wHWKK|8>F&RuFCGz^6K9f~@H{|Ui~c6Ju?6k6ryQRNrf_lT0ChxF@ci)+J#f1m@P z9%B~P^qAcE0#4*!nS3AR+d00ys(l1oN3+y`*#vV(*uih@Dvxg+$#=8~r3FRtMLVVs zXA&EN-6XD9C{359eZCPNhC4++Tbd3^)5O%#p*46a__KGWU)y%%pYHE)7l`ify4Tf{ zZnZ3+vfJDT8#l63XIyZY6&DV+xE-<)VHW=J2Q_bw>44icJ3M#m91kG34=6PrtlQ1l86ft;Bx*1$ENCL_a%^#OGb_IWDo~UqI?EY~58_f?ZJuLuDl)TZ&qF%SDq`H_m zVNz(fTPcd;Hfdqp+~V=g=Ns&}YGI)V9|04F`zaNoVZ6$Co%0KwG{K{^s|=iBIA9v_ z_95Ty=L&rxnoaTIQ+#=yU;eqEjc}m*!06FLe4Z1j}a?<7v_$^ zlK$7Ba&TcN{TMvyqI>-q7P@ww*P#L2qV_!PBt{~n&uIkVo@1dFUud}Bi6zD>>l7E6fK7PVNVu3ZMZ>?SM9@N&j&^L3wO#6;Bt&ldf=2WIV!c?e@Bdc2pif z_Ecwb7h1W2D1O63-BO{aTKQ;7 z<*DM(z(M{~Y5?8Rdp{4>Fb^ig#pbCTkC8a_w5Rs+p&{!HS|;~2jpgB3>WZgk>uz?Q zK&{>7_&}VL9Eg)g2AxPqI}j(&n>n$%cnh~ZUOo_CxP{yI&*P@AlXy_`>WNj{IaR4e zPkp-?8r)A+-z@&iW8v6${r9s={G|BgdylPEX^xCvPn-uU(&>nVA|JoxC(NJTXz8oM3q(WYi=~K%v|Tf56<)b~-5# z9hqL6`|W8wk8yE!ebKEMxV|t)+P-do--g1NzjydOHdpTFveizh89bD9WO?};~@PEKF6@Xh~FUL?~|5){~vl|pK&q+iZU-R{R_dCD)yXSsA=iKiWUaHS%xglyYZad)#h+<5;*}0 zNm4;#XNMU$Zj;|vsJ23aE-5O{$8uo1iN`?c(v%ev86gvrQJJtDUgxox^bsB@>w%Sv@Z{F3?7c1><;yj*g<&fQ;rHj}CCd5!B9uJ9iB}?8sX9 z0l}mbA`+6NSzvKr7orW|#Qq*|(_H8{K}SN-b6PMMr68BfK|728UnV4rbuENZG2Z=Z5Wu9k@Z ztFhSr_^u&Go2vR`!G?lmnDf^U%@^vc&8BfCWA&5;S^i0KcuQ?}kJ(Z3^ukf69xF;y zhTjIduJg}*jhXlo$g+|CIjkSftK3odtF^Ij{rKV$Cnn9$)I>`OWpR2BZvMLfc!?KG z`Ygj57^xT!Rkoeb;;a>--p1*pKcW45EApC=r9;lR-6-kL1bPPs&3JrJ`3>IVgWG}u zrp-R@PdWz2X;89OBJXFclQSuKH%hu+=km#Rb8S^yF>)=)yvW|npJ`O9bTXp9hsHlb znp{n43g)Eywa^bS0=L=}#fV_6`pc{T=00UOIql`_gv<&0h%GG1sFbh_*L zqP^;2G6HL$uEjx);7q^Pe;Vac1Sb6of8vi>KZaIU-M!xHLy7h)J?TTTtlXuy)v(S-r9V9I7cw) zBJ@dWbWCbJy!KBwxl~8X#1q??E z(FRaBcRnf^OG3xEWE{XiDJhYPVBV54Q*B2`fK%)r4bJp zv@(2PX=l*%^bG!@&}Ku`gi%4ta5WNM0#2BfuE7?N_gS0ljFV#0yW1U1N=~9Q$*7V9 zs*5|&bg|QQt;WLQDrER5jfAhm2W6wJag5au!96_|(2Th-DB`E<_rUdkM#GW4COG!3 z`K~-?KL;C^l|r|5RUE^pEPvtTLR^K!B04D#hpLNGOCz;*Z|Rx&7b{!rLVU{NI)eH5 zyg0@a6A$elUi>gA6@P$cWD53gSzVnTr*}j6sd4;47Sd19E6U{>QXP%UxLJ2^hjTS@ z6ZIq2+r)$@>IAiS(jN5U4r-m;p98e&wn5+}NTri*S7~M1@c0mh@Mz$FrSMzj$u5?< P00000NkvXXu0mjftl$Bl diff --git a/Assets/DOTween/Editor/Imgs/DOTweenIcon.png.meta b/Assets/DOTween/Editor/Imgs/DOTweenIcon.png.meta deleted file mode 100644 index 1d34582..0000000 --- a/Assets/DOTween/Editor/Imgs/DOTweenIcon.png.meta +++ /dev/null @@ -1,130 +0,0 @@ -fileFormatVersion: 2 -guid: 6b91addab459f7545ba3dcb7ca8ad792 -TextureImporter: - internalIDToNameTable: [] - externalObjects: {} - serializedVersion: 13 - mipmaps: - mipMapMode: 0 - enableMipMap: 1 - sRGBTexture: 1 - linearTexture: 0 - fadeOut: 0 - borderMipMap: 0 - mipMapsPreserveCoverage: 0 - alphaTestReferenceValue: 0.5 - mipMapFadeDistanceStart: 1 - mipMapFadeDistanceEnd: 3 - bumpmap: - convertToNormalMap: 0 - externalNormalMap: 0 - heightScale: 0.25 - normalMapFilter: 0 - flipGreenChannel: 0 - isReadable: 0 - streamingMipmaps: 0 - streamingMipmapsPriority: 0 - vTOnly: 0 - ignoreMipmapLimit: 0 - grayScaleToAlpha: 0 - generateCubemap: 6 - cubemapConvolution: 0 - seamlessCubemap: 0 - textureFormat: 1 - maxTextureSize: 2048 - textureSettings: - serializedVersion: 2 - filterMode: 1 - aniso: 1 - mipBias: 0 - wrapU: 0 - wrapV: 0 - wrapW: 0 - nPOTScale: 1 - lightmap: 0 - compressionQuality: 50 - spriteMode: 0 - spriteExtrude: 1 - spriteMeshType: 1 - alignment: 0 - spritePivot: {x: 0.5, y: 0.5} - spritePixelsToUnits: 100 - spriteBorder: {x: 0, y: 0, z: 0, w: 0} - spriteGenerateFallbackPhysicsShape: 1 - alphaUsage: 1 - alphaIsTransparency: 0 - spriteTessellationDetail: -1 - textureType: 0 - textureShape: 1 - singleChannelComponent: 0 - flipbookRows: 1 - flipbookColumns: 1 - maxTextureSizeSet: 0 - compressionQualitySet: 0 - textureFormatSet: 0 - ignorePngGamma: 0 - applyGammaDecoding: 0 - swizzle: 50462976 - cookieLightType: 0 - platformSettings: - - serializedVersion: 4 - buildTarget: DefaultTexturePlatform - maxTextureSize: 2048 - resizeAlgorithm: 0 - textureFormat: -1 - textureCompression: 1 - compressionQuality: 50 - crunchedCompression: 0 - allowsAlphaSplitting: 0 - overridden: 0 - ignorePlatformSupport: 0 - androidETC2FallbackOverride: 0 - forceMaximumCompressionQuality_BC6H_BC7: 0 - - serializedVersion: 4 - buildTarget: Standalone - maxTextureSize: 2048 - resizeAlgorithm: 0 - textureFormat: -1 - textureCompression: 1 - compressionQuality: 50 - crunchedCompression: 0 - allowsAlphaSplitting: 0 - overridden: 0 - ignorePlatformSupport: 0 - androidETC2FallbackOverride: 0 - forceMaximumCompressionQuality_BC6H_BC7: 0 - - serializedVersion: 4 - buildTarget: Android - maxTextureSize: 2048 - resizeAlgorithm: 0 - textureFormat: -1 - textureCompression: 1 - compressionQuality: 50 - crunchedCompression: 0 - allowsAlphaSplitting: 0 - overridden: 0 - ignorePlatformSupport: 0 - androidETC2FallbackOverride: 0 - forceMaximumCompressionQuality_BC6H_BC7: 0 - spriteSheet: - serializedVersion: 2 - sprites: [] - outline: [] - customData: - physicsShape: [] - bones: [] - spriteID: - internalID: 0 - vertices: [] - indices: - edges: [] - weights: [] - secondaryTextures: [] - spriteCustomMetadata: - entries: [] - nameFileIdTable: {} - mipmapLimitGroupName: - pSDRemoveMatte: 0 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/DOTween/Editor/Imgs/DOTweenMiniIcon.png b/Assets/DOTween/Editor/Imgs/DOTweenMiniIcon.png deleted file mode 100644 index 7cd74c1a26df1a45564c7a0e21c62d0ef3af2fd1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 319 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{!3Opi<85sBugD~Uq{1quc!H=FU zjv*3LlT#WP(iF^Cl2R3(u|Mi}s1fft&-^joZ3WZ(2Ug1Y!S$8-a*li}_21XqSnvJ# z@Y+`2=i8W`Zfg*cV81TuZmqUr`JI~8M}9x(m1v%HMLo`ySuokJ?%Vq7{C4$+ST-HH z5`RuO<@s#=8XoVy+lF)YEaxg?4vAr1(jlM1>Tx0PF<0}pFUf679a{7Ee==}5`qQz? zuIUa#(3byge21?t-^6oqTDwHc&iz0s`zDdQwtGKbESsPtIM1KwqFB4+nW=frYn!|7 zvs(U9y->(A=TFZ3t)>6Hv^;B{u+A(fd3smW;eIaTDS0KOITHVv7#gf%Y$mkMJ`MCd NgQu&X%Q~loCICTRfS>>X diff --git a/Assets/DOTween/Editor/Imgs/DOTweenMiniIcon.png.meta b/Assets/DOTween/Editor/Imgs/DOTweenMiniIcon.png.meta deleted file mode 100644 index 920b453..0000000 --- a/Assets/DOTween/Editor/Imgs/DOTweenMiniIcon.png.meta +++ /dev/null @@ -1,130 +0,0 @@ -fileFormatVersion: 2 -guid: 0e5e0a6c3ba204c45903041a4f43808f -TextureImporter: - internalIDToNameTable: [] - externalObjects: {} - serializedVersion: 13 - mipmaps: - mipMapMode: 0 - enableMipMap: 1 - sRGBTexture: 1 - linearTexture: 0 - fadeOut: 0 - borderMipMap: 0 - mipMapsPreserveCoverage: 0 - alphaTestReferenceValue: 0.5 - mipMapFadeDistanceStart: 1 - mipMapFadeDistanceEnd: 3 - bumpmap: - convertToNormalMap: 0 - externalNormalMap: 0 - heightScale: 0.25 - normalMapFilter: 0 - flipGreenChannel: 0 - isReadable: 0 - streamingMipmaps: 0 - streamingMipmapsPriority: 0 - vTOnly: 0 - ignoreMipmapLimit: 0 - grayScaleToAlpha: 0 - generateCubemap: 6 - cubemapConvolution: 0 - seamlessCubemap: 0 - textureFormat: 1 - maxTextureSize: 2048 - textureSettings: - serializedVersion: 2 - filterMode: 1 - aniso: 1 - mipBias: 0 - wrapU: 0 - wrapV: 0 - wrapW: 0 - nPOTScale: 1 - lightmap: 0 - compressionQuality: 50 - spriteMode: 0 - spriteExtrude: 1 - spriteMeshType: 1 - alignment: 0 - spritePivot: {x: 0.5, y: 0.5} - spritePixelsToUnits: 100 - spriteBorder: {x: 0, y: 0, z: 0, w: 0} - spriteGenerateFallbackPhysicsShape: 1 - alphaUsage: 1 - alphaIsTransparency: 0 - spriteTessellationDetail: -1 - textureType: 0 - textureShape: 1 - singleChannelComponent: 0 - flipbookRows: 1 - flipbookColumns: 1 - maxTextureSizeSet: 0 - compressionQualitySet: 0 - textureFormatSet: 0 - ignorePngGamma: 0 - applyGammaDecoding: 0 - swizzle: 50462976 - cookieLightType: 0 - platformSettings: - - serializedVersion: 4 - buildTarget: DefaultTexturePlatform - maxTextureSize: 2048 - resizeAlgorithm: 0 - textureFormat: -1 - textureCompression: 1 - compressionQuality: 50 - crunchedCompression: 0 - allowsAlphaSplitting: 0 - overridden: 0 - ignorePlatformSupport: 0 - androidETC2FallbackOverride: 0 - forceMaximumCompressionQuality_BC6H_BC7: 0 - - serializedVersion: 4 - buildTarget: Standalone - maxTextureSize: 2048 - resizeAlgorithm: 0 - textureFormat: -1 - textureCompression: 1 - compressionQuality: 50 - crunchedCompression: 0 - allowsAlphaSplitting: 0 - overridden: 0 - ignorePlatformSupport: 0 - androidETC2FallbackOverride: 0 - forceMaximumCompressionQuality_BC6H_BC7: 0 - - serializedVersion: 4 - buildTarget: Android - maxTextureSize: 2048 - resizeAlgorithm: 0 - textureFormat: -1 - textureCompression: 1 - compressionQuality: 50 - crunchedCompression: 0 - allowsAlphaSplitting: 0 - overridden: 0 - ignorePlatformSupport: 0 - androidETC2FallbackOverride: 0 - forceMaximumCompressionQuality_BC6H_BC7: 0 - spriteSheet: - serializedVersion: 2 - sprites: [] - outline: [] - customData: - physicsShape: [] - bones: [] - spriteID: - internalID: 0 - vertices: [] - indices: - edges: [] - weights: [] - secondaryTextures: [] - spriteCustomMetadata: - entries: [] - nameFileIdTable: {} - mipmapLimitGroupName: - pSDRemoveMatte: 0 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/DOTween/Editor/Imgs/Footer.png b/Assets/DOTween/Editor/Imgs/Footer.png deleted file mode 100644 index e29d02fe18b777b1d316feb647b339803c5126de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4409 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 diff --git a/Assets/DOTween/Editor/Imgs/Footer.png.meta b/Assets/DOTween/Editor/Imgs/Footer.png.meta deleted file mode 100644 index 4eb3ac6..0000000 --- a/Assets/DOTween/Editor/Imgs/Footer.png.meta +++ /dev/null @@ -1,130 +0,0 @@ -fileFormatVersion: 2 -guid: b675ca42bf0d83042b8553477e6b20b4 -TextureImporter: - internalIDToNameTable: [] - externalObjects: {} - serializedVersion: 13 - mipmaps: - mipMapMode: 0 - enableMipMap: 0 - sRGBTexture: 1 - linearTexture: 0 - fadeOut: 0 - borderMipMap: 0 - mipMapsPreserveCoverage: 0 - alphaTestReferenceValue: 0.5 - mipMapFadeDistanceStart: 1 - mipMapFadeDistanceEnd: 3 - bumpmap: - convertToNormalMap: 0 - externalNormalMap: 0 - heightScale: 0.25 - normalMapFilter: 0 - flipGreenChannel: 0 - isReadable: 0 - streamingMipmaps: 0 - streamingMipmapsPriority: 0 - vTOnly: 0 - ignoreMipmapLimit: 0 - grayScaleToAlpha: 0 - generateCubemap: 6 - cubemapConvolution: 0 - seamlessCubemap: 0 - textureFormat: 1 - maxTextureSize: 2048 - textureSettings: - serializedVersion: 2 - filterMode: 1 - aniso: 1 - mipBias: 0 - wrapU: 1 - wrapV: 1 - wrapW: 1 - nPOTScale: 0 - lightmap: 0 - compressionQuality: 50 - spriteMode: 0 - spriteExtrude: 1 - spriteMeshType: 1 - alignment: 0 - spritePivot: {x: 0.5, y: 0.5} - spritePixelsToUnits: 100 - spriteBorder: {x: 0, y: 0, z: 0, w: 0} - spriteGenerateFallbackPhysicsShape: 1 - alphaUsage: 1 - alphaIsTransparency: 1 - spriteTessellationDetail: -1 - textureType: 2 - textureShape: 1 - singleChannelComponent: 0 - flipbookRows: 1 - flipbookColumns: 1 - maxTextureSizeSet: 0 - compressionQualitySet: 0 - textureFormatSet: 0 - ignorePngGamma: 0 - applyGammaDecoding: 0 - swizzle: 50462976 - cookieLightType: 0 - platformSettings: - - serializedVersion: 4 - buildTarget: DefaultTexturePlatform - maxTextureSize: 256 - resizeAlgorithm: 0 - textureFormat: -1 - textureCompression: 0 - compressionQuality: 50 - crunchedCompression: 0 - allowsAlphaSplitting: 0 - overridden: 0 - ignorePlatformSupport: 0 - androidETC2FallbackOverride: 0 - forceMaximumCompressionQuality_BC6H_BC7: 0 - - serializedVersion: 4 - buildTarget: Standalone - maxTextureSize: 2048 - resizeAlgorithm: 0 - textureFormat: -1 - textureCompression: 1 - compressionQuality: 50 - crunchedCompression: 0 - allowsAlphaSplitting: 0 - overridden: 0 - ignorePlatformSupport: 0 - androidETC2FallbackOverride: 0 - forceMaximumCompressionQuality_BC6H_BC7: 0 - - serializedVersion: 4 - buildTarget: Android - maxTextureSize: 2048 - resizeAlgorithm: 0 - textureFormat: -1 - textureCompression: 1 - compressionQuality: 50 - crunchedCompression: 0 - allowsAlphaSplitting: 0 - overridden: 0 - ignorePlatformSupport: 0 - androidETC2FallbackOverride: 0 - forceMaximumCompressionQuality_BC6H_BC7: 0 - spriteSheet: - serializedVersion: 2 - sprites: [] - outline: [] - customData: - physicsShape: [] - bones: [] - spriteID: - internalID: 0 - vertices: [] - indices: - edges: [] - weights: [] - secondaryTextures: [] - spriteCustomMetadata: - entries: [] - nameFileIdTable: {} - mipmapLimitGroupName: - pSDRemoveMatte: 0 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/DOTween/Editor/Imgs/Footer_dark.png b/Assets/DOTween/Editor/Imgs/Footer_dark.png deleted file mode 100644 index e48db5ef7a2b83eff50d6e3b5fe9ba3bcd4a5015..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4429 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 TqmFO~00000NkvXXu0mjf{EM6C diff --git a/Assets/DOTween/Editor/Imgs/Footer_dark.png.meta b/Assets/DOTween/Editor/Imgs/Footer_dark.png.meta deleted file mode 100644 index 308d024..0000000 --- a/Assets/DOTween/Editor/Imgs/Footer_dark.png.meta +++ /dev/null @@ -1,130 +0,0 @@ -fileFormatVersion: 2 -guid: b744529a14333ff4aaf428f3586eb9d2 -TextureImporter: - internalIDToNameTable: [] - externalObjects: {} - serializedVersion: 13 - mipmaps: - mipMapMode: 0 - enableMipMap: 1 - sRGBTexture: 1 - linearTexture: 0 - fadeOut: 0 - borderMipMap: 0 - mipMapsPreserveCoverage: 0 - alphaTestReferenceValue: 0.5 - mipMapFadeDistanceStart: 1 - mipMapFadeDistanceEnd: 3 - bumpmap: - convertToNormalMap: 0 - externalNormalMap: 0 - heightScale: 0.25 - normalMapFilter: 0 - flipGreenChannel: 0 - isReadable: 0 - streamingMipmaps: 0 - streamingMipmapsPriority: 0 - vTOnly: 0 - ignoreMipmapLimit: 0 - grayScaleToAlpha: 0 - generateCubemap: 6 - cubemapConvolution: 0 - seamlessCubemap: 0 - textureFormat: 1 - maxTextureSize: 2048 - textureSettings: - serializedVersion: 2 - filterMode: 1 - aniso: 1 - mipBias: 0 - wrapU: 0 - wrapV: 0 - wrapW: 0 - nPOTScale: 1 - lightmap: 0 - compressionQuality: 50 - spriteMode: 0 - spriteExtrude: 1 - spriteMeshType: 1 - alignment: 0 - spritePivot: {x: 0.5, y: 0.5} - spritePixelsToUnits: 100 - spriteBorder: {x: 0, y: 0, z: 0, w: 0} - spriteGenerateFallbackPhysicsShape: 1 - alphaUsage: 1 - alphaIsTransparency: 0 - spriteTessellationDetail: -1 - textureType: 0 - textureShape: 1 - singleChannelComponent: 0 - flipbookRows: 1 - flipbookColumns: 1 - maxTextureSizeSet: 0 - compressionQualitySet: 0 - textureFormatSet: 0 - ignorePngGamma: 0 - applyGammaDecoding: 0 - swizzle: 50462976 - cookieLightType: 0 - platformSettings: - - serializedVersion: 4 - buildTarget: DefaultTexturePlatform - maxTextureSize: 2048 - resizeAlgorithm: 0 - textureFormat: -1 - textureCompression: 1 - compressionQuality: 50 - crunchedCompression: 0 - allowsAlphaSplitting: 0 - overridden: 0 - ignorePlatformSupport: 0 - androidETC2FallbackOverride: 0 - forceMaximumCompressionQuality_BC6H_BC7: 0 - - serializedVersion: 4 - buildTarget: Standalone - maxTextureSize: 2048 - resizeAlgorithm: 0 - textureFormat: -1 - textureCompression: 1 - compressionQuality: 50 - crunchedCompression: 0 - allowsAlphaSplitting: 0 - overridden: 0 - ignorePlatformSupport: 0 - androidETC2FallbackOverride: 0 - forceMaximumCompressionQuality_BC6H_BC7: 0 - - serializedVersion: 4 - buildTarget: Android - maxTextureSize: 2048 - resizeAlgorithm: 0 - textureFormat: -1 - textureCompression: 1 - compressionQuality: 50 - crunchedCompression: 0 - allowsAlphaSplitting: 0 - overridden: 0 - ignorePlatformSupport: 0 - androidETC2FallbackOverride: 0 - forceMaximumCompressionQuality_BC6H_BC7: 0 - spriteSheet: - serializedVersion: 2 - sprites: [] - outline: [] - customData: - physicsShape: [] - bones: [] - spriteID: - internalID: 0 - vertices: [] - indices: - edges: [] - weights: [] - secondaryTextures: [] - spriteCustomMetadata: - entries: [] - nameFileIdTable: {} - mipmapLimitGroupName: - pSDRemoveMatte: 0 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/DOTween/Editor/Imgs/Header.jpg b/Assets/DOTween/Editor/Imgs/Header.jpg deleted file mode 100644 index 4d710d719075150879b1ee76680af87791c4d3b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22787 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 QE#Li`lK-oJv9mh=KQ4fgsQ>@~ diff --git a/Assets/DOTween/Editor/Imgs/Header.jpg.meta b/Assets/DOTween/Editor/Imgs/Header.jpg.meta deleted file mode 100644 index 6976723..0000000 --- a/Assets/DOTween/Editor/Imgs/Header.jpg.meta +++ /dev/null @@ -1,130 +0,0 @@ -fileFormatVersion: 2 -guid: 6eb35f05a57f0f84eaf9071b132cfdd7 -TextureImporter: - internalIDToNameTable: [] - externalObjects: {} - serializedVersion: 13 - mipmaps: - mipMapMode: 0 - enableMipMap: 0 - sRGBTexture: 1 - linearTexture: 0 - fadeOut: 0 - borderMipMap: 0 - mipMapsPreserveCoverage: 0 - alphaTestReferenceValue: 0.5 - mipMapFadeDistanceStart: 1 - mipMapFadeDistanceEnd: 3 - bumpmap: - convertToNormalMap: 0 - externalNormalMap: 0 - heightScale: 0.25 - normalMapFilter: 0 - flipGreenChannel: 0 - isReadable: 0 - streamingMipmaps: 0 - streamingMipmapsPriority: 0 - vTOnly: 0 - ignoreMipmapLimit: 0 - grayScaleToAlpha: 0 - generateCubemap: 6 - cubemapConvolution: 0 - seamlessCubemap: 0 - textureFormat: 1 - maxTextureSize: 2048 - textureSettings: - serializedVersion: 2 - filterMode: 1 - aniso: 1 - mipBias: 0 - wrapU: 1 - wrapV: 1 - wrapW: 1 - nPOTScale: 0 - lightmap: 0 - compressionQuality: 50 - spriteMode: 0 - spriteExtrude: 1 - spriteMeshType: 1 - alignment: 0 - spritePivot: {x: 0.5, y: 0.5} - spritePixelsToUnits: 100 - spriteBorder: {x: 0, y: 0, z: 0, w: 0} - spriteGenerateFallbackPhysicsShape: 1 - alphaUsage: 1 - alphaIsTransparency: 1 - spriteTessellationDetail: -1 - textureType: 2 - textureShape: 1 - singleChannelComponent: 0 - flipbookRows: 1 - flipbookColumns: 1 - maxTextureSizeSet: 0 - compressionQualitySet: 0 - textureFormatSet: 0 - ignorePngGamma: 0 - applyGammaDecoding: 0 - swizzle: 50462976 - cookieLightType: 0 - platformSettings: - - serializedVersion: 4 - buildTarget: DefaultTexturePlatform - maxTextureSize: 512 - resizeAlgorithm: 0 - textureFormat: -1 - textureCompression: 0 - compressionQuality: 50 - crunchedCompression: 0 - allowsAlphaSplitting: 0 - overridden: 0 - ignorePlatformSupport: 0 - androidETC2FallbackOverride: 0 - forceMaximumCompressionQuality_BC6H_BC7: 0 - - serializedVersion: 4 - buildTarget: Standalone - maxTextureSize: 2048 - resizeAlgorithm: 0 - textureFormat: -1 - textureCompression: 1 - compressionQuality: 50 - crunchedCompression: 0 - allowsAlphaSplitting: 0 - overridden: 0 - ignorePlatformSupport: 0 - androidETC2FallbackOverride: 0 - forceMaximumCompressionQuality_BC6H_BC7: 0 - - serializedVersion: 4 - buildTarget: Android - maxTextureSize: 2048 - resizeAlgorithm: 0 - textureFormat: -1 - textureCompression: 1 - compressionQuality: 50 - crunchedCompression: 0 - allowsAlphaSplitting: 0 - overridden: 0 - ignorePlatformSupport: 0 - androidETC2FallbackOverride: 0 - forceMaximumCompressionQuality_BC6H_BC7: 0 - spriteSheet: - serializedVersion: 2 - sprites: [] - outline: [] - customData: - physicsShape: [] - bones: [] - spriteID: - internalID: 0 - vertices: [] - indices: - edges: [] - weights: [] - secondaryTextures: [] - spriteCustomMetadata: - entries: [] - nameFileIdTable: {} - mipmapLimitGroupName: - pSDRemoveMatte: 0 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/DOTween/Modules/DOTweenModuleAudio.cs b/Assets/DOTween/Modules/DOTweenModuleAudio.cs deleted file mode 100644 index d958ae0..0000000 --- a/Assets/DOTween/Modules/DOTweenModuleAudio.cs +++ /dev/null @@ -1,198 +0,0 @@ -// Author: Daniele Giardini - http://www.demigiant.com -// Created: 2018/07/13 - -#if true // MODULE_MARKER -using System; -using DG.Tweening.Core; -using DG.Tweening.Plugins.Options; -using UnityEngine; -using UnityEngine.Audio; // Required for AudioMixer - -#pragma warning disable 1591 -namespace DG.Tweening -{ - public static class DOTweenModuleAudio - { - #region Shortcuts - - #region Audio - - /// Tweens an AudioSource's volume to the given value. - /// Also stores the AudioSource as the tween's target so it can be used for filtered operations - /// The end value to reach (0 to 1)The duration of the tween - public static TweenerCore DOFade(this AudioSource target, float endValue, float duration) - { - if (endValue < 0) endValue = 0; - else if (endValue > 1) endValue = 1; - TweenerCore t = DOTween.To(() => target.volume, x => target.volume = x, endValue, duration); - t.SetTarget(target); - return t; - } - - /// Tweens an AudioSource's pitch to the given value. - /// Also stores the AudioSource as the tween's target so it can be used for filtered operations - /// The end value to reachThe duration of the tween - public static TweenerCore DOPitch(this AudioSource target, float endValue, float duration) - { - TweenerCore t = DOTween.To(() => target.pitch, x => target.pitch = x, endValue, duration); - t.SetTarget(target); - return t; - } - - #endregion - - #region AudioMixer - - /// Tweens an AudioMixer's exposed float to the given value. - /// Also stores the AudioMixer as the tween's target so it can be used for filtered operations. - /// Note that you need to manually expose a float in an AudioMixerGroup in order to be able to tween it from an AudioMixer. - /// Name given to the exposed float to set - /// The end value to reachThe duration of the tween - public static TweenerCore DOSetFloat(this AudioMixer target, string floatName, float endValue, float duration) - { - TweenerCore t = DOTween.To(()=> { - float currVal; - target.GetFloat(floatName, out currVal); - return currVal; - }, x=> target.SetFloat(floatName, x), endValue, duration); - t.SetTarget(target); - return t; - } - - #region Operation Shortcuts - - /// - /// Completes all tweens that have this target as a reference - /// (meaning tweens that were started from this target, or that had this target added as an Id) - /// and returns the total number of tweens completed - /// (meaning the tweens that don't have infinite loops and were not already complete) - /// - /// For Sequences only: if TRUE also internal Sequence callbacks will be fired, - /// otherwise they will be ignored - public static int DOComplete(this AudioMixer target, bool withCallbacks = false) - { - return DOTween.Complete(target, withCallbacks); - } - - /// - /// Kills all tweens that have this target as a reference - /// (meaning tweens that were started from this target, or that had this target added as an Id) - /// and returns the total number of tweens killed. - /// - /// If TRUE completes the tween before killing it - public static int DOKill(this AudioMixer target, bool complete = false) - { - return DOTween.Kill(target, complete); - } - - /// - /// Flips the direction (backwards if it was going forward or viceversa) of all tweens that have this target as a reference - /// (meaning tweens that were started from this target, or that had this target added as an Id) - /// and returns the total number of tweens flipped. - /// - public static int DOFlip(this AudioMixer target) - { - return DOTween.Flip(target); - } - - /// - /// Sends to the given position all tweens that have this target as a reference - /// (meaning tweens that were started from this target, or that had this target added as an Id) - /// and returns the total number of tweens involved. - /// - /// Time position to reach - /// (if higher than the whole tween duration the tween will simply reach its end) - /// If TRUE will play the tween after reaching the given position, otherwise it will pause it - public static int DOGoto(this AudioMixer target, float to, bool andPlay = false) - { - return DOTween.Goto(target, to, andPlay); - } - - /// - /// Pauses all tweens that have this target as a reference - /// (meaning tweens that were started from this target, or that had this target added as an Id) - /// and returns the total number of tweens paused. - /// - public static int DOPause(this AudioMixer target) - { - return DOTween.Pause(target); - } - - /// - /// Plays all tweens that have this target as a reference - /// (meaning tweens that were started from this target, or that had this target added as an Id) - /// and returns the total number of tweens played. - /// - public static int DOPlay(this AudioMixer target) - { - return DOTween.Play(target); - } - - /// - /// Plays backwards all tweens that have this target as a reference - /// (meaning tweens that were started from this target, or that had this target added as an Id) - /// and returns the total number of tweens played. - /// - public static int DOPlayBackwards(this AudioMixer target) - { - return DOTween.PlayBackwards(target); - } - - /// - /// Plays forward all tweens that have this target as a reference - /// (meaning tweens that were started from this target, or that had this target added as an Id) - /// and returns the total number of tweens played. - /// - public static int DOPlayForward(this AudioMixer target) - { - return DOTween.PlayForward(target); - } - - /// - /// Restarts all tweens that have this target as a reference - /// (meaning tweens that were started from this target, or that had this target added as an Id) - /// and returns the total number of tweens restarted. - /// - public static int DORestart(this AudioMixer target) - { - return DOTween.Restart(target); - } - - /// - /// Rewinds all tweens that have this target as a reference - /// (meaning tweens that were started from this target, or that had this target added as an Id) - /// and returns the total number of tweens rewinded. - /// - public static int DORewind(this AudioMixer target) - { - return DOTween.Rewind(target); - } - - /// - /// Smoothly rewinds all tweens that have this target as a reference - /// (meaning tweens that were started from this target, or that had this target added as an Id) - /// and returns the total number of tweens rewinded. - /// - public static int DOSmoothRewind(this AudioMixer target) - { - return DOTween.SmoothRewind(target); - } - - /// - /// Toggles the paused state (plays if it was paused, pauses if it was playing) of all tweens that have this target as a reference - /// (meaning tweens that were started from this target, or that had this target added as an Id) - /// and returns the total number of tweens involved. - /// - public static int DOTogglePause(this AudioMixer target) - { - return DOTween.TogglePause(target); - } - - #endregion - - #endregion - - #endregion - } -} -#endif diff --git a/Assets/DOTween/Modules/DOTweenModuleAudio.cs.meta b/Assets/DOTween/Modules/DOTweenModuleAudio.cs.meta deleted file mode 100644 index 518bdc7..0000000 --- a/Assets/DOTween/Modules/DOTweenModuleAudio.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: 4702391d9345d634681a92c11ea2ca42 \ No newline at end of file diff --git a/Assets/DOTween/Modules/DOTweenModuleEPOOutline.cs b/Assets/DOTween/Modules/DOTweenModuleEPOOutline.cs deleted file mode 100644 index 2ab3775..0000000 --- a/Assets/DOTween/Modules/DOTweenModuleEPOOutline.cs +++ /dev/null @@ -1,146 +0,0 @@ -using UnityEngine; - -#if false || EPO_DOTWEEN // MODULE_MARKER - -using EPOOutline; -using DG.Tweening.Plugins.Options; -using DG.Tweening; -using DG.Tweening.Core; - -namespace DG.Tweening -{ - public static class DOTweenModuleEPOOutline - { - public static int DOKill(this SerializedPass target, bool complete) - { - return DOTween.Kill(target, complete); - } - - public static TweenerCore DOFloat(this SerializedPass target, string propertyName, float endValue, float duration) - { - var tweener = DOTween.To(() => target.GetFloat(propertyName), x => target.SetFloat(propertyName, x), endValue, duration); - tweener.SetOptions(true).SetTarget(target); - return tweener; - } - - public static TweenerCore DOFade(this SerializedPass target, string propertyName, float endValue, float duration) - { - var tweener = DOTween.ToAlpha(() => target.GetColor(propertyName), x => target.SetColor(propertyName, x), endValue, duration); - tweener.SetOptions(true).SetTarget(target); - return tweener; - } - - public static TweenerCore DOColor(this SerializedPass target, string propertyName, Color endValue, float duration) - { - var tweener = DOTween.To(() => target.GetColor(propertyName), x => target.SetColor(propertyName, x), endValue, duration); - tweener.SetOptions(false).SetTarget(target); - return tweener; - } - - public static TweenerCore DOVector(this SerializedPass target, string propertyName, Vector4 endValue, float duration) - { - var tweener = DOTween.To(() => target.GetVector(propertyName), x => target.SetVector(propertyName, x), endValue, duration); - tweener.SetOptions(false).SetTarget(target); - return tweener; - } - - public static TweenerCore DOFloat(this SerializedPass target, int propertyId, float endValue, float duration) - { - var tweener = DOTween.To(() => target.GetFloat(propertyId), x => target.SetFloat(propertyId, x), endValue, duration); - tweener.SetOptions(true).SetTarget(target); - return tweener; - } - - public static TweenerCore DOFade(this SerializedPass target, int propertyId, float endValue, float duration) - { - var tweener = DOTween.ToAlpha(() => target.GetColor(propertyId), x => target.SetColor(propertyId, x), endValue, duration); - tweener.SetOptions(true).SetTarget(target); - return tweener; - } - - public static TweenerCore DOColor(this SerializedPass target, int propertyId, Color endValue, float duration) - { - var tweener = DOTween.To(() => target.GetColor(propertyId), x => target.SetColor(propertyId, x), endValue, duration); - tweener.SetOptions(false).SetTarget(target); - return tweener; - } - - public static TweenerCore DOVector(this SerializedPass target, int propertyId, Vector4 endValue, float duration) - { - var tweener = DOTween.To(() => target.GetVector(propertyId), x => target.SetVector(propertyId, x), endValue, duration); - tweener.SetOptions(false).SetTarget(target); - return tweener; - } - - public static int DOKill(this Outlinable.OutlineProperties target, bool complete = false) - { - return DOTween.Kill(target, complete); - } - - public static int DOKill(this Outliner target, bool complete = false) - { - return DOTween.Kill(target, complete); - } - - /// - /// Controls the alpha (transparency) of the outline - /// - public static TweenerCore DOFade(this Outlinable.OutlineProperties target, float endValue, float duration) - { - var tweener = DOTween.ToAlpha(() => target.Color, x => target.Color = x, endValue, duration); - tweener.SetOptions(true).SetTarget(target); - return tweener; - } - - /// - /// Controls the color of the outline - /// - public static TweenerCore DOColor(this Outlinable.OutlineProperties target, Color endValue, float duration) - { - var tweener = DOTween.To(() => target.Color, x => target.Color = x, endValue, duration); - tweener.SetOptions(false).SetTarget(target); - return tweener; - } - - /// - /// Controls the amount of blur applied to the outline - /// - public static TweenerCore DOBlurShift(this Outlinable.OutlineProperties target, float endValue, float duration, bool snapping = false) - { - var tweener = DOTween.To(() => target.BlurShift, x => target.BlurShift = x, endValue, duration); - tweener.SetOptions(snapping).SetTarget(target); - return tweener; - } - - /// - /// Controls the amount of blur applied to the outline - /// - public static TweenerCore DOBlurShift(this Outliner target, float endValue, float duration, bool snapping = false) - { - var tweener = DOTween.To(() => target.BlurShift, x => target.BlurShift = x, endValue, duration); - tweener.SetOptions(snapping).SetTarget(target); - return tweener; - } - - /// - /// Controls the amount of dilation applied to the outline - /// - public static TweenerCore DODilateShift(this Outlinable.OutlineProperties target, float endValue, float duration, bool snapping = false) - { - var tweener = DOTween.To(() => target.DilateShift, x => target.DilateShift = x, endValue, duration); - tweener.SetOptions(snapping).SetTarget(target); - return tweener; - } - - /// - /// Controls the amount of dilation applied to the outline - /// - public static TweenerCore DODilateShift(this Outliner target, float endValue, float duration, bool snapping = false) - { - var tweener = DOTween.To(() => target.DilateShift, x => target.DilateShift = x, endValue, duration); - tweener.SetOptions(snapping).SetTarget(target); - return tweener; - } - } -} -#endif diff --git a/Assets/DOTween/Modules/DOTweenModuleEPOOutline.cs.meta b/Assets/DOTween/Modules/DOTweenModuleEPOOutline.cs.meta deleted file mode 100644 index ff5fa1d..0000000 --- a/Assets/DOTween/Modules/DOTweenModuleEPOOutline.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: 216b83d657d96d44487cfbf4354eb0b7 \ No newline at end of file diff --git a/Assets/DOTween/Modules/DOTweenModulePhysics.cs b/Assets/DOTween/Modules/DOTweenModulePhysics.cs deleted file mode 100644 index 08b0700..0000000 --- a/Assets/DOTween/Modules/DOTweenModulePhysics.cs +++ /dev/null @@ -1,216 +0,0 @@ -// Author: Daniele Giardini - http://www.demigiant.com -// Created: 2018/07/13 - -#if true // MODULE_MARKER -using System; -using DG.Tweening.Core; -using DG.Tweening.Core.Enums; -using DG.Tweening.Plugins; -using DG.Tweening.Plugins.Core.PathCore; -using DG.Tweening.Plugins.Options; -using UnityEngine; - -#pragma warning disable 1591 -namespace DG.Tweening -{ - public static class DOTweenModulePhysics - { - #region Shortcuts - - #region Rigidbody - - /// Tweens a Rigidbody's position to the given value. - /// Also stores the rigidbody as the tween's target so it can be used for filtered operations - /// The end value to reachThe duration of the tween - /// If TRUE the tween will smoothly snap all values to integers - public static TweenerCore DOMove(this Rigidbody target, Vector3 endValue, float duration, bool snapping = false) - { - TweenerCore t = DOTween.To(() => target.position, target.MovePosition, endValue, duration); - t.SetOptions(snapping).SetTarget(target); - return t; - } - - /// Tweens a Rigidbody's X position to the given value. - /// Also stores the rigidbody as the tween's target so it can be used for filtered operations - /// The end value to reachThe duration of the tween - /// If TRUE the tween will smoothly snap all values to integers - public static TweenerCore DOMoveX(this Rigidbody target, float endValue, float duration, bool snapping = false) - { - TweenerCore t = DOTween.To(() => target.position, target.MovePosition, new Vector3(endValue, 0, 0), duration); - t.SetOptions(AxisConstraint.X, snapping).SetTarget(target); - return t; - } - - /// Tweens a Rigidbody's Y position to the given value. - /// Also stores the rigidbody as the tween's target so it can be used for filtered operations - /// The end value to reachThe duration of the tween - /// If TRUE the tween will smoothly snap all values to integers - public static TweenerCore DOMoveY(this Rigidbody target, float endValue, float duration, bool snapping = false) - { - TweenerCore t = DOTween.To(() => target.position, target.MovePosition, new Vector3(0, endValue, 0), duration); - t.SetOptions(AxisConstraint.Y, snapping).SetTarget(target); - return t; - } - - /// Tweens a Rigidbody's Z position to the given value. - /// Also stores the rigidbody as the tween's target so it can be used for filtered operations - /// The end value to reachThe duration of the tween - /// If TRUE the tween will smoothly snap all values to integers - public static TweenerCore DOMoveZ(this Rigidbody target, float endValue, float duration, bool snapping = false) - { - TweenerCore t = DOTween.To(() => target.position, target.MovePosition, new Vector3(0, 0, endValue), duration); - t.SetOptions(AxisConstraint.Z, snapping).SetTarget(target); - return t; - } - - /// Tweens a Rigidbody's rotation to the given value. - /// Also stores the rigidbody as the tween's target so it can be used for filtered operations - /// The end value to reachThe duration of the tween - /// Rotation mode - public static TweenerCore DORotate(this Rigidbody target, Vector3 endValue, float duration, RotateMode mode = RotateMode.Fast) - { - TweenerCore t = DOTween.To(() => target.rotation, target.MoveRotation, endValue, duration); - t.SetTarget(target); - t.plugOptions.rotateMode = mode; - return t; - } - - /// Tweens a Rigidbody's rotation so that it will look towards the given position. - /// Also stores the rigidbody as the tween's target so it can be used for filtered operations - /// The position to look atThe duration of the tween - /// Eventual axis constraint for the rotation - /// The vector that defines in which direction up is (default: Vector3.up) - public static TweenerCore DOLookAt(this Rigidbody target, Vector3 towards, float duration, AxisConstraint axisConstraint = AxisConstraint.None, Vector3? up = null) - { - TweenerCore t = DOTween.To(() => target.rotation, target.MoveRotation, towards, duration) - .SetTarget(target).SetSpecialStartupMode(SpecialStartupMode.SetLookAt); - t.plugOptions.axisConstraint = axisConstraint; - t.plugOptions.up = (up == null) ? Vector3.up : (Vector3)up; - return t; - } - - #region Special - - /// Tweens a Rigidbody's position to the given value, while also applying a jump effect along the Y axis. - /// Returns a Sequence instead of a Tweener. - /// Also stores the Rigidbody as the tween's target so it can be used for filtered operations - /// The end value to reach - /// Power of the jump (the max height of the jump is represented by this plus the final Y offset) - /// Total number of jumps - /// The duration of the tween - /// If TRUE the tween will smoothly snap all values to integers - public static Sequence DOJump(this Rigidbody target, Vector3 endValue, float jumpPower, int numJumps, float duration, bool snapping = false) - { - if (numJumps < 1) numJumps = 1; - float startPosY = 0; - float offsetY = -1; - bool offsetYSet = false; - Sequence s = DOTween.Sequence(); - Tween yTween = DOTween.To(() => target.position, target.MovePosition, new Vector3(0, jumpPower, 0), duration / (numJumps * 2)) - .SetOptions(AxisConstraint.Y, snapping).SetEase(Ease.OutQuad).SetRelative() - .SetLoops(numJumps * 2, LoopType.Yoyo) - .OnStart(() => startPosY = target.position.y); - s.Append(DOTween.To(() => target.position, target.MovePosition, new Vector3(endValue.x, 0, 0), duration) - .SetOptions(AxisConstraint.X, snapping).SetEase(Ease.Linear) - ).Join(DOTween.To(() => target.position, target.MovePosition, new Vector3(0, 0, endValue.z), duration) - .SetOptions(AxisConstraint.Z, snapping).SetEase(Ease.Linear) - ).Join(yTween) - .SetTarget(target).SetEase(DOTween.defaultEaseType); - yTween.OnUpdate(() => { - if (!offsetYSet) { - offsetYSet = true; - offsetY = s.isRelative ? endValue.y : endValue.y - startPosY; - } - Vector3 pos = target.position; - pos.y += DOVirtual.EasedValue(0, offsetY, yTween.ElapsedPercentage(), Ease.OutQuad); - target.MovePosition(pos); - }); - return s; - } - - /// Tweens a Rigidbody's position through the given path waypoints, using the chosen path algorithm. - /// Also stores the Rigidbody as the tween's target so it can be used for filtered operations. - /// NOTE: to tween a rigidbody correctly it should be set to kinematic at least while being tweened. - /// BEWARE: doesn't work on Windows Phone store (waiting for Unity to fix their own bug). - /// If you plan to publish there you should use a regular transform.DOPath. - /// The waypoints to go through - /// The duration of the tween - /// The type of path: Linear (straight path), CatmullRom (curved CatmullRom path) or CubicBezier (curved with control points) - /// The path mode: 3D, side-scroller 2D, top-down 2D - /// The resolution of the path (useless in case of Linear paths): higher resolutions make for more detailed curved paths but are more expensive. - /// Defaults to 10, but a value of 5 is usually enough if you don't have dramatic long curves between waypoints - /// The color of the path (shown when gizmos are active in the Play panel and the tween is running) - public static TweenerCore DOPath( - this Rigidbody target, Vector3[] path, float duration, PathType pathType = PathType.Linear, - PathMode pathMode = PathMode.Full3D, int resolution = 10, Color? gizmoColor = null - ) - { - if (resolution < 1) resolution = 1; - TweenerCore t = DOTween.To(PathPlugin.Get(), () => target.position, target.MovePosition, new Path(pathType, path, resolution, gizmoColor), duration) - .SetTarget(target).SetUpdate(UpdateType.Fixed); - - t.plugOptions.isRigidbody = true; - t.plugOptions.mode = pathMode; - return t; - } - /// Tweens a Rigidbody's localPosition through the given path waypoints, using the chosen path algorithm. - /// Also stores the Rigidbody as the tween's target so it can be used for filtered operations - /// NOTE: to tween a rigidbody correctly it should be set to kinematic at least while being tweened. - /// BEWARE: doesn't work on Windows Phone store (waiting for Unity to fix their own bug). - /// If you plan to publish there you should use a regular transform.DOLocalPath. - /// The waypoint to go through - /// The duration of the tween - /// The type of path: Linear (straight path), CatmullRom (curved CatmullRom path) or CubicBezier (curved with control points) - /// The path mode: 3D, side-scroller 2D, top-down 2D - /// The resolution of the path: higher resolutions make for more detailed curved paths but are more expensive. - /// Defaults to 10, but a value of 5 is usually enough if you don't have dramatic long curves between waypoints - /// The color of the path (shown when gizmos are active in the Play panel and the tween is running) - public static TweenerCore DOLocalPath( - this Rigidbody target, Vector3[] path, float duration, PathType pathType = PathType.Linear, - PathMode pathMode = PathMode.Full3D, int resolution = 10, Color? gizmoColor = null - ) - { - if (resolution < 1) resolution = 1; - Transform trans = target.transform; - TweenerCore t = DOTween.To(PathPlugin.Get(), () => trans.localPosition, x => target.MovePosition(trans.parent == null ? x : trans.parent.TransformPoint(x)), new Path(pathType, path, resolution, gizmoColor), duration) - .SetTarget(target).SetUpdate(UpdateType.Fixed); - - t.plugOptions.isRigidbody = true; - t.plugOptions.mode = pathMode; - t.plugOptions.useLocalPosition = true; - return t; - } - // Used by path editor when creating the actual tween, so it can pass a pre-compiled path - internal static TweenerCore DOPath( - this Rigidbody target, Path path, float duration, PathMode pathMode = PathMode.Full3D - ) - { - TweenerCore t = DOTween.To(PathPlugin.Get(), () => target.position, target.MovePosition, path, duration) - .SetTarget(target); - - t.plugOptions.isRigidbody = true; - t.plugOptions.mode = pathMode; - return t; - } - internal static TweenerCore DOLocalPath( - this Rigidbody target, Path path, float duration, PathMode pathMode = PathMode.Full3D - ) - { - Transform trans = target.transform; - TweenerCore t = DOTween.To(PathPlugin.Get(), () => trans.localPosition, x => target.MovePosition(trans.parent == null ? x : trans.parent.TransformPoint(x)), path, duration) - .SetTarget(target); - - t.plugOptions.isRigidbody = true; - t.plugOptions.mode = pathMode; - t.plugOptions.useLocalPosition = true; - return t; - } - - #endregion - - #endregion - - #endregion - } -} -#endif diff --git a/Assets/DOTween/Modules/DOTweenModulePhysics.cs.meta b/Assets/DOTween/Modules/DOTweenModulePhysics.cs.meta deleted file mode 100644 index 377a5af..0000000 --- a/Assets/DOTween/Modules/DOTweenModulePhysics.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: 7fbfab74b660bc54aa30fcfedeffea6d \ No newline at end of file diff --git a/Assets/DOTween/Modules/DOTweenModulePhysics2D.cs b/Assets/DOTween/Modules/DOTweenModulePhysics2D.cs deleted file mode 100644 index 8ce2b56..0000000 --- a/Assets/DOTween/Modules/DOTweenModulePhysics2D.cs +++ /dev/null @@ -1,193 +0,0 @@ -// Author: Daniele Giardini - http://www.demigiant.com -// Created: 2018/07/13 - -#if true // MODULE_MARKER -using System; -using DG.Tweening.Core; -using DG.Tweening.Plugins; -using DG.Tweening.Plugins.Core.PathCore; -using DG.Tweening.Plugins.Options; -using UnityEngine; - -#pragma warning disable 1591 -namespace DG.Tweening -{ - public static class DOTweenModulePhysics2D - { - #region Shortcuts - - #region Rigidbody2D Shortcuts - - /// Tweens a Rigidbody2D's position to the given value. - /// Also stores the Rigidbody2D as the tween's target so it can be used for filtered operations - /// The end value to reachThe duration of the tween - /// If TRUE the tween will smoothly snap all values to integers - public static TweenerCore DOMove(this Rigidbody2D target, Vector2 endValue, float duration, bool snapping = false) - { - TweenerCore t = DOTween.To(() => target.position, target.MovePosition, endValue, duration); - t.SetOptions(snapping).SetTarget(target); - return t; - } - - /// Tweens a Rigidbody2D's X position to the given value. - /// Also stores the Rigidbody2D as the tween's target so it can be used for filtered operations - /// The end value to reachThe duration of the tween - /// If TRUE the tween will smoothly snap all values to integers - public static TweenerCore DOMoveX(this Rigidbody2D target, float endValue, float duration, bool snapping = false) - { - TweenerCore t = DOTween.To(() => target.position, target.MovePosition, new Vector2(endValue, 0), duration); - t.SetOptions(AxisConstraint.X, snapping).SetTarget(target); - return t; - } - - /// Tweens a Rigidbody2D's Y position to the given value. - /// Also stores the Rigidbody2D as the tween's target so it can be used for filtered operations - /// The end value to reachThe duration of the tween - /// If TRUE the tween will smoothly snap all values to integers - public static TweenerCore DOMoveY(this Rigidbody2D target, float endValue, float duration, bool snapping = false) - { - TweenerCore t = DOTween.To(() => target.position, target.MovePosition, new Vector2(0, endValue), duration); - t.SetOptions(AxisConstraint.Y, snapping).SetTarget(target); - return t; - } - - /// Tweens a Rigidbody2D's rotation to the given value. - /// Also stores the Rigidbody2D as the tween's target so it can be used for filtered operations - /// The end value to reachThe duration of the tween - public static TweenerCore DORotate(this Rigidbody2D target, float endValue, float duration) - { - TweenerCore t = DOTween.To(() => target.rotation, target.MoveRotation, endValue, duration); - t.SetTarget(target); - return t; - } - - #region Special - - /// Tweens a Rigidbody2D's position to the given value, while also applying a jump effect along the Y axis. - /// Returns a Sequence instead of a Tweener. - /// Also stores the Rigidbody2D as the tween's target so it can be used for filtered operations. - /// IMPORTANT: a rigidbody2D can't be animated in a jump arc using MovePosition, so the tween will directly set the position - /// The end value to reach - /// Power of the jump (the max height of the jump is represented by this plus the final Y offset) - /// Total number of jumps - /// The duration of the tween - /// If TRUE the tween will smoothly snap all values to integers - public static Sequence DOJump(this Rigidbody2D target, Vector2 endValue, float jumpPower, int numJumps, float duration, bool snapping = false) - { - if (numJumps < 1) numJumps = 1; - float startPosY = 0; - float offsetY = -1; - bool offsetYSet = false; - Sequence s = DOTween.Sequence(); - Tween yTween = DOTween.To(() => target.position, x => target.position = x, new Vector2(0, jumpPower), duration / (numJumps * 2)) - .SetOptions(AxisConstraint.Y, snapping).SetEase(Ease.OutQuad).SetRelative() - .SetLoops(numJumps * 2, LoopType.Yoyo) - .OnStart(() => startPosY = target.position.y); - s.Append(DOTween.To(() => target.position, x => target.position = x, new Vector2(endValue.x, 0), duration) - .SetOptions(AxisConstraint.X, snapping).SetEase(Ease.Linear) - ).Join(yTween) - .SetTarget(target).SetEase(DOTween.defaultEaseType); - yTween.OnUpdate(() => { - if (!offsetYSet) { - offsetYSet = true; - offsetY = s.isRelative ? endValue.y : endValue.y - startPosY; - } - Vector3 pos = target.position; - pos.y += DOVirtual.EasedValue(0, offsetY, yTween.ElapsedPercentage(), Ease.OutQuad); - target.MovePosition(pos); - }); - return s; - } - - /// Tweens a Rigidbody2D's position through the given path waypoints, using the chosen path algorithm. - /// Also stores the Rigidbody2D as the tween's target so it can be used for filtered operations. - /// NOTE: to tween a Rigidbody2D correctly it should be set to kinematic at least while being tweened. - /// BEWARE: doesn't work on Windows Phone store (waiting for Unity to fix their own bug). - /// If you plan to publish there you should use a regular transform.DOPath. - /// The waypoints to go through - /// The duration of the tween - /// The type of path: Linear (straight path), CatmullRom (curved CatmullRom path) or CubicBezier (curved with control points) - /// The path mode: 3D, side-scroller 2D, top-down 2D - /// The resolution of the path (useless in case of Linear paths): higher resolutions make for more detailed curved paths but are more expensive. - /// Defaults to 10, but a value of 5 is usually enough if you don't have dramatic long curves between waypoints - /// The color of the path (shown when gizmos are active in the Play panel and the tween is running) - public static TweenerCore DOPath( - this Rigidbody2D target, Vector2[] path, float duration, PathType pathType = PathType.Linear, - PathMode pathMode = PathMode.Full3D, int resolution = 10, Color? gizmoColor = null - ) - { - if (resolution < 1) resolution = 1; - int len = path.Length; - Vector3[] path3D = new Vector3[len]; - for (int i = 0; i < len; ++i) path3D[i] = path[i]; - TweenerCore t = DOTween.To(PathPlugin.Get(), () => target.position, x => target.MovePosition(x), new Path(pathType, path3D, resolution, gizmoColor), duration) - .SetTarget(target).SetUpdate(UpdateType.Fixed); - - t.plugOptions.isRigidbody2D = true; - t.plugOptions.mode = pathMode; - return t; - } - /// Tweens a Rigidbody2D's localPosition through the given path waypoints, using the chosen path algorithm. - /// Also stores the Rigidbody2D as the tween's target so it can be used for filtered operations - /// NOTE: to tween a Rigidbody2D correctly it should be set to kinematic at least while being tweened. - /// BEWARE: doesn't work on Windows Phone store (waiting for Unity to fix their own bug). - /// If you plan to publish there you should use a regular transform.DOLocalPath. - /// The waypoint to go through - /// The duration of the tween - /// The type of path: Linear (straight path), CatmullRom (curved CatmullRom path) or CubicBezier (curved with control points) - /// The path mode: 3D, side-scroller 2D, top-down 2D - /// The resolution of the path: higher resolutions make for more detailed curved paths but are more expensive. - /// Defaults to 10, but a value of 5 is usually enough if you don't have dramatic long curves between waypoints - /// The color of the path (shown when gizmos are active in the Play panel and the tween is running) - public static TweenerCore DOLocalPath( - this Rigidbody2D target, Vector2[] path, float duration, PathType pathType = PathType.Linear, - PathMode pathMode = PathMode.Full3D, int resolution = 10, Color? gizmoColor = null - ) - { - if (resolution < 1) resolution = 1; - int len = path.Length; - Vector3[] path3D = new Vector3[len]; - for (int i = 0; i < len; ++i) path3D[i] = path[i]; - Transform trans = target.transform; - TweenerCore t = DOTween.To(PathPlugin.Get(), () => trans.localPosition, x => target.MovePosition(trans.parent == null ? x : trans.parent.TransformPoint(x)), new Path(pathType, path3D, resolution, gizmoColor), duration) - .SetTarget(target).SetUpdate(UpdateType.Fixed); - - t.plugOptions.isRigidbody2D = true; - t.plugOptions.mode = pathMode; - t.plugOptions.useLocalPosition = true; - return t; - } - // Used by path editor when creating the actual tween, so it can pass a pre-compiled path - internal static TweenerCore DOPath( - this Rigidbody2D target, Path path, float duration, PathMode pathMode = PathMode.Full3D - ) - { - TweenerCore t = DOTween.To(PathPlugin.Get(), () => target.position, x => target.MovePosition(x), path, duration) - .SetTarget(target); - - t.plugOptions.isRigidbody2D = true; - t.plugOptions.mode = pathMode; - return t; - } - internal static TweenerCore DOLocalPath( - this Rigidbody2D target, Path path, float duration, PathMode pathMode = PathMode.Full3D - ) - { - Transform trans = target.transform; - TweenerCore t = DOTween.To(PathPlugin.Get(), () => trans.localPosition, x => target.MovePosition(trans.parent == null ? x : trans.parent.TransformPoint(x)), path, duration) - .SetTarget(target); - - t.plugOptions.isRigidbody2D = true; - t.plugOptions.mode = pathMode; - t.plugOptions.useLocalPosition = true; - return t; - } - - #endregion - - #endregion - - #endregion - } -} -#endif diff --git a/Assets/DOTween/Modules/DOTweenModulePhysics2D.cs.meta b/Assets/DOTween/Modules/DOTweenModulePhysics2D.cs.meta deleted file mode 100644 index 1d51b6e..0000000 --- a/Assets/DOTween/Modules/DOTweenModulePhysics2D.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: eea29b5b6af205e4ba70a656a6fbd3df \ No newline at end of file diff --git a/Assets/DOTween/Modules/DOTweenModuleSprite.cs b/Assets/DOTween/Modules/DOTweenModuleSprite.cs deleted file mode 100644 index 72afb7b..0000000 --- a/Assets/DOTween/Modules/DOTweenModuleSprite.cs +++ /dev/null @@ -1,93 +0,0 @@ -// Author: Daniele Giardini - http://www.demigiant.com -// Created: 2018/07/13 - -#if true // MODULE_MARKER -using System; -using UnityEngine; -using DG.Tweening.Core; -using DG.Tweening.Plugins.Options; - -#pragma warning disable 1591 -namespace DG.Tweening -{ - public static class DOTweenModuleSprite - { - #region Shortcuts - - #region SpriteRenderer - - /// Tweens a SpriteRenderer's color to the given value. - /// Also stores the spriteRenderer as the tween's target so it can be used for filtered operations - /// The end value to reachThe duration of the tween - public static TweenerCore DOColor(this SpriteRenderer target, Color endValue, float duration) - { - TweenerCore t = DOTween.To(() => target.color, x => target.color = x, endValue, duration); - t.SetTarget(target); - return t; - } - - /// Tweens a Material's alpha color to the given value. - /// Also stores the spriteRenderer as the tween's target so it can be used for filtered operations - /// The end value to reachThe duration of the tween - public static TweenerCore DOFade(this SpriteRenderer target, float endValue, float duration) - { - TweenerCore t = DOTween.ToAlpha(() => target.color, x => target.color = x, endValue, duration); - t.SetTarget(target); - return t; - } - - /// Tweens a SpriteRenderer'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 - /// The gradient to useThe duration of the tween - public static Sequence DOGradientColor(this SpriteRenderer 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 Blendables - - #region SpriteRenderer - - /// Tweens a SpriteRenderer's color to the given value, - /// in a way that allows other DOBlendableColor tweens to work together on the same target, - /// instead than fight each other as multiple DOColor would do. - /// Also stores the SpriteRenderer as the tween's target so it can be used for filtered operations - /// The value to tween toThe duration of the tween - public static Tweener DOBlendableColor(this SpriteRenderer target, Color endValue, float duration) - { - endValue = endValue - target.color; - Color to = new Color(0, 0, 0, 0); - return DOTween.To(() => to, x => { - Color diff = x - to; - to = x; - target.color += diff; - }, endValue, duration) - .Blendable().SetTarget(target); - } - - #endregion - - #endregion - - #endregion - } -} -#endif diff --git a/Assets/DOTween/Modules/DOTweenModuleSprite.cs.meta b/Assets/DOTween/Modules/DOTweenModuleSprite.cs.meta deleted file mode 100644 index 3b1de1b..0000000 --- a/Assets/DOTween/Modules/DOTweenModuleSprite.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: c4f6bf0d0071f80429b63a9ac8c664bb \ No newline at end of file diff --git a/Assets/DOTween/Modules/DOTweenModuleUI.cs b/Assets/DOTween/Modules/DOTweenModuleUI.cs deleted file mode 100644 index 2381f4c..0000000 --- a/Assets/DOTween/Modules/DOTweenModuleUI.cs +++ /dev/null @@ -1,662 +0,0 @@ -// Author: Daniele Giardini - http://www.demigiant.com -// Created: 2018/07/13 - -#if true // MODULE_MARKER - -using System; -using System.Globalization; -using UnityEngine; -using UnityEngine.UI; -using DG.Tweening.Core; -using DG.Tweening.Core.Enums; -using DG.Tweening.Plugins; -using DG.Tweening.Plugins.Options; -using Outline = UnityEngine.UI.Outline; -using Text = UnityEngine.UI.Text; - -#pragma warning disable 1591 -namespace DG.Tweening -{ - public static class DOTweenModuleUI - { - #region Shortcuts - - #region CanvasGroup - - /// Tweens a CanvasGroup's alpha color to the given value. - /// Also stores the canvasGroup as the tween's target so it can be used for filtered operations - /// The end value to reachThe duration of the tween - public static TweenerCore DOFade(this CanvasGroup target, float endValue, float duration) - { - TweenerCore t = DOTween.To(() => target.alpha, x => target.alpha = x, endValue, duration); - t.SetTarget(target); - return t; - } - - #endregion - - #region Graphic - - /// Tweens an Graphic's color to the given value. - /// Also stores the image as the tween's target so it can be used for filtered operations - /// The end value to reachThe duration of the tween - public static TweenerCore DOColor(this Graphic target, Color endValue, float duration) - { - TweenerCore t = DOTween.To(() => target.color, x => target.color = x, endValue, duration); - t.SetTarget(target); - return t; - } - - /// Tweens an Graphic's alpha color to the given value. - /// Also stores the image as the tween's target so it can be used for filtered operations - /// The end value to reachThe duration of the tween - public static TweenerCore DOFade(this Graphic target, float endValue, float duration) - { - TweenerCore t = DOTween.ToAlpha(() => target.color, x => target.color = x, endValue, duration); - t.SetTarget(target); - return t; - } - - #endregion - - #region Image - - /// Tweens an Image's color to the given value. - /// Also stores the image as the tween's target so it can be used for filtered operations - /// The end value to reachThe duration of the tween - public static TweenerCore DOColor(this Image target, Color endValue, float duration) - { - TweenerCore t = DOTween.To(() => target.color, x => target.color = x, endValue, duration); - t.SetTarget(target); - return t; - } - - /// Tweens an Image's alpha color to the given value. - /// Also stores the image as the tween's target so it can be used for filtered operations - /// The end value to reachThe duration of the tween - public static TweenerCore DOFade(this Image target, float endValue, float duration) - { - TweenerCore t = DOTween.ToAlpha(() => target.color, x => target.color = x, endValue, duration); - t.SetTarget(target); - return t; - } - - /// Tweens an Image's fillAmount to the given value. - /// Also stores the image as the tween's target so it can be used for filtered operations - /// The end value to reach (0 to 1)The duration of the tween - public static TweenerCore DOFillAmount(this Image target, float endValue, float duration) - { - if (endValue > 1) endValue = 1; - else if (endValue < 0) endValue = 0; - TweenerCore t = DOTween.To(() => target.fillAmount, x => target.fillAmount = x, endValue, duration); - t.SetTarget(target); - return t; - } - - /// Tweens an Image's colors 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 - /// The gradient to useThe duration of the tween - public static Sequence DOGradientColor(this Image 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 LayoutElement - - /// Tweens an LayoutElement's flexibleWidth/Height to the given value. - /// Also stores the LayoutElement as the tween's target so it can be used for filtered operations - /// The end value to reachThe duration of the tween - /// If TRUE the tween will smoothly snap all values to integers - public static TweenerCore DOFlexibleSize(this LayoutElement target, Vector2 endValue, float duration, bool snapping = false) - { - TweenerCore t = DOTween.To(() => new Vector2(target.flexibleWidth, target.flexibleHeight), x => { - target.flexibleWidth = x.x; - target.flexibleHeight = x.y; - }, endValue, duration); - t.SetOptions(snapping).SetTarget(target); - return t; - } - - /// Tweens an LayoutElement's minWidth/Height to the given value. - /// Also stores the LayoutElement as the tween's target so it can be used for filtered operations - /// The end value to reachThe duration of the tween - /// If TRUE the tween will smoothly snap all values to integers - public static TweenerCore DOMinSize(this LayoutElement target, Vector2 endValue, float duration, bool snapping = false) - { - TweenerCore t = DOTween.To(() => new Vector2(target.minWidth, target.minHeight), x => { - target.minWidth = x.x; - target.minHeight = x.y; - }, endValue, duration); - t.SetOptions(snapping).SetTarget(target); - return t; - } - - /// Tweens an LayoutElement's preferredWidth/Height to the given value. - /// Also stores the LayoutElement as the tween's target so it can be used for filtered operations - /// The end value to reachThe duration of the tween - /// If TRUE the tween will smoothly snap all values to integers - public static TweenerCore DOPreferredSize(this LayoutElement target, Vector2 endValue, float duration, bool snapping = false) - { - TweenerCore t = DOTween.To(() => new Vector2(target.preferredWidth, target.preferredHeight), x => { - target.preferredWidth = x.x; - target.preferredHeight = x.y; - }, endValue, duration); - t.SetOptions(snapping).SetTarget(target); - return t; - } - - #endregion - - #region Outline - - /// Tweens a Outline's effectColor to the given value. - /// Also stores the Outline as the tween's target so it can be used for filtered operations - /// The end value to reachThe duration of the tween - public static TweenerCore DOColor(this Outline target, Color endValue, float duration) - { - TweenerCore t = DOTween.To(() => target.effectColor, x => target.effectColor = x, endValue, duration); - t.SetTarget(target); - return t; - } - - /// Tweens a Outline's effectColor alpha to the given value. - /// Also stores the Outline as the tween's target so it can be used for filtered operations - /// The end value to reachThe duration of the tween - public static TweenerCore DOFade(this Outline target, float endValue, float duration) - { - TweenerCore t = DOTween.ToAlpha(() => target.effectColor, x => target.effectColor = x, endValue, duration); - t.SetTarget(target); - return t; - } - - /// Tweens a Outline's effectDistance to the given value. - /// Also stores the Outline as the tween's target so it can be used for filtered operations - /// The end value to reachThe duration of the tween - public static TweenerCore DOScale(this Outline target, Vector2 endValue, float duration) - { - TweenerCore t = DOTween.To(() => target.effectDistance, x => target.effectDistance = x, endValue, duration); - t.SetTarget(target); - return t; - } - - #endregion - - #region RectTransform - - /// Tweens a RectTransform's anchoredPosition to the given value. - /// Also stores the RectTransform as the tween's target so it can be used for filtered operations - /// The end value to reachThe duration of the tween - /// If TRUE the tween will smoothly snap all values to integers - public static TweenerCore DOAnchorPos(this RectTransform target, Vector2 endValue, float duration, bool snapping = false) - { - TweenerCore t = DOTween.To(() => target.anchoredPosition, x => target.anchoredPosition = x, endValue, duration); - t.SetOptions(snapping).SetTarget(target); - return t; - } - /// Tweens a RectTransform's anchoredPosition X to the given value. - /// Also stores the RectTransform as the tween's target so it can be used for filtered operations - /// The end value to reachThe duration of the tween - /// If TRUE the tween will smoothly snap all values to integers - public static TweenerCore DOAnchorPosX(this RectTransform target, float endValue, float duration, bool snapping = false) - { - TweenerCore t = DOTween.To(() => target.anchoredPosition, x => target.anchoredPosition = x, new Vector2(endValue, 0), duration); - t.SetOptions(AxisConstraint.X, snapping).SetTarget(target); - return t; - } - /// Tweens a RectTransform's anchoredPosition Y to the given value. - /// Also stores the RectTransform as the tween's target so it can be used for filtered operations - /// The end value to reachThe duration of the tween - /// If TRUE the tween will smoothly snap all values to integers - public static TweenerCore DOAnchorPosY(this RectTransform target, float endValue, float duration, bool snapping = false) - { - TweenerCore t = DOTween.To(() => target.anchoredPosition, x => target.anchoredPosition = x, new Vector2(0, endValue), duration); - t.SetOptions(AxisConstraint.Y, snapping).SetTarget(target); - return t; - } - - /// Tweens a RectTransform's anchoredPosition3D to the given value. - /// Also stores the RectTransform as the tween's target so it can be used for filtered operations - /// The end value to reachThe duration of the tween - /// If TRUE the tween will smoothly snap all values to integers - public static TweenerCore DOAnchorPos3D(this RectTransform target, Vector3 endValue, float duration, bool snapping = false) - { - TweenerCore t = DOTween.To(() => target.anchoredPosition3D, x => target.anchoredPosition3D = x, endValue, duration); - t.SetOptions(snapping).SetTarget(target); - return t; - } - /// Tweens a RectTransform's anchoredPosition3D X to the given value. - /// Also stores the RectTransform as the tween's target so it can be used for filtered operations - /// The end value to reachThe duration of the tween - /// If TRUE the tween will smoothly snap all values to integers - public static TweenerCore DOAnchorPos3DX(this RectTransform target, float endValue, float duration, bool snapping = false) - { - TweenerCore t = DOTween.To(() => target.anchoredPosition3D, x => target.anchoredPosition3D = x, new Vector3(endValue, 0, 0), duration); - t.SetOptions(AxisConstraint.X, snapping).SetTarget(target); - return t; - } - /// Tweens a RectTransform's anchoredPosition3D Y to the given value. - /// Also stores the RectTransform as the tween's target so it can be used for filtered operations - /// The end value to reachThe duration of the tween - /// If TRUE the tween will smoothly snap all values to integers - public static TweenerCore DOAnchorPos3DY(this RectTransform target, float endValue, float duration, bool snapping = false) - { - TweenerCore t = DOTween.To(() => target.anchoredPosition3D, x => target.anchoredPosition3D = x, new Vector3(0, endValue, 0), duration); - t.SetOptions(AxisConstraint.Y, snapping).SetTarget(target); - return t; - } - /// Tweens a RectTransform's anchoredPosition3D Z to the given value. - /// Also stores the RectTransform as the tween's target so it can be used for filtered operations - /// The end value to reachThe duration of the tween - /// If TRUE the tween will smoothly snap all values to integers - public static TweenerCore DOAnchorPos3DZ(this RectTransform target, float endValue, float duration, bool snapping = false) - { - TweenerCore t = DOTween.To(() => target.anchoredPosition3D, x => target.anchoredPosition3D = x, new Vector3(0, 0, endValue), duration); - t.SetOptions(AxisConstraint.Z, snapping).SetTarget(target); - return t; - } - - /// Tweens a RectTransform's anchorMax to the given value. - /// Also stores the RectTransform as the tween's target so it can be used for filtered operations - /// The end value to reachThe duration of the tween - /// If TRUE the tween will smoothly snap all values to integers - public static TweenerCore DOAnchorMax(this RectTransform target, Vector2 endValue, float duration, bool snapping = false) - { - TweenerCore t = DOTween.To(() => target.anchorMax, x => target.anchorMax = x, endValue, duration); - t.SetOptions(snapping).SetTarget(target); - return t; - } - - /// Tweens a RectTransform's anchorMin to the given value. - /// Also stores the RectTransform as the tween's target so it can be used for filtered operations - /// The end value to reachThe duration of the tween - /// If TRUE the tween will smoothly snap all values to integers - public static TweenerCore DOAnchorMin(this RectTransform target, Vector2 endValue, float duration, bool snapping = false) - { - TweenerCore t = DOTween.To(() => target.anchorMin, x => target.anchorMin = x, endValue, duration); - t.SetOptions(snapping).SetTarget(target); - return t; - } - - /// Tweens a RectTransform's pivot to the given value. - /// Also stores the RectTransform as the tween's target so it can be used for filtered operations - /// The end value to reachThe duration of the tween - public static TweenerCore DOPivot(this RectTransform target, Vector2 endValue, float duration) - { - TweenerCore t = DOTween.To(() => target.pivot, x => target.pivot = x, endValue, duration); - t.SetTarget(target); - return t; - } - /// Tweens a RectTransform's pivot X to the given value. - /// Also stores the RectTransform as the tween's target so it can be used for filtered operations - /// The end value to reachThe duration of the tween - public static TweenerCore DOPivotX(this RectTransform target, float endValue, float duration) - { - TweenerCore t = DOTween.To(() => target.pivot, x => target.pivot = x, new Vector2(endValue, 0), duration); - t.SetOptions(AxisConstraint.X).SetTarget(target); - return t; - } - /// Tweens a RectTransform's pivot Y to the given value. - /// Also stores the RectTransform as the tween's target so it can be used for filtered operations - /// The end value to reachThe duration of the tween - public static TweenerCore DOPivotY(this RectTransform target, float endValue, float duration) - { - TweenerCore t = DOTween.To(() => target.pivot, x => target.pivot = x, new Vector2(0, endValue), duration); - t.SetOptions(AxisConstraint.Y).SetTarget(target); - return t; - } - - /// Tweens a RectTransform's sizeDelta to the given value. - /// Also stores the RectTransform as the tween's target so it can be used for filtered operations - /// The end value to reachThe duration of the tween - /// If TRUE the tween will smoothly snap all values to integers - public static TweenerCore DOSizeDelta(this RectTransform target, Vector2 endValue, float duration, bool snapping = false) - { - TweenerCore t = DOTween.To(() => target.sizeDelta, x => target.sizeDelta = x, endValue, duration); - t.SetOptions(snapping).SetTarget(target); - return t; - } - - /// Punches a RectTransform's anchoredPosition towards the given direction and then back to the starting one - /// as if it was connected to the starting position via an elastic. - /// Also stores the RectTransform as the tween's target so it can be used for filtered operations - /// The direction and strength of the punch (added to the RectTransform's current position) - /// The duration of the tween - /// Indicates how much will the punch vibrate - /// Represents how much (0 to 1) the vector will go beyond the starting position when bouncing backwards. - /// 1 creates a full oscillation between the punch direction and the opposite direction, - /// while 0 oscillates only between the punch and the start position - /// If TRUE the tween will smoothly snap all values to integers - public static Tweener DOPunchAnchorPos(this RectTransform target, Vector2 punch, float duration, int vibrato = 10, float elasticity = 1, bool snapping = false) - { - return DOTween.Punch(() => target.anchoredPosition, x => target.anchoredPosition = x, punch, duration, vibrato, elasticity) - .SetTarget(target).SetOptions(snapping); - } - - /// Shakes a RectTransform's anchoredPosition with the given values. - /// Also stores the RectTransform as the tween's target so it can be used for filtered operations - /// The duration of the tween - /// The shake strength - /// Indicates how much will the shake vibrate - /// Indicates how much the shake will be random (0 to 180 - values higher than 90 kind of suck, so beware). - /// Setting it to 0 will shake along a single direction. - /// If TRUE the tween will smoothly snap all values to integers - /// If TRUE the shake will automatically fadeOut smoothly within the tween's duration, otherwise it will not - /// Randomness mode - public static Tweener DOShakeAnchorPos(this RectTransform target, float duration, float strength = 100, int vibrato = 10, float randomness = 90, bool snapping = false, bool fadeOut = true, ShakeRandomnessMode randomnessMode = ShakeRandomnessMode.Full) - { - return DOTween.Shake(() => target.anchoredPosition, x => target.anchoredPosition = x, duration, strength, vibrato, randomness, true, fadeOut, randomnessMode) - .SetTarget(target).SetSpecialStartupMode(SpecialStartupMode.SetShake).SetOptions(snapping); - } - /// Shakes a RectTransform's anchoredPosition with the given values. - /// Also stores the RectTransform as the tween's target so it can be used for filtered operations - /// The duration of the tween - /// The shake strength on each axis - /// Indicates how much will the shake vibrate - /// Indicates how much the shake will be random (0 to 180 - values higher than 90 kind of suck, so beware). - /// Setting it to 0 will shake along a single direction. - /// If TRUE the tween will smoothly snap all values to integers - /// If TRUE the shake will automatically fadeOut smoothly within the tween's duration, otherwise it will not - /// Randomness mode - public static Tweener DOShakeAnchorPos(this RectTransform target, float duration, Vector2 strength, int vibrato = 10, float randomness = 90, bool snapping = false, bool fadeOut = true, ShakeRandomnessMode randomnessMode = ShakeRandomnessMode.Full) - { - return DOTween.Shake(() => target.anchoredPosition, x => target.anchoredPosition = x, duration, strength, vibrato, randomness, fadeOut, randomnessMode) - .SetTarget(target).SetSpecialStartupMode(SpecialStartupMode.SetShake).SetOptions(snapping); - } - - #region Special - - /// Tweens a RectTransform's anchoredPosition to the given value, while also applying a jump effect along the Y axis. - /// Returns a Sequence instead of a Tweener. - /// Also stores the RectTransform as the tween's target so it can be used for filtered operations - /// The end value to reach - /// Power of the jump (the max height of the jump is represented by this plus the final Y offset) - /// Total number of jumps - /// The duration of the tween - /// If TRUE the tween will smoothly snap all values to integers - public static Sequence DOJumpAnchorPos(this RectTransform target, Vector2 endValue, float jumpPower, int numJumps, float duration, bool snapping = false) - { - if (numJumps < 1) numJumps = 1; - float startPosY = 0; - float offsetY = -1; - bool offsetYSet = false; - - // Separate Y Tween so we can elaborate elapsedPercentage on that insted of on the Sequence - // (in case users add a delay or other elements to the Sequence) - Sequence s = DOTween.Sequence(); - Tween yTween = DOTween.To(() => target.anchoredPosition, x => target.anchoredPosition = x, new Vector2(0, jumpPower), duration / (numJumps * 2)) - .SetOptions(AxisConstraint.Y, snapping).SetEase(Ease.OutQuad).SetRelative() - .SetLoops(numJumps * 2, LoopType.Yoyo) - .OnStart(()=> startPosY = target.anchoredPosition.y); - s.Append(DOTween.To(() => target.anchoredPosition, x => target.anchoredPosition = x, new Vector2(endValue.x, 0), duration) - .SetOptions(AxisConstraint.X, snapping).SetEase(Ease.Linear) - ).Join(yTween) - .SetTarget(target).SetEase(DOTween.defaultEaseType); - s.OnUpdate(() => { - if (!offsetYSet) { - offsetYSet = true; - offsetY = s.isRelative ? endValue.y : endValue.y - startPosY; - } - Vector2 pos = target.anchoredPosition; - pos.y += DOVirtual.EasedValue(0, offsetY, s.ElapsedDirectionalPercentage(), Ease.OutQuad); - target.anchoredPosition = pos; - }); - return s; - } - - #endregion - - #endregion - - #region ScrollRect - - /// Tweens a ScrollRect's horizontal/verticalNormalizedPosition to the given value. - /// Also stores the ScrollRect as the tween's target so it can be used for filtered operations - /// The end value to reachThe duration of the tween - /// If TRUE the tween will smoothly snap all values to integers - public static Tweener DONormalizedPos(this ScrollRect target, Vector2 endValue, float duration, bool snapping = false) - { - return DOTween.To(() => new Vector2(target.horizontalNormalizedPosition, target.verticalNormalizedPosition), - x => { - target.horizontalNormalizedPosition = x.x; - target.verticalNormalizedPosition = x.y; - }, endValue, duration) - .SetOptions(snapping).SetTarget(target); - } - /// Tweens a ScrollRect's horizontalNormalizedPosition to the given value. - /// Also stores the ScrollRect as the tween's target so it can be used for filtered operations - /// The end value to reachThe duration of the tween - /// If TRUE the tween will smoothly snap all values to integers - public static Tweener DOHorizontalNormalizedPos(this ScrollRect target, float endValue, float duration, bool snapping = false) - { - return DOTween.To(() => target.horizontalNormalizedPosition, x => target.horizontalNormalizedPosition = x, endValue, duration) - .SetOptions(snapping).SetTarget(target); - } - /// Tweens a ScrollRect's verticalNormalizedPosition to the given value. - /// Also stores the ScrollRect as the tween's target so it can be used for filtered operations - /// The end value to reachThe duration of the tween - /// If TRUE the tween will smoothly snap all values to integers - public static Tweener DOVerticalNormalizedPos(this ScrollRect target, float endValue, float duration, bool snapping = false) - { - return DOTween.To(() => target.verticalNormalizedPosition, x => target.verticalNormalizedPosition = x, endValue, duration) - .SetOptions(snapping).SetTarget(target); - } - - #endregion - - #region Slider - - /// Tweens a Slider's value to the given value. - /// Also stores the Slider as the tween's target so it can be used for filtered operations - /// The end value to reachThe duration of the tween - /// If TRUE the tween will smoothly snap all values to integers - public static TweenerCore DOValue(this Slider target, float endValue, float duration, bool snapping = false) - { - TweenerCore t = DOTween.To(() => target.value, x => target.value = x, endValue, duration); - t.SetOptions(snapping).SetTarget(target); - return t; - } - - #endregion - - #region Text - - /// Tweens a Text's color to the given value. - /// Also stores the Text as the tween's target so it can be used for filtered operations - /// The end value to reachThe duration of the tween - public static TweenerCore DOColor(this Text target, Color endValue, float duration) - { - TweenerCore t = DOTween.To(() => target.color, x => target.color = x, endValue, duration); - t.SetTarget(target); - return t; - } - - /// - /// Tweens a Text's text from one integer to another, with options for thousands separators - /// - /// The value to start from - /// The end value to reach - /// The duration of the tween - /// If TRUE (default) also adds thousands separators - /// The to use (InvariantCulture if NULL) - public static TweenerCore DOCounter( - this Text target, int fromValue, int endValue, float duration, bool addThousandsSeparator = true, CultureInfo culture = null - ){ - int v = fromValue; - CultureInfo cInfo = !addThousandsSeparator ? null : culture ?? CultureInfo.InvariantCulture; - TweenerCore t = DOTween.To(() => v, x => { - v = x; - target.text = addThousandsSeparator - ? v.ToString("N0", cInfo) - : v.ToString(); - }, endValue, duration); - t.SetTarget(target); - return t; - } - - /// Tweens a Text's alpha color to the given value. - /// Also stores the Text as the tween's target so it can be used for filtered operations - /// The end value to reachThe duration of the tween - public static TweenerCore DOFade(this Text target, float endValue, float duration) - { - TweenerCore t = DOTween.ToAlpha(() => target.color, x => target.color = x, endValue, duration); - t.SetTarget(target); - return t; - } - - /// Tweens a Text's text to the given value. - /// Also stores the Text as the tween's target so it can be used for filtered operations - /// The end string to tween toThe duration of the tween - /// If TRUE (default), rich text will be interpreted correctly while animated, - /// otherwise all tags will be considered as normal text - /// The type of scramble mode to use, if any - /// 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 - public static TweenerCore DOText(this Text target, string endValue, float duration, bool richTextEnabled = true, ScrambleMode scrambleMode = ScrambleMode.None, string scrambleChars = null) - { - if (endValue == null) { - if (Debugger.logPriority > 0) Debugger.LogWarning("You can't pass a NULL string to DOText: an empty string will be used instead to avoid errors"); - endValue = ""; - } - TweenerCore t = DOTween.To(() => target.text, x => target.text = x, endValue, duration); - t.SetOptions(richTextEnabled, scrambleMode, scrambleChars) - .SetTarget(target); - return t; - } - - #endregion - - #region Blendables - - #region Graphic - - /// Tweens a Graphic's color to the given value, - /// in a way that allows other DOBlendableColor tweens to work together on the same target, - /// instead than fight each other as multiple DOColor would do. - /// Also stores the Graphic as the tween's target so it can be used for filtered operations - /// The value to tween toThe duration of the tween - public static Tweener DOBlendableColor(this Graphic target, Color endValue, float duration) - { - endValue = endValue - target.color; - Color to = new Color(0, 0, 0, 0); - return DOTween.To(() => to, x => { - Color diff = x - to; - to = x; - target.color += diff; - }, endValue, duration) - .Blendable().SetTarget(target); - } - - #endregion - - #region Image - - /// Tweens a Image's color to the given value, - /// in a way that allows other DOBlendableColor tweens to work together on the same target, - /// instead than fight each other as multiple DOColor would do. - /// Also stores the Image as the tween's target so it can be used for filtered operations - /// The value to tween toThe duration of the tween - public static Tweener DOBlendableColor(this Image target, Color endValue, float duration) - { - endValue = endValue - target.color; - Color to = new Color(0, 0, 0, 0); - return DOTween.To(() => to, x => { - Color diff = x - to; - to = x; - target.color += diff; - }, endValue, duration) - .Blendable().SetTarget(target); - } - - #endregion - - #region Text - - /// Tweens a Text's color BY the given value, - /// in a way that allows other DOBlendableColor tweens to work together on the same target, - /// instead than fight each other as multiple DOColor would do. - /// Also stores the Text as the tween's target so it can be used for filtered operations - /// The value to tween toThe duration of the tween - public static Tweener DOBlendableColor(this Text target, Color endValue, float duration) - { - endValue = endValue - target.color; - Color to = new Color(0, 0, 0, 0); - return DOTween.To(() => to, x => { - Color diff = x - to; - to = x; - target.color += diff; - }, endValue, duration) - .Blendable().SetTarget(target); - } - - #endregion - - #endregion - - #region Shapes - - /// Tweens a RectTransform's anchoredPosition so that it draws a circle around the given center. - /// Also stores the RectTransform as the tween's target so it can be used for filtered operations. - /// IMPORTANT: SetFrom(value) requires a instead of a float, where the X property represents the "from degrees value" - /// Circle-center/pivot around which to rotate (in UI anchoredPosition coordinates) - /// The end value degrees to reach (to rotate counter-clockwise pass a negative value) - /// The duration of the tween - /// If TRUE the coordinates will be considered as relative to the target's current anchoredPosition - /// If TRUE the tween will smoothly snap all values to integers - public static TweenerCore DOShapeCircle( - this RectTransform target, Vector2 center, float endValueDegrees, float duration, bool relativeCenter = false, bool snapping = false - ) - { - TweenerCore t = DOTween.To( - CirclePlugin.Get(), () => target.anchoredPosition, x => target.anchoredPosition = x, center, duration - ); - t.SetOptions(endValueDegrees, relativeCenter, snapping).SetTarget(target); - return t; - } - - #endregion - - #endregion - - // █████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ - // ███ INTERNAL CLASSES ████████████████████████████████████████████████████████████████████████████████████████████████ - // █████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ - - public static class Utils - { - /// - /// Converts the anchoredPosition of the first RectTransform to the second RectTransform, - /// taking into consideration offset, anchors and pivot, and returns the new anchoredPosition - /// - public static Vector2 SwitchToRectTransform(RectTransform from, RectTransform to) - { - Vector2 localPoint; - Vector2 fromPivotDerivedOffset = new Vector2(from.rect.width * 0.5f + from.rect.xMin, from.rect.height * 0.5f + from.rect.yMin); - Vector2 screenP = RectTransformUtility.WorldToScreenPoint(null, from.position); - screenP += fromPivotDerivedOffset; - RectTransformUtility.ScreenPointToLocalPointInRectangle(to, screenP, null, out localPoint); - Vector2 pivotDerivedOffset = new Vector2(to.rect.width * 0.5f + to.rect.xMin, to.rect.height * 0.5f + to.rect.yMin); - return to.anchoredPosition + localPoint - pivotDerivedOffset; - } - } - } -} -#endif diff --git a/Assets/DOTween/Modules/DOTweenModuleUI.cs.meta b/Assets/DOTween/Modules/DOTweenModuleUI.cs.meta deleted file mode 100644 index 495b519..0000000 --- a/Assets/DOTween/Modules/DOTweenModuleUI.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: a7655e50a1228954492ba06913483c38 \ No newline at end of file diff --git a/Assets/DOTween/Modules/DOTweenModuleUnityVersion.cs b/Assets/DOTween/Modules/DOTweenModuleUnityVersion.cs deleted file mode 100644 index 8f818ba..0000000 --- a/Assets/DOTween/Modules/DOTweenModuleUnityVersion.cs +++ /dev/null @@ -1,389 +0,0 @@ -// Author: Daniele Giardini - http://www.demigiant.com -// Created: 2018/07/13 - -using System; -using UnityEngine; -using DG.Tweening.Core; -using DG.Tweening.Plugins.Options; -//#if UNITY_2018_1_OR_NEWER && (NET_4_6 || NET_STANDARD_2_0) -//using Task = System.Threading.Tasks.Task; -//#endif - -#pragma warning disable 1591 -namespace DG.Tweening -{ - /// - /// Shortcuts/functions that are not strictly related to specific Modules - /// but are available only on some Unity versions - /// - public static class DOTweenModuleUnityVersion - { - #region Material - - /// Tweens a Material'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 - /// The gradient to useThe duration of the tween - public static Sequence DOGradientColor(this Material 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; - } - /// Tweens a Material's named color property 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 - /// The gradient to use - /// The name of the material property to tween (like _Tint or _SpecColor) - /// The duration of the tween - public static Sequence DOGradientColor(this Material target, Gradient gradient, string property, 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.SetColor(property, 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, property, colorDuration).SetEase(Ease.Linear)); - } - s.SetTarget(target); - return s; - } - - #endregion - - #region CustomYieldInstructions - - /// - /// Returns a that waits until the tween is killed or complete. - /// It can be used inside a coroutine as a yield. - /// Example usage:yield return myTween.WaitForCompletion(true); - /// - public static CustomYieldInstruction WaitForCompletion(this Tween t, bool returnCustomYieldInstruction) - { - if (!t.active) { - if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t); - return null; - } - return new DOTweenCYInstruction.WaitForCompletion(t); - } - - /// - /// Returns a that waits until the tween is killed or rewinded. - /// It can be used inside a coroutine as a yield. - /// Example usage:yield return myTween.WaitForRewind(); - /// - public static CustomYieldInstruction WaitForRewind(this Tween t, bool returnCustomYieldInstruction) - { - if (!t.active) { - if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t); - return null; - } - return new DOTweenCYInstruction.WaitForRewind(t); - } - - /// - /// Returns a that waits until the tween is killed. - /// It can be used inside a coroutine as a yield. - /// Example usage:yield return myTween.WaitForKill(); - /// - public static CustomYieldInstruction WaitForKill(this Tween t, bool returnCustomYieldInstruction) - { - if (!t.active) { - if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t); - return null; - } - return new DOTweenCYInstruction.WaitForKill(t); - } - - /// - /// Returns a that waits until the tween is killed or has gone through the given amount of loops. - /// It can be used inside a coroutine as a yield. - /// Example usage:yield return myTween.WaitForElapsedLoops(2); - /// - /// Elapsed loops to wait for - public static CustomYieldInstruction WaitForElapsedLoops(this Tween t, int elapsedLoops, bool returnCustomYieldInstruction) - { - if (!t.active) { - if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t); - return null; - } - return new DOTweenCYInstruction.WaitForElapsedLoops(t, elapsedLoops); - } - - /// - /// Returns a that waits until the tween is killed - /// or has reached the given time position (loops included, delays excluded). - /// It can be used inside a coroutine as a yield. - /// Example usage:yield return myTween.WaitForPosition(2.5f); - /// - /// Position (loops included, delays excluded) to wait for - public static CustomYieldInstruction WaitForPosition(this Tween t, float position, bool returnCustomYieldInstruction) - { - if (!t.active) { - if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t); - return null; - } - return new DOTweenCYInstruction.WaitForPosition(t, position); - } - - /// - /// Returns a that waits until the tween is killed or started - /// (meaning when the tween is set in a playing state the first time, after any eventual delay). - /// It can be used inside a coroutine as a yield. - /// Example usage:yield return myTween.WaitForStart(); - /// - public static CustomYieldInstruction WaitForStart(this Tween t, bool returnCustomYieldInstruction) - { - if (!t.active) { - if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t); - return null; - } - return new DOTweenCYInstruction.WaitForStart(t); - } - - #endregion - -#if UNITY_2018_1_OR_NEWER - #region Unity 2018.1 or Newer - - #region Material - - /// Tweens a Material's named texture offset property with the given ID to the given value. - /// Also stores the material as the tween's target so it can be used for filtered operations - /// The end value to reach - /// The ID of the material property to tween (also called nameID in Unity's manual) - /// The duration of the tween - public static TweenerCore DOOffset(this Material target, Vector2 endValue, int propertyID, float duration) - { - if (!target.HasProperty(propertyID)) { - if (Debugger.logPriority > 0) Debugger.LogMissingMaterialProperty(propertyID); - return null; - } - TweenerCore t = DOTween.To(() => target.GetTextureOffset(propertyID), x => target.SetTextureOffset(propertyID, x), endValue, duration); - t.SetTarget(target); - return t; - } - - /// Tweens a Material's named texture scale property with the given ID to the given value. - /// Also stores the material as the tween's target so it can be used for filtered operations - /// The end value to reach - /// The ID of the material property to tween (also called nameID in Unity's manual) - /// The duration of the tween - public static TweenerCore DOTiling(this Material target, Vector2 endValue, int propertyID, float duration) - { - if (!target.HasProperty(propertyID)) { - if (Debugger.logPriority > 0) Debugger.LogMissingMaterialProperty(propertyID); - return null; - } - TweenerCore t = DOTween.To(() => target.GetTextureScale(propertyID), x => target.SetTextureScale(propertyID, x), endValue, duration); - t.SetTarget(target); - return t; - } - - #endregion - - #region .NET 4.6 or Newer - -#if UNITY_2018_1_OR_NEWER && (NET_4_6 || NET_STANDARD_2_0) - - #region Async Instructions - - /// - /// Returns an async that waits until the tween is killed or complete. - /// It can be used inside an async operation. - /// Example usage:await myTween.WaitForCompletion(); - /// - public static async System.Threading.Tasks.Task AsyncWaitForCompletion(this Tween t) - { - if (!t.active) { - if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t); - return; - } - while (t.active && !t.IsComplete()) await System.Threading.Tasks.Task.Yield(); - } - - /// - /// Returns an async that waits until the tween is killed or rewinded. - /// It can be used inside an async operation. - /// Example usage:await myTween.AsyncWaitForRewind(); - /// - public static async System.Threading.Tasks.Task AsyncWaitForRewind(this Tween t) - { - if (!t.active) { - if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t); - return; - } - while (t.active && (!t.playedOnce || t.position * (t.CompletedLoops() + 1) > 0)) await System.Threading.Tasks.Task.Yield(); - } - - /// - /// Returns an async that waits until the tween is killed. - /// It can be used inside an async operation. - /// Example usage:await myTween.AsyncWaitForKill(); - /// - public static async System.Threading.Tasks.Task AsyncWaitForKill(this Tween t) - { - if (!t.active) { - if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t); - return; - } - while (t.active) await System.Threading.Tasks.Task.Yield(); - } - - /// - /// Returns an async that waits until the tween is killed or has gone through the given amount of loops. - /// It can be used inside an async operation. - /// Example usage:await myTween.AsyncWaitForElapsedLoops(); - /// - /// Elapsed loops to wait for - public static async System.Threading.Tasks.Task AsyncWaitForElapsedLoops(this Tween t, int elapsedLoops) - { - if (!t.active) { - if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t); - return; - } - while (t.active && t.CompletedLoops() < elapsedLoops) await System.Threading.Tasks.Task.Yield(); - } - - /// - /// Returns an async that waits until the tween is killed or started - /// (meaning when the tween is set in a playing state the first time, after any eventual delay). - /// It can be used inside an async operation. - /// Example usage:await myTween.AsyncWaitForPosition(); - /// - /// Position (loops included, delays excluded) to wait for - public static async System.Threading.Tasks.Task AsyncWaitForPosition(this Tween t, float position) - { - if (!t.active) { - if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t); - return; - } - while (t.active && t.position * (t.CompletedLoops() + 1) < position) await System.Threading.Tasks.Task.Yield(); - } - - /// - /// Returns an async that waits until the tween is killed. - /// It can be used inside an async operation. - /// Example usage:await myTween.AsyncWaitForKill(); - /// - public static async System.Threading.Tasks.Task AsyncWaitForStart(this Tween t) - { - if (!t.active) { - if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t); - return; - } - while (t.active && !t.playedOnce) await System.Threading.Tasks.Task.Yield(); - } - - #endregion -#endif - - #endregion - - #endregion -#endif - } - - // █████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ - // ███ CLASSES █████████████████████████████████████████████████████████████████████████████████████████████████████████ - // █████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ - - public static class DOTweenCYInstruction - { - public class WaitForCompletion : CustomYieldInstruction - { - public override bool keepWaiting { get { - return t.active && !t.IsComplete(); - }} - readonly Tween t; - public WaitForCompletion(Tween tween) - { - t = tween; - } - } - - public class WaitForRewind : CustomYieldInstruction - { - public override bool keepWaiting { get { - return t.active && (!t.playedOnce || t.position * (t.CompletedLoops() + 1) > 0); - }} - readonly Tween t; - public WaitForRewind(Tween tween) - { - t = tween; - } - } - - public class WaitForKill : CustomYieldInstruction - { - public override bool keepWaiting { get { - return t.active; - }} - readonly Tween t; - public WaitForKill(Tween tween) - { - t = tween; - } - } - - public class WaitForElapsedLoops : CustomYieldInstruction - { - public override bool keepWaiting { get { - return t.active && t.CompletedLoops() < elapsedLoops; - }} - readonly Tween t; - readonly int elapsedLoops; - public WaitForElapsedLoops(Tween tween, int elapsedLoops) - { - t = tween; - this.elapsedLoops = elapsedLoops; - } - } - - public class WaitForPosition : CustomYieldInstruction - { - public override bool keepWaiting { get { - return t.active && t.position * (t.CompletedLoops() + 1) < position; - }} - readonly Tween t; - readonly float position; - public WaitForPosition(Tween tween, float position) - { - t = tween; - this.position = position; - } - } - - public class WaitForStart : CustomYieldInstruction - { - public override bool keepWaiting { get { - return t.active && !t.playedOnce; - }} - readonly Tween t; - public WaitForStart(Tween tween) - { - t = tween; - } - } - } -} diff --git a/Assets/DOTween/Modules/DOTweenModuleUnityVersion.cs.meta b/Assets/DOTween/Modules/DOTweenModuleUnityVersion.cs.meta deleted file mode 100644 index 78d2f44..0000000 --- a/Assets/DOTween/Modules/DOTweenModuleUnityVersion.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: c30601d6122da714ea28a9d7b1f1370c \ No newline at end of file diff --git a/Assets/DOTween/Modules/DOTweenModuleUtils.cs b/Assets/DOTween/Modules/DOTweenModuleUtils.cs deleted file mode 100644 index 12a365d..0000000 --- a/Assets/DOTween/Modules/DOTweenModuleUtils.cs +++ /dev/null @@ -1,167 +0,0 @@ -// Author: Daniele Giardini - http://www.demigiant.com -// Created: 2018/07/13 - -using System; -using System.Reflection; -using UnityEngine; -using DG.Tweening.Core; -using DG.Tweening.Plugins.Core.PathCore; -using DG.Tweening.Plugins.Options; - -#pragma warning disable 1591 -namespace DG.Tweening -{ - /// - /// Utility functions that deal with available Modules. - /// Modules defines: - /// - DOTAUDIO - /// - DOTPHYSICS - /// - DOTPHYSICS2D - /// - DOTSPRITE - /// - DOTUI - /// Extra defines set and used for implementation of external assets: - /// - DOTWEEN_TMP ► TextMesh Pro - /// - DOTWEEN_TK2D ► 2D Toolkit - /// - public static class DOTweenModuleUtils - { - static bool _initialized; - - #region Reflection - - /// - /// Called via Reflection by DOTweenComponent on Awake - /// -#if UNITY_2018_1_OR_NEWER - [UnityEngine.Scripting.Preserve] -#endif - public static void Init() - { - if (_initialized) return; - - _initialized = true; - DOTweenExternalCommand.SetOrientationOnPath += Physics.SetOrientationOnPath; - -#if UNITY_EDITOR -#if UNITY_4_3 || UNITY_4_4 || UNITY_4_5 || UNITY_4_6 || UNITY_5 || UNITY_2017_1 - UnityEditor.EditorApplication.playmodeStateChanged += PlaymodeStateChanged; -#else - UnityEditor.EditorApplication.playModeStateChanged += PlaymodeStateChanged; -#endif -#endif - } - -#if UNITY_2018_1_OR_NEWER -#pragma warning disable - [UnityEngine.Scripting.Preserve] - // Just used to preserve methods when building, never called - static void Preserver() - { - Assembly[] loadedAssemblies = AppDomain.CurrentDomain.GetAssemblies(); - MethodInfo mi = typeof(MonoBehaviour).GetMethod("Stub"); - } -#pragma warning restore -#endif - - #endregion - -#if UNITY_EDITOR - // Fires OnApplicationPause in DOTweenComponent even when Editor is paused (otherwise it's only fired at runtime) -#if UNITY_4_3 || UNITY_4_4 || UNITY_4_5 || UNITY_4_6 || UNITY_5 || UNITY_2017_1 - static void PlaymodeStateChanged() - #else - static void PlaymodeStateChanged(UnityEditor.PlayModeStateChange state) -#endif - { - if (DOTween.instance == null) return; - DOTween.instance.OnApplicationPause(UnityEditor.EditorApplication.isPaused); - } -#endif - - // █████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ - // ███ INTERNAL CLASSES ████████████████████████████████████████████████████████████████████████████████████████████████ - // █████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ - - public static class Physics - { - // Called via DOTweenExternalCommand callback - public static void SetOrientationOnPath(PathOptions options, Tween t, Quaternion newRot, Transform trans) - { -#if true // PHYSICS_MARKER - if (options.isRigidbody) ((Rigidbody)t.target).rotation = newRot; - else trans.rotation = newRot; -#else - trans.rotation = newRot; -#endif - } - - // Returns FALSE if the DOTween's Physics2D Module is disabled, or if there's no Rigidbody2D attached - public static bool HasRigidbody2D(Component target) - { -#if true // PHYSICS2D_MARKER - return target.GetComponent() != null; -#else - return false; -#endif - } - - #region Called via Reflection - - - // Called via Reflection by DOTweenPathInspector - // Returns FALSE if the DOTween's Physics Module is disabled, or if there's no rigidbody attached -#if UNITY_2018_1_OR_NEWER - [UnityEngine.Scripting.Preserve] -#endif - public static bool HasRigidbody(Component target) - { -#if true // PHYSICS_MARKER - return target.GetComponent() != null; -#else - return false; -#endif - } - - // Called via Reflection by DOTweenPath -#if UNITY_2018_1_OR_NEWER - [UnityEngine.Scripting.Preserve] -#endif - public static TweenerCore CreateDOTweenPathTween( - MonoBehaviour target, bool tweenRigidbody, bool isLocal, Path path, float duration, PathMode pathMode - ){ - TweenerCore t = null; - bool rBodyFoundAndTweened = false; -#if true // PHYSICS_MARKER - if (tweenRigidbody) { - Rigidbody rBody = target.GetComponent(); - if (rBody != null) { - rBodyFoundAndTweened = true; - t = isLocal - ? rBody.DOLocalPath(path, duration, pathMode) - : rBody.DOPath(path, duration, pathMode); - } - } -#endif -#if true // PHYSICS2D_MARKER - if (!rBodyFoundAndTweened && tweenRigidbody) { - Rigidbody2D rBody2D = target.GetComponent(); - if (rBody2D != null) { - rBodyFoundAndTweened = true; - t = isLocal - ? rBody2D.DOLocalPath(path, duration, pathMode) - : rBody2D.DOPath(path, duration, pathMode); - } - } -#endif - if (!rBodyFoundAndTweened) { - t = isLocal - ? target.transform.DOLocalPath(path, duration, pathMode) - : target.transform.DOPath(path, duration, pathMode); - } - return t; - } - - #endregion - } - } -} diff --git a/Assets/DOTween/Modules/DOTweenModuleUtils.cs.meta b/Assets/DOTween/Modules/DOTweenModuleUtils.cs.meta deleted file mode 100644 index 94ca152..0000000 --- a/Assets/DOTween/Modules/DOTweenModuleUtils.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: 1c73d7d121d6d754baf7637129fc5f53 \ No newline at end of file diff --git a/Assets/DOTween/readme.txt b/Assets/DOTween/readme.txt deleted file mode 100644 index 37ff7ef..0000000 --- a/Assets/DOTween/readme.txt +++ /dev/null @@ -1,29 +0,0 @@ -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 (Pro version only) - -// 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. -- 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 \ No newline at end of file diff --git a/Assets/DOTween/readme.txt.meta b/Assets/DOTween/readme.txt.meta deleted file mode 100644 index 83c40ab..0000000 --- a/Assets/DOTween/readme.txt.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: c2248aea0ebe1cf4b8f32453c9692fc5 -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/DOTween.meta b/Assets/Plugins.meta similarity index 77% rename from Assets/DOTween.meta rename to Assets/Plugins.meta index 107ab7e..a21e99c 100644 --- a/Assets/DOTween.meta +++ b/Assets/Plugins.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: f67d47da94dd9314dbba5ea80434dff0 +guid: c5225a17ca9835b4294886632c25de01 folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Assets/DOTween/Editor.meta b/Assets/Plugins/PrimeTween.meta similarity index 77% rename from Assets/DOTween/Editor.meta rename to Assets/Plugins/PrimeTween.meta index 9eccd8c..1421330 100644 --- a/Assets/DOTween/Editor.meta +++ b/Assets/Plugins/PrimeTween.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: c68793a92f3b1514faf4138d9d7cd066 +guid: da2e19a1c5f8b4e2ca7c1785ea338b2e folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Assets/Plugins/PrimeTween/PrimeTweenInstaller.asset b/Assets/Plugins/PrimeTween/PrimeTweenInstaller.asset new file mode 100644 index 0000000..e3d412e --- /dev/null +++ b/Assets/Plugins/PrimeTween/PrimeTweenInstaller.asset @@ -0,0 +1,19 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 118450fad714b420684eb5f984268b5c, type: 3} + m_Name: PrimeTweenInstaller + m_EditorClassIdentifier: + demoScene: {fileID: 102900000, guid: 13170347bc506405f88d3a87bd0982b3, type: 3} + demoSceneUrp: {fileID: 102900000, guid: 15054139658a5445689224c71f805b10, type: 3} + demoScenePro: {fileID: 102900000, guid: e8086c8f95dba534ca9bf16d3ce9ef31, type: 3} + demoSceneProUrp: {fileID: 102900000, guid: 2992e8ebf85ed47489b777c4d27b9952, type: 3} + uninstallButtonColor: {r: 1, g: 0.23113209, b: 0.2762581, a: 1} diff --git a/Assets/Plugins/PrimeTween/PrimeTweenInstaller.asset.meta b/Assets/Plugins/PrimeTween/PrimeTweenInstaller.asset.meta new file mode 100644 index 0000000..0987fe9 --- /dev/null +++ b/Assets/Plugins/PrimeTween/PrimeTweenInstaller.asset.meta @@ -0,0 +1,15 @@ +fileFormatVersion: 2 +guid: aafeeef745bb4406db1b2cd166853022 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 252960 + packageName: "PrimeTween \xB7 High-Performance Animations and Sequences" + packageVersion: 1.3.7 + assetPath: Assets/Plugins/PrimeTween/PrimeTweenInstaller.asset + uploadId: 860556 diff --git a/Assets/DOTween/Editor/Imgs.meta b/Assets/Plugins/PrimeTween/internal.meta similarity index 77% rename from Assets/DOTween/Editor/Imgs.meta rename to Assets/Plugins/PrimeTween/internal.meta index 9ccae7d..bd0e4c4 100644 --- a/Assets/DOTween/Editor/Imgs.meta +++ b/Assets/Plugins/PrimeTween/internal.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 2833224d328674142b6e584bcfa6486b +guid: f164d11d6323e46b786f187ecd84eb1b folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Assets/Plugins/PrimeTween/internal/PrimeTween.Installer.asmdef b/Assets/Plugins/PrimeTween/internal/PrimeTween.Installer.asmdef new file mode 100644 index 0000000..4bc81f0 --- /dev/null +++ b/Assets/Plugins/PrimeTween/internal/PrimeTween.Installer.asmdef @@ -0,0 +1,29 @@ +{ + "name": "PrimeTween.Installer", + "rootNamespace": "", + "references": [ + "PrimeTween.Runtime" + ], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [ + { + "name": "com.kyrylokuzyk.primetween", + "expression": "1.0.0", + "define": "PRIME_TWEEN_INSTALLED" + }, + { + "name": "com.kyrylokuzyk.primetween", + "expression": "[1.3.6-pro]", + "define": "PRIME_TWEEN_PRO" + } + ], + "noEngineReferences": false +} \ No newline at end of file diff --git a/Assets/Plugins/PrimeTween/internal/PrimeTween.Installer.asmdef.meta b/Assets/Plugins/PrimeTween/internal/PrimeTween.Installer.asmdef.meta new file mode 100644 index 0000000..f8314f4 --- /dev/null +++ b/Assets/Plugins/PrimeTween/internal/PrimeTween.Installer.asmdef.meta @@ -0,0 +1,14 @@ +fileFormatVersion: 2 +guid: 090d70c1ebac0421985bd70fa7f561ef +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 252960 + packageName: "PrimeTween \xB7 High-Performance Animations and Sequences" + packageVersion: 1.3.7 + assetPath: Assets/Plugins/PrimeTween/internal/PrimeTween.Installer.asmdef + uploadId: 860556 diff --git a/Assets/Plugins/PrimeTween/internal/PrimeTweenInstaller.cs b/Assets/Plugins/PrimeTween/internal/PrimeTweenInstaller.cs new file mode 100644 index 0000000..48c7f27 --- /dev/null +++ b/Assets/Plugins/PrimeTween/internal/PrimeTweenInstaller.cs @@ -0,0 +1,548 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Reflection.Emit; +using System.Text; +using System.Text.RegularExpressions; +using UnityEditor; +using UnityEditor.PackageManager; +using UnityEditor.SceneManagement; +using UnityEngine; +using UnityEngine.Assertions; +using UnityEngine.Rendering; +using static UnityEngine.GUILayout; +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("PrimeTween.Internal")] + +namespace PrimeTween { + internal class PrimeTweenInstaller : ScriptableObject { + [SerializeField] internal SceneAsset demoScene; + [SerializeField] internal SceneAsset demoSceneUrp; + [SerializeField] internal SceneAsset demoScenePro; + [SerializeField] internal SceneAsset demoSceneProUrp; + [SerializeField] internal Color uninstallButtonColor; + + [ContextMenu(nameof(ResetReviewRequest))] void ResetReviewRequest() => ReviewRequest.ResetReviewRequest(); + [ContextMenu(nameof(DebugReviewRequest))] void DebugReviewRequest() => ReviewRequest.DebugReviewRequest(); + } + + [CustomEditor(typeof(PrimeTweenInstaller), false)] + internal class InstallerInspector : Editor { + internal const string pluginName = "PrimeTween"; + internal const string pluginPackageId = "com.kyrylokuzyk.primetween"; + internal const string tgzPath = "Assets/Plugins/PrimeTween/internal/com.kyrylokuzyk.primetween.tgz"; + internal const string newTgzPath = "Assets/Plugins/PrimeTween/internal/com.kyrylokuzyk.primetween-" + version + ".tgz"; + const string documentationUrl = "https://github.com/KyryloKuzyk/PrimeTween"; + bool isInstalled; + bool hasNewTgz; + GUIStyle boldButtonStyle; + GUIStyle uninstallButtonStyle; + GUIStyle wordWrapLabelStyle; + + void OnEnable() { + isInstalled = CheckPluginInstalled(); + hasNewTgz = File.Exists(newTgzPath); + } + + /// Use Package Manager because Unity 2018 doesn't support version defines + static bool CheckPluginInstalled() { + var listRequest = Client.List(true); + while (!listRequest.IsCompleted) { + } + return listRequest.Result.Any(_ => _.name == pluginPackageId); + } + + public override void OnInspectorGUI() { + if (boldButtonStyle == null) { + boldButtonStyle = new GUIStyle(GUI.skin.button) { fontStyle = FontStyle.Bold }; + } + var installer = (PrimeTweenInstaller)target; + if (uninstallButtonStyle == null) { + uninstallButtonStyle = new GUIStyle(GUI.skin.button) { normal = { textColor = installer.uninstallButtonColor } }; + } + if (wordWrapLabelStyle == null) { + wordWrapLabelStyle = new GUIStyle(GUI.skin.label) { wordWrap = true, richText = true, margin = new RectOffset(4, 4, 8, 8) }; + } + EditorGUI.indentLevel = 5; + Space(8); + Label(pluginName, EditorStyles.boldLabel); + Space(4); + if (!isInstalled) { + if (Button("Install " + pluginName)) { + installPlugin(); + } + return; + } + if (hasNewTgz) { + if (Button($"Update to {version}", boldButtonStyle)) { + ReviewRequest.OnPackageUpdate(); + } + Space(8); + } + if (Button("Documentation", boldButtonStyle)) { + Application.OpenURL(documentationUrl); + } + + Space(8); + var rpAsset = GraphicsSettings. + #if UNITY_2019_3_OR_NEWER + defaultRenderPipeline; + #else + renderPipelineAsset; + #endif + bool isUrp = rpAsset != null && rpAsset.GetType().Name.Contains("Universal"); + if (Button("Open Demo", boldButtonStyle)) { + var demoScene = isUrp ? installer.demoSceneUrp : installer.demoScene; + if (demoScene == null) { + Debug.LogError("Please re-import the plugin from Asset Store and import the 'Demo' folder.\n"); + return; + } + string path = AssetDatabase.GetAssetPath(demoScene); + EditorSceneManager.OpenScene(path); + } + #if PRIME_TWEEN_PRO + if (Button("Open Demo (Pro)", boldButtonStyle)) { + var demoScene = isUrp ? installer.demoSceneProUrp : installer.demoScenePro; + if (demoScene == null) { + Debug.LogError("Please re-import the plugin from Asset Store and import the 'Demo' folder.\n"); + return; + } + string path = AssetDatabase.GetAssetPath(demoScene); + EditorSceneManager.OpenScene(path); + } + #endif + #if UNITY_2019_4_OR_NEWER + if (Button("Import Basic Examples")) { + EditorUtility.DisplayDialog(pluginName, $"Please select the '{pluginName}' package in 'Package Manager', then press the 'Samples/Import' button at the bottom of the plugin's description.", "Ok"); + UnityEditor.PackageManager.UI.Window.Open(pluginPackageId); + } + #endif + if (Button("Support")) { + Application.OpenURL("https://github.com/KyryloKuzyk/PrimeTween#support"); + } + + Space(8); + if (Button("Uninstall", uninstallButtonStyle)) { + Client.Remove(pluginPackageId); + isInstalled = false; + var msg = $"Please remove the folder manually to uninstall {pluginName} completely: 'Assets/Plugins/{pluginName}'"; + EditorUtility.DisplayDialog(pluginName, msg, "Ok"); + Debug.Log(msg); + } + + if (EditorPrefs.GetBool(InsertCallbackBug.showInsertCallbackBugUi, false)) { + Space(24); + Label("Updating from PrimeTween [1.1.10 - 1.1.22]", EditorStyles.boldLabel); + Label("The behaviour of 'Sequence.ChainCallback()' and 'InsertCallback()' was fixed in PrimeTween 1.2.0 so the code written with older versions may work differently in some cases.", wordWrapLabelStyle); + if (Button("Find potential issues")) { + InsertCallbackBug.Find(); + } + BeginHorizontal(); + if (Button("More info")) { + Application.OpenURL(InsertCallbackBug.moreInfoUrl); + } + if (Button("Download version 1.1.22")) { + Application.OpenURL("https://github.com/KyryloKuzyk/PrimeTween/blob/545dcc52769d52841e282c772e98c8984bfeb243/Benchmarks/Packages/com.kyrylokuzyk.primetween.tgz"); + } + EndHorizontal(); + } + + Space(24); + Label("Enjoying PrimeTween?", EditorStyles.boldLabel); + Label("Consider leaving an honest review and starring PrimeTween on GitHub!\n\n" + + "Honest reviews make PrimeTween better and help other developers discover it.", wordWrapLabelStyle); + if (Button("Leave review!", GUI.skin.button)) { + ReviewRequest.DisableReviewRequest(); + ReviewRequest.OpenReviewsURL(); + } + } + + static void installPlugin() { + if (File.Exists(newTgzPath)) { + MoveAndRenameTgzArchive(); + } + + ReviewRequest.OnBeforeInstall(); + var path = $"file:../{tgzPath}"; + var addRequest = Client.Add(path); + while (!addRequest.IsCompleted) { + } + if (addRequest.Status == StatusCode.Success) { + Debug.Log($"{pluginName} installed successfully.\n" + + $"Offline documentation is located at Packages/{pluginName}/Documentation.md.\n" + + $"Online documentation: {documentationUrl}\n"); + } else { + Debug.LogError($"Please re-import the plugin from the Asset Store and check that the file exists: [{path}].\n\n{addRequest.Error?.message}\n"); + } + } + + internal static void MoveAndRenameTgzArchive() { + Assert.IsTrue(File.Exists(newTgzPath)); + Assert.IsTrue(File.Exists(newTgzPath + ".meta")); + File.Delete(tgzPath); + File.Delete(tgzPath + ".meta"); + File.Move(newTgzPath, tgzPath); + File.Move(newTgzPath + ".meta", tgzPath + ".meta"); + RevertTgzMeta(); + } + + static void RevertTgzMeta() { + const string path = tgzPath + ".meta"; + Assert.IsTrue(File.Exists(path), path); + File.WriteAllText(path, @"fileFormatVersion: 2 +guid: cdd0c4b9889044d73bc958a922ada300 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: +"); + } + + [InitializeOnLoadMethod] + static void InitOnLoad() { + AssetDatabase.importPackageCompleted += name => { + if (name.Contains(pluginName)) { + if (CheckPluginInstalled()) { + ReviewRequest.OnPackageUpdate(); + } else { + var installer = AssetDatabase.LoadAssetAtPath("Assets/Plugins/PrimeTween/PrimeTweenInstaller.asset"); + EditorUtility.FocusProjectWindow(); // this is important to show the installer object in the Project window + Selection.activeObject = installer; + EditorGUIUtility.PingObject(installer); + EditorApplication.update += InstallAndUnsubscribeFromUpdate; + void InstallAndUnsubscribeFromUpdate() { + EditorApplication.update -= InstallAndUnsubscribeFromUpdate; + installPlugin(); + } + } + } + }; + } + + internal const string version = "1.3.8"; + } + + internal static class FixedUpdateParameterMigration { + internal static string[] FindLocalScriptGuids() { + var listRequest = Client.List(true); + while (!listRequest.IsCompleted) { + } + Assert.AreEqual(StatusCode.Success, listRequest.Status); + string[] folders = listRequest.Result + .Where(x => x.source == PackageSource.Embedded || x.source == PackageSource.Local) + .Where(x => x.name != InstallerInspector.pluginPackageId) + .Select(x => x.assetPath) + .Append("Assets") + .ToArray(); + return AssetDatabase.FindAssets("t:Script", folders); + } + + internal static bool Process(string[] scripts, bool? fixAutomatically = null) { + var logSb = new StringBuilder(); + var fileSb = new StringBuilder(); + foreach (string guid in scripts) + { + string path = AssetDatabase.GUIDToAssetPath(guid); + var textAsset = AssetDatabase.LoadAssetAtPath(path); + string text = textAsset.text; + if (!Regex.IsMatch(text, @"using PrimeTween\s*;")) { + continue; + } + var parameterMatches = Regex.Matches(text, @"useFixedUpdate\s*:"); + if (parameterMatches.Count > 0) { + if (!fixAutomatically.HasValue) { + return true; + } + logSb.Clear(); + if (fixAutomatically.Value) { + fileSb.Clear(); + fileSb.Append(text); + for (int i = parameterMatches.Count - 1; i >= 0; i--) { + var paramMatch = parameterMatches[i]; + fileSb.Remove(paramMatch.Index, paramMatch.Length); + fileSb.Insert(paramMatch.Index, "updateType:"); + } + File.WriteAllText(path, fileSb.ToString()); + logSb.Append($"PrimeTween automatically renamed ({parameterMatches.Count}) occurrences of 'useFixedUpdate' to 'updateType' in file '{textAsset.name}.cs':\n"); + } else { + logSb.Append($"PrimeTween: please rename ({parameterMatches.Count}) occurrences of 'useFixedUpdate' to 'updateType' in file '{textAsset.name}.cs':\n"); + } + var lineMatches = Regex.Matches(text, @"(?m)^.*useFixedUpdate\s*:.*$", RegexOptions.Multiline); + foreach (Match match in lineMatches) { + logSb.Append($"{match.Value.Trim().Replace("useFixedUpdate", "useFixedUpdate")}\n"); + } + Debug.unityLogger.Log(fixAutomatically.Value ? LogType.Warning : LogType.Error, logSb.ToString()); + } + } + // no need to call AssetDatabase.Refresh() here because MoveAndRenameTgzArchive() already does that + return false; + } + } + + internal static class ReviewRequest { + const string version = InstallerInspector.version; + const string canAskKey = "PrimeTween.canAskForReview"; + const string versionKey = "PrimeTween.version"; + + internal static void OnPackageUpdate() { + log("OnPackageUpdate"); + if (!File.Exists(InstallerInspector.newTgzPath)) { + Debug.LogError($"The installation archive is missing: '{InstallerInspector.newTgzPath}'. Please re-import PrimeTween from Asset Store."); + return; + } + bool shouldAskForReview = true; + var scriptGuids = FixedUpdateParameterMigration.FindLocalScriptGuids(); + if (FixedUpdateParameterMigration.Process(scriptGuids)) { + shouldAskForReview = false; + const string msg = "'bool useFixedUpdate' parameter was changed to 'UpdateType updateType' in version 1.3.0, which will cause breaking changes in your current project.\n" + + "PrimeTween can fix the breaking changes automatically, or you can fix them manually after the update.\n"; + Debug.LogWarning($"PrimeTween: the {msg}"); + int response = EditorUtility.DisplayDialogComplex($"{InstallerInspector.pluginName} {version}", + $"The {msg}", + "Fix automatically", + "Cancel", + "Fix manually"); + string cancelMessage = $"PrimeTween: update to {version} was cancelled. You can trigger update manually from 'Assets/Plugins/PrimeTween/PrimeTweenInstaller'."; + if (response == 1) { + Debug.LogWarning(cancelMessage); + return; + } + if (!EditorUtility.DisplayDialog($"{InstallerInspector.pluginName} {version}", "Please back up your project before proceeding.", "OK", "Cancel")) { + Debug.LogWarning(cancelMessage); + return; + } + bool fixAutomatically = response == 0; + FixedUpdateParameterMigration.Process(scriptGuids, fixAutomatically); + } + InstallerInspector.MoveAndRenameTgzArchive(); + if (UNITY_2018) { + var removeRequest = Client.Remove(InstallerInspector.pluginPackageId); + while (!removeRequest.IsCompleted) { + } + string path = $"file:../{InstallerInspector.tgzPath}"; + Client.Add(path); + } else { + EditorApplication.ExecuteMenuItem("Assets/Refresh"); // AssetDatabase.Refresh() refreshes the project only partially + } + + string prevVersion = savedVersion; + if (savedVersion == version) { + log($"same version {version}"); + return; + } + savedVersion = version; + + if (InsertCallbackBug.IsUpdatingFromVersionWithBug(prevVersion)) { + InsertCallbackBug.Find(); + EditorPrefs.SetBool(InsertCallbackBug.showInsertCallbackBugUi, true); + shouldAskForReview = false; + } else { + EditorPrefs.SetBool(InsertCallbackBug.showInsertCallbackBugUi, false); + } + log($"updated from version {prevVersion} to {version}, {nameof(shouldAskForReview)}: {shouldAskForReview}"); + if (shouldAskForReview) { + TryAskForReview(); + } + } + + static bool UNITY_2018 { + get { + #if UNITY_2018 + return true; + #else + return false; + #endif + } + } + + static void TryAskForReview() { + if (!EditorPrefs.GetBool(canAskKey, true)) { + log("can't ask"); + return; + } + DisableReviewRequest(); + var response = EditorUtility.DisplayDialogComplex("Enjoying PrimeTween?", + "Would you mind to leave an honest review on Asset store? Honest reviews make PrimeTween better and help other developers discover it.", + "Sure, leave a review!", + "Never ask again", + ""); + if (response == 0) { + OpenReviewsURL(); + } + } + + internal static void OnBeforeInstall() { + log($"OnBeforeInstall {version}"); + if (string.IsNullOrEmpty(savedVersion)) { + savedVersion = version; + } + } + + static string savedVersion { + get => EditorPrefs.GetString(versionKey); + set => EditorPrefs.SetString(versionKey, value); + } + + internal static void DisableReviewRequest() => EditorPrefs.SetBool(canAskKey, false); + internal static void OpenReviewsURL() => Application.OpenURL("https://assetstore.unity.com/packages/slug/252960#reviews"); + + internal static void ResetReviewRequest() { + Debug.Log(nameof(ResetReviewRequest)); + EditorPrefs.DeleteKey(versionKey); + EditorPrefs.DeleteKey(canAskKey); + } + + internal static void DebugReviewRequest() { + Debug.Log(nameof(DebugReviewRequest)); + savedVersion = "1.1.22"; + EditorPrefs.SetBool(canAskKey, false); + // TryAskForReview(); + } + + [System.Diagnostics.Conditional("_")] + static void log(string msg) { + Debug.Log($"ReviewRequest: {msg}"); + } + } + + internal static class InsertCallbackBug { + internal const string moreInfoUrl = "https://github.com/KyryloKuzyk/PrimeTween/discussions/112"; + internal const string showInsertCallbackBugUi = "PrimeTween.showInsertCallbackBugUi"; + static Dictionary OpCodeDict; + static MethodInfo[] methodsWithBug; + static MethodInfo[] groupMethods; + + internal static bool IsUpdatingFromVersionWithBug(string prevVersionString) { + if (Version.TryParse(prevVersionString, out var prevVersion) + && new Version(1, 1, 10) <= prevVersion + && prevVersion <= new Version(1, 1, 22) + ) { + return true; + } + return false; + } + + internal static void Find() { + OpCodeDict = typeof(OpCodes) + .GetFields(BindingFlags.Public | BindingFlags.Static) + .Select(x => (OpCode)x.GetValue(null)) + .ToDictionary(x => x.Value, x => x); + #if PRIME_TWEEN_INSTALLED + methodsWithBug = typeof(Sequence).GetMethods(BindingFlags.Public | BindingFlags.Instance) + .Where(methodInfo => methodInfo.Name == nameof(Sequence.ChainCallback) || methodInfo.Name == nameof(Sequence.InsertCallback)) + .Select(methodInfo => methodInfo.IsGenericMethod ? methodInfo.GetGenericMethodDefinition() : methodInfo) + .ToArray(); + Assert.AreEqual(4, methodsWithBug.Length); + groupMethods = typeof(Sequence).GetMethods(BindingFlags.Public | BindingFlags.Instance) + .Where(methodInfo => methodInfo.Name == nameof(Sequence.Group)) + .ToArray(); + #endif + Assert.AreEqual(2, groupMethods.Length); + + string methodAssemblyName = methodsWithBug[0].Module.Assembly.FullName; + const BindingFlags findAll = BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static; + int numPotentialIssues = AppDomain.CurrentDomain.GetAssemblies() + .Where(assembly => assembly.GetReferencedAssemblies().Any(dependency => dependency.FullName == methodAssemblyName)) + .Where(assembly => !assembly.GetName().Name.StartsWith("PrimeTween.", StringComparison.Ordinal)) + .SelectMany(assembly => assembly.GetTypes()) + .SelectMany(type => type.GetMethods(findAll).Cast().Union(type.GetConstructors(findAll))) + .Count(method => FindInMethod(method)); + if (numPotentialIssues == 0) { + Debug.Log($"PrimeTween updated to version {InstallerInspector.version}: no potential issues found in ChainCallback() and InsertCallback() usages.\n" + + $"More info: {moreInfoUrl}\n"); + } + + int updateResponse = EditorUtility.DisplayDialogComplex($"{InstallerInspector.pluginName} {InstallerInspector.version}", + "PrimeTween 1.2.0 fixed a bug in ChainCallback() and InsertCallback() methods.\n" + + "This fix may introduce breaking changes in the existing projects. Please see the Console output for more details.", + "More info", + "Close", + ""); + if (updateResponse == 0) { + Application.OpenURL(moreInfoUrl); + } + } + + /// https://stackoverflow.com/a/33034906/1951038 + static bool FindInMethod(MethodBase method) { + byte[] il = method.GetMethodBody()?.GetILAsByteArray(); + if (il == null) { + return false; + } + bool bugFound = false; + using (var br = new BinaryReader(new MemoryStream(il))) { + while (br.BaseStream.Position < br.BaseStream.Length) { + byte firstByte = br.ReadByte(); + short opCodeValue = firstByte == 0xFE ? BitConverter.ToInt16(new[] { br.ReadByte(), firstByte }, 0) : firstByte; + OpCode opCode = OpCodeDict[opCodeValue]; + switch (opCode.OperandType) { + case OperandType.ShortInlineBrTarget: + case OperandType.ShortInlineVar: + case OperandType.ShortInlineI: + br.ReadByte(); + break; + case OperandType.InlineVar: + br.ReadInt16(); + break; + case OperandType.InlineField: + case OperandType.InlineType: + case OperandType.ShortInlineR: + case OperandType.InlineString: + case OperandType.InlineSig: + case OperandType.InlineI: + case OperandType.InlineBrTarget: + br.ReadInt32(); + break; + case OperandType.InlineI8: + case OperandType.InlineR: + br.ReadInt64(); + break; + case OperandType.InlineSwitch: + var size = (int)br.ReadUInt32(); + br.ReadBytes(size * 4); + break; + case OperandType.InlineTok: + br.ReadUInt32(); + break; + case OperandType.InlineMethod: + int token = (int)br.ReadUInt32(); + if (method.Module.ResolveMethod(token) is MethodInfo resolvedMethod) { + if (bugFound) { + if (groupMethods.Contains(resolvedMethod)) { + Debug.LogError($"PrimeTween updated to version {InstallerInspector.version}: potential breaking change found in the '{method.DeclaringType}.{method.Name}()' method.\n" + + "Please double-check the behavior if Group() is called immediately after the ChainCallback() or InsertCallback() and apply the fix manually if necessary.\n" + + "Or use ChainCallbackObsolete/InsertCallbackObsolete() instead to preserve the old incorrect behavior.\n" + + $"More info: {moreInfoUrl}\n"); + return true; + } + } else { + bugFound = isMethodWithBug(resolvedMethod); + } + } + break; + case OperandType.InlineNone: + break; + default: + throw new Exception(); + } + } + } + return false; + } + + static bool isMethodWithBug(MethodInfo method) { + foreach (var methodWithBug in methodsWithBug) { + if (methodWithBug.IsGenericMethodDefinition && method.IsGenericMethod) { + if (methodWithBug == method.GetGenericMethodDefinition()) { + return true; + } + } else if (methodWithBug == method) { + return true; + } + } + return false; + } + } +} diff --git a/Assets/Plugins/PrimeTween/internal/PrimeTweenInstaller.cs.meta b/Assets/Plugins/PrimeTween/internal/PrimeTweenInstaller.cs.meta new file mode 100644 index 0000000..7b878a7 --- /dev/null +++ b/Assets/Plugins/PrimeTween/internal/PrimeTweenInstaller.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 118450fad714b420684eb5f984268b5c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 252960 + packageName: "PrimeTween \xB7 High-Performance Animations and Sequences" + packageVersion: 1.3.7 + assetPath: Assets/Plugins/PrimeTween/internal/PrimeTweenInstaller.cs + uploadId: 860556 diff --git a/Assets/Plugins/PrimeTween/internal/com.kyrylokuzyk.primetween.tgz b/Assets/Plugins/PrimeTween/internal/com.kyrylokuzyk.primetween.tgz new file mode 100644 index 0000000000000000000000000000000000000000..9278ac0fd7cac150cea1f1dc24330249135e101a GIT binary patch literal 384502 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