From c0535653573fab8ecbb3adf6aa42ca4f8ad32170 Mon Sep 17 00:00:00 2001 From: Newg Date: Sat, 23 Sep 2023 13:52:20 -0400 Subject: [PATCH] Update --- InsAsterix/Assets/Entity.cs | 10 + InsAsterix/Assets/Entity.cs.meta | 11 + InsAsterix/Assets/NewInputPlatformer.cs | 303 ++ InsAsterix/Assets/NewInputPlatformer.cs.meta | 11 + InsAsterix/Assets/Obelix-Sheet.png | Bin 0 -> 20579 bytes InsAsterix/Assets/Obelix-Sheet.png.meta | 1015 ++++++ InsAsterix/Assets/PlatformerController.cs | 176 + .../Assets/PlatformerController.cs.meta | 11 + InsAsterix/Assets/Player.meta | 8 + InsAsterix/Assets/Player/Animations.meta | 8 + .../Assets/Player/Animations/Attack.anim | 83 + .../Assets/Player/Animations/Attack.anim.meta | 8 + .../Assets/Player/Animations/Crouch.anim | 328 ++ .../Assets/Player/Animations/Crouch.anim.meta | 8 + InsAsterix/Assets/Player/Animations/Idle.anim | 86 + .../Assets/Player/Animations/Idle.anim.meta | 8 + InsAsterix/Assets/Player/Animations/Jump.anim | 89 + .../Assets/Player/Animations/Jump.anim.meta | 8 + InsAsterix/Assets/Player/Animations/Run.anim | 95 + .../Assets/Player/Animations/Run.anim.meta | 8 + .../Assets/Player/Animations/Slide.anim | 202 ++ .../Assets/Player/Animations/Slide.anim.meta | 8 + InsAsterix/Assets/Player/Animations/Walk.anim | 95 + .../Assets/Player/Animations/Walk.anim.meta | 8 + InsAsterix/Assets/Player/Player.controller | 275 ++ .../Assets/Player/Player.controller.meta | 8 + InsAsterix/Assets/PlayerActions.inputactions | 973 ++++++ .../Assets/PlayerActions.inputactions.meta | 14 + InsAsterix/Assets/PlayerControls.cs | 181 + InsAsterix/Assets/PlayerControls.cs.meta | 11 + InsAsterix/Assets/Plugins.meta | 8 + InsAsterix/Assets/Plugins/Demigiant.meta | 8 + .../Assets/Plugins/Demigiant/DOTween.meta | 21 + .../Plugins/Demigiant/DOTween/DOTween.XML | 3077 +++++++++++++++++ .../Demigiant/DOTween/DOTween.XML.meta | 4 + .../Plugins/Demigiant/DOTween/DOTween.dll | Bin 0 -> 175104 bytes .../Demigiant/DOTween/DOTween.dll.meta | 22 + .../Plugins/Demigiant/DOTween/Editor.meta | 5 + .../DOTween/Editor/DOTweenEditor.XML | 124 + .../DOTween/Editor/DOTweenEditor.XML.meta | 4 + .../DOTween/Editor/DOTweenEditor.dll | Bin 0 -> 69632 bytes .../DOTween/Editor/DOTweenEditor.dll.meta | 22 + .../Demigiant/DOTween/Editor/Imgs.meta | 5 + .../DOTween/Editor/Imgs/DOTweenIcon.png | Bin 0 -> 1565 bytes .../DOTween/Editor/Imgs/DOTweenIcon.png.meta | 47 + .../DOTween/Editor/Imgs/DOTweenMiniIcon.png | Bin 0 -> 319 bytes .../Editor/Imgs/DOTweenMiniIcon.png.meta | 68 + .../Demigiant/DOTween/Editor/Imgs/Footer.png | Bin 0 -> 4409 bytes .../DOTween/Editor/Imgs/Footer.png.meta | 47 + .../DOTween/Editor/Imgs/Footer_dark.png | Bin 0 -> 4429 bytes .../DOTween/Editor/Imgs/Footer_dark.png.meta | 47 + .../Demigiant/DOTween/Editor/Imgs/Header.jpg | Bin 0 -> 22787 bytes .../DOTween/Editor/Imgs/Header.jpg.meta | 47 + .../Plugins/Demigiant/DOTween/Modules.meta | 5 + .../DOTween/Modules/DOTweenModuleAudio.cs | 198 ++ .../Modules/DOTweenModuleAudio.cs.meta | 8 + .../Modules/DOTweenModuleEPOOutline.cs | 146 + .../Modules/DOTweenModuleEPOOutline.cs.meta | 12 + .../DOTween/Modules/DOTweenModulePhysics.cs | 216 ++ .../Modules/DOTweenModulePhysics.cs.meta | 8 + .../DOTween/Modules/DOTweenModulePhysics2D.cs | 193 ++ .../Modules/DOTweenModulePhysics2D.cs.meta | 8 + .../DOTween/Modules/DOTweenModuleSprite.cs | 93 + .../Modules/DOTweenModuleSprite.cs.meta | 8 + .../DOTween/Modules/DOTweenModuleUI.cs | 662 ++++ .../DOTween/Modules/DOTweenModuleUI.cs.meta | 8 + .../Modules/DOTweenModuleUnityVersion.cs | 389 +++ .../Modules/DOTweenModuleUnityVersion.cs.meta | 8 + .../DOTween/Modules/DOTweenModuleUtils.cs | 167 + .../Modules/DOTweenModuleUtils.cs.meta | 8 + .../Plugins/Demigiant/DOTween/readme.txt | 29 + .../Plugins/Demigiant/DOTween/readme.txt.meta | 4 + InsAsterix/Assets/Plugins/Sirenix.meta | 8 + .../Plugins/Sirenix/Odin Validator.meta | 8 + .../Sirenix/Odin Validator/Editor.meta | 8 + .../Sirenix/Odin Validator/Editor/Config.meta | 8 + .../Config/GlobalValidationConfig.asset | 84 + .../Config/GlobalValidationConfig.asset.meta | 8 + .../Odin Validator/Editor/Profiles.meta | 8 + .../Editor/Profiles/Main Profile.asset | 65 + .../Editor/Profiles/Main Profile.asset.meta | 8 + InsAsterix/Assets/Resources.meta | 8 + .../Assets/Resources/DOTweenSettings.asset | 54 + .../Resources/DOTweenSettings.asset.meta | 8 + InsAsterix/Assets/Scenes/Sandbox Gwen.unity | 32 +- 85 files changed, 10077 insertions(+), 5 deletions(-) create mode 100644 InsAsterix/Assets/Entity.cs create mode 100644 InsAsterix/Assets/Entity.cs.meta create mode 100644 InsAsterix/Assets/NewInputPlatformer.cs create mode 100644 InsAsterix/Assets/NewInputPlatformer.cs.meta create mode 100644 InsAsterix/Assets/Obelix-Sheet.png create mode 100644 InsAsterix/Assets/Obelix-Sheet.png.meta create mode 100644 InsAsterix/Assets/PlatformerController.cs create mode 100644 InsAsterix/Assets/PlatformerController.cs.meta create mode 100644 InsAsterix/Assets/Player.meta create mode 100644 InsAsterix/Assets/Player/Animations.meta create mode 100644 InsAsterix/Assets/Player/Animations/Attack.anim create mode 100644 InsAsterix/Assets/Player/Animations/Attack.anim.meta create mode 100644 InsAsterix/Assets/Player/Animations/Crouch.anim create mode 100644 InsAsterix/Assets/Player/Animations/Crouch.anim.meta create mode 100644 InsAsterix/Assets/Player/Animations/Idle.anim create mode 100644 InsAsterix/Assets/Player/Animations/Idle.anim.meta create mode 100644 InsAsterix/Assets/Player/Animations/Jump.anim create mode 100644 InsAsterix/Assets/Player/Animations/Jump.anim.meta create mode 100644 InsAsterix/Assets/Player/Animations/Run.anim create mode 100644 InsAsterix/Assets/Player/Animations/Run.anim.meta create mode 100644 InsAsterix/Assets/Player/Animations/Slide.anim create mode 100644 InsAsterix/Assets/Player/Animations/Slide.anim.meta create mode 100644 InsAsterix/Assets/Player/Animations/Walk.anim create mode 100644 InsAsterix/Assets/Player/Animations/Walk.anim.meta create mode 100644 InsAsterix/Assets/Player/Player.controller create mode 100644 InsAsterix/Assets/Player/Player.controller.meta create mode 100644 InsAsterix/Assets/PlayerActions.inputactions create mode 100644 InsAsterix/Assets/PlayerActions.inputactions.meta create mode 100644 InsAsterix/Assets/PlayerControls.cs create mode 100644 InsAsterix/Assets/PlayerControls.cs.meta create mode 100644 InsAsterix/Assets/Plugins.meta create mode 100644 InsAsterix/Assets/Plugins/Demigiant.meta create mode 100644 InsAsterix/Assets/Plugins/Demigiant/DOTween.meta create mode 100644 InsAsterix/Assets/Plugins/Demigiant/DOTween/DOTween.XML create mode 100644 InsAsterix/Assets/Plugins/Demigiant/DOTween/DOTween.XML.meta create mode 100644 InsAsterix/Assets/Plugins/Demigiant/DOTween/DOTween.dll create mode 100644 InsAsterix/Assets/Plugins/Demigiant/DOTween/DOTween.dll.meta create mode 100644 InsAsterix/Assets/Plugins/Demigiant/DOTween/Editor.meta create mode 100644 InsAsterix/Assets/Plugins/Demigiant/DOTween/Editor/DOTweenEditor.XML create mode 100644 InsAsterix/Assets/Plugins/Demigiant/DOTween/Editor/DOTweenEditor.XML.meta create mode 100644 InsAsterix/Assets/Plugins/Demigiant/DOTween/Editor/DOTweenEditor.dll create mode 100644 InsAsterix/Assets/Plugins/Demigiant/DOTween/Editor/DOTweenEditor.dll.meta create mode 100644 InsAsterix/Assets/Plugins/Demigiant/DOTween/Editor/Imgs.meta create mode 100644 InsAsterix/Assets/Plugins/Demigiant/DOTween/Editor/Imgs/DOTweenIcon.png create mode 100644 InsAsterix/Assets/Plugins/Demigiant/DOTween/Editor/Imgs/DOTweenIcon.png.meta create mode 100644 InsAsterix/Assets/Plugins/Demigiant/DOTween/Editor/Imgs/DOTweenMiniIcon.png create mode 100644 InsAsterix/Assets/Plugins/Demigiant/DOTween/Editor/Imgs/DOTweenMiniIcon.png.meta create mode 100644 InsAsterix/Assets/Plugins/Demigiant/DOTween/Editor/Imgs/Footer.png create mode 100644 InsAsterix/Assets/Plugins/Demigiant/DOTween/Editor/Imgs/Footer.png.meta create mode 100644 InsAsterix/Assets/Plugins/Demigiant/DOTween/Editor/Imgs/Footer_dark.png create mode 100644 InsAsterix/Assets/Plugins/Demigiant/DOTween/Editor/Imgs/Footer_dark.png.meta create mode 100644 InsAsterix/Assets/Plugins/Demigiant/DOTween/Editor/Imgs/Header.jpg create mode 100644 InsAsterix/Assets/Plugins/Demigiant/DOTween/Editor/Imgs/Header.jpg.meta create mode 100644 InsAsterix/Assets/Plugins/Demigiant/DOTween/Modules.meta create mode 100644 InsAsterix/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleAudio.cs create mode 100644 InsAsterix/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleAudio.cs.meta create mode 100644 InsAsterix/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleEPOOutline.cs create mode 100644 InsAsterix/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleEPOOutline.cs.meta create mode 100644 InsAsterix/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModulePhysics.cs create mode 100644 InsAsterix/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModulePhysics.cs.meta create mode 100644 InsAsterix/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModulePhysics2D.cs create mode 100644 InsAsterix/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModulePhysics2D.cs.meta create mode 100644 InsAsterix/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleSprite.cs create mode 100644 InsAsterix/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleSprite.cs.meta create mode 100644 InsAsterix/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleUI.cs create mode 100644 InsAsterix/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleUI.cs.meta create mode 100644 InsAsterix/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleUnityVersion.cs create mode 100644 InsAsterix/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleUnityVersion.cs.meta create mode 100644 InsAsterix/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleUtils.cs create mode 100644 InsAsterix/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleUtils.cs.meta create mode 100644 InsAsterix/Assets/Plugins/Demigiant/DOTween/readme.txt create mode 100644 InsAsterix/Assets/Plugins/Demigiant/DOTween/readme.txt.meta create mode 100644 InsAsterix/Assets/Plugins/Sirenix.meta create mode 100644 InsAsterix/Assets/Plugins/Sirenix/Odin Validator.meta create mode 100644 InsAsterix/Assets/Plugins/Sirenix/Odin Validator/Editor.meta create mode 100644 InsAsterix/Assets/Plugins/Sirenix/Odin Validator/Editor/Config.meta create mode 100644 InsAsterix/Assets/Plugins/Sirenix/Odin Validator/Editor/Config/GlobalValidationConfig.asset create mode 100644 InsAsterix/Assets/Plugins/Sirenix/Odin Validator/Editor/Config/GlobalValidationConfig.asset.meta create mode 100644 InsAsterix/Assets/Plugins/Sirenix/Odin Validator/Editor/Profiles.meta create mode 100644 InsAsterix/Assets/Plugins/Sirenix/Odin Validator/Editor/Profiles/Main Profile.asset create mode 100644 InsAsterix/Assets/Plugins/Sirenix/Odin Validator/Editor/Profiles/Main Profile.asset.meta create mode 100644 InsAsterix/Assets/Resources.meta create mode 100644 InsAsterix/Assets/Resources/DOTweenSettings.asset create mode 100644 InsAsterix/Assets/Resources/DOTweenSettings.asset.meta diff --git a/InsAsterix/Assets/Entity.cs b/InsAsterix/Assets/Entity.cs new file mode 100644 index 00000000..b5f1167d --- /dev/null +++ b/InsAsterix/Assets/Entity.cs @@ -0,0 +1,10 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class Entity : MonoBehaviour +{ + [SerializeField] private float health, mana, stamina; + + +} diff --git a/InsAsterix/Assets/Entity.cs.meta b/InsAsterix/Assets/Entity.cs.meta new file mode 100644 index 00000000..87763322 --- /dev/null +++ b/InsAsterix/Assets/Entity.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 38dbcb965c6762841a5a35e12d107c64 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/InsAsterix/Assets/NewInputPlatformer.cs b/InsAsterix/Assets/NewInputPlatformer.cs new file mode 100644 index 00000000..85e8d2af --- /dev/null +++ b/InsAsterix/Assets/NewInputPlatformer.cs @@ -0,0 +1,303 @@ +using System; +using UnityEngine; +using UnityEngine.Events; +using UnityEngine.InputSystem; +using DG.Tweening; + +public class NewInputPlatformer : MonoBehaviour +{ + enum PlayerState + { + Crouching=0, Running, Walking, Dashing, Attacking, Jumping, Dead, Idle + } + + [Header("Control parameters")] + [SerializeField] private new Rigidbody2D rigidbody2D; + [SerializeField] private new Collider2D collider; + [SerializeField] private Transform groundCheck, attackPos; + [SerializeField] private float moveSpeed; + [SerializeField] private float crouchMultiplier, sprintMultiplier; + [SerializeField] private float jumpForce,dashSpeed; + [SerializeField] private LayerMask groundMask, obstacleMask; + [SerializeField] private Transform spawnPoint; + [SerializeField] private Animator anim; + + [Header("Wrapping")] + [SerializeField] private int maxHP, maxStamina; + private int _healthPoints, _staminaPoints; + + private float _horizontal, _vertical,_currentSpeed; + private PlayerState _state = PlayerState.Idle; + private SpriteRenderer _sp; + private Vector2 _velocity; + private bool _isDead; + private float _lastDash, _lastJump; + [SerializeField] private float dashCooldown, jumpCooldown = 2f; + private bool _dashTrigger; + public UnityEvent death, resurrect; + private bool _isGrounded; + private void Awake() + { + rigidbody2D = gameObject.GetComponent(); + _sp = gameObject.GetComponentInChildren(); + collider = gameObject.GetComponent(); + anim = gameObject.GetComponent(); + _lastDash = float.MinValue; + _lastJump = float.MinValue; + _currentSpeed = moveSpeed; + } + + private void Start() + { + if (spawnPoint) + { + transform.position = spawnPoint.position; + } + death.AddListener(Kill); + resurrect.AddListener(Resurrect); + anim.CrossFade("Idle",0f); + _healthPoints = maxHP; + _staminaPoints = maxStamina; + } + + + private void Update() + { + _isGrounded = Physics2D.OverlapCircle(groundCheck.position,0.2f,groundMask); + } + + private void FixedUpdate() + { + if (_isDead) + { + _state = PlayerState.Dead; + return; + } + + Debug.Log("Player state: " + _state); + Controls(); + StateManager(); + AnimationController(); + } + + private void Controls() + { + if (_horizontal == 0f) + { + return; + } + + Vector2 localVelocity = rigidbody2D.velocity; + + // Movement behaviour + _sp.flipX = _horizontal < 0; // Flip the sprite to face the direction + if (!_dashTrigger) + { + localVelocity = new Vector2(_horizontal * _currentSpeed,localVelocity.y); + _state = _state is PlayerState.Idle or PlayerState.Walking? PlayerState.Walking : _state; + } + + rigidbody2D.velocity = localVelocity; + } + + public void MoveInputs(InputAction.CallbackContext ctx) + { + _horizontal = ctx.ReadValue().x; + _vertical = ctx.ReadValue().y; + if (ctx.canceled) + { + _state = PlayerState.Idle; + } + } + + public void Dash(InputAction.CallbackContext ctx) // Works but is not that great + { + if (ctx.performed) + { + Vector2 localVelocity = rigidbody2D.velocity; + if (Time.time - _lastDash < dashCooldown) return; + + _dashTrigger = true; + _lastDash = Time.time; + localVelocity = new Vector2( dashSpeed * _horizontal, localVelocity.y); + _state = PlayerState.Dashing; + rigidbody2D.velocity = localVelocity; + } + + if (ctx.canceled) + { + _state = PlayerState.Idle; + } + + } + + public void DashV2(InputAction.CallbackContext ctx) // Tweening version ! + { + if (ctx.performed) + { + if (Time.time - _lastDash < dashCooldown) return; + if (_dashTrigger) return; + _lastDash = Time.time; + + float distance = 4f; + float dashTarget; + + RaycastHit2D hit = Physics2D.Raycast(transform.position, Vector2.right * _horizontal, distance,obstacleMask); + if (hit) + { + //Debug.Log("Hit object" + hit.collider.gameObject); + distance = Mathf.Abs(hit.point.x - transform.position.x); + dashTarget = hit.point.x; + } + else + { + dashTarget = transform.position.x + distance * _horizontal; + } + + //Debug.Log(distance); + transform.DOMoveX(dashTarget, 0.06f* distance).SetEase(Ease.Linear).onComplete += () => { + _dashTrigger = false; + _state = PlayerState.Idle; + }; + _dashTrigger = true; + _state = PlayerState.Dashing; + } + + + } + + public void Jump(InputAction.CallbackContext ctx) + { + Vector2 localVelocity = rigidbody2D.velocity; + + if (ctx.performed) + { + _state = PlayerState.Jumping; + if (!_isGrounded) return; + if (Time.time - _lastJump < jumpCooldown) return; + + _lastJump = Time.time; + //Debug.Log("Jump"); + localVelocity = new Vector2(localVelocity.x, jumpForce); + + } + if(ctx.canceled) + { + _state = PlayerState.Idle; + //Debug.Log("Jump canceled"); + localVelocity = new Vector2(localVelocity.x, localVelocity.y * 0.5f); + } + + if (_isGrounded) + { + _state = PlayerState.Idle; + } + + rigidbody2D.velocity = localVelocity; + } + + public void Crouch(InputAction.CallbackContext ctx) + { + if (ctx.performed) + { + _state = PlayerState.Crouching; + //Debug.Log("Crouch"); + _currentSpeed = moveSpeed * crouchMultiplier; + } + + if (ctx.canceled) + { + _state = PlayerState.Idle; + _currentSpeed = moveSpeed; + //Debug.Log("Crouch canceled"); + } + } + + public void Sprint(InputAction.CallbackContext ctx) + { + if (ctx.performed) + { + _state = PlayerState.Running; + //Debug.Log("Sprint"); + _currentSpeed = moveSpeed * sprintMultiplier; + } + + if (ctx.canceled) + { + _state = PlayerState.Idle; + _currentSpeed = moveSpeed; + } + } + + public void Attack(InputAction.CallbackContext ctx) + { + if (ctx.performed) + { + _state = PlayerState.Attacking; + //Debug.Log("Attack"); + _horizontal = 0f; + Collider2D[] enemies = Physics2D.OverlapBoxAll(attackPos.position, new Vector2(0.72f, 1f), 0, LayerMask.GetMask("Enemy")); + foreach (Collider2D enemy in enemies) + { + //Debug.Log("Enemy name:" + enemy.gameObject.name); + } + } + } + + private void StateManager() + { + } + + private void AnimationController() // Animation switch function to change between stances + { + switch (_state) + { + case PlayerState.Crouching: + anim.CrossFade("Crouch",0f); + break; + case PlayerState.Running: + anim.CrossFade("Run",0f); + break; + case PlayerState.Walking: + anim.CrossFade("Walk",0f); + break; + case PlayerState.Jumping: + anim.CrossFade("Jump",0f); + break; + case PlayerState.Dead: + anim.CrossFade("Crouch",0f); + break; + case PlayerState.Idle: + anim.CrossFade("Idle",0f); + break; + case PlayerState.Dashing: + anim.CrossFade("Slide",0f); + break; + case PlayerState.Attacking: + anim.CrossFade("Attack",0f); + break; + default: + anim.CrossFade("Idle",0f); + throw new Exception("Unknown state"); + } + } + + private void Kill() + { + _isDead = true; + } + + private void Resurrect() + { + _isDead = false; + } + + public void TakeDamage(int damage) + { + _healthPoints -= damage; + if (_healthPoints <= 0) + { + death.Invoke(); + } + } +} diff --git a/InsAsterix/Assets/NewInputPlatformer.cs.meta b/InsAsterix/Assets/NewInputPlatformer.cs.meta new file mode 100644 index 00000000..467aadff --- /dev/null +++ b/InsAsterix/Assets/NewInputPlatformer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f2197024ef645ea46b2a51fbb3b00d60 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/InsAsterix/Assets/Obelix-Sheet.png b/InsAsterix/Assets/Obelix-Sheet.png new file mode 100644 index 0000000000000000000000000000000000000000..1caad47e62c6d234bd986b53e12d7fde0ba83c97 GIT binary patch literal 20579 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 QMjuFj^Yv`_YiQ(); + _sp = gameObject.GetComponentInChildren(); + collider = gameObject.GetComponent(); + _lastDash = 0f; + _lastJump = 0f; + } + + private void Start() + { + if (spawnPoint) + { + transform.position = spawnPoint.position; + } + } + + private void Update() + { + if (Input.GetButton("Dash")) _dashTrigger = true; + if (Input.GetButton("Jump") || Input.GetAxis("Vertical") > 0f) _jumpTrigger = true; + + } + + private void FixedUpdate() + { + if (_isDead) + { + _state = PlayerState.Dead; + return; + } + + Controls(); + //Debug.Log("Player state: " + _state); + AnimationController(); + } + + private void Controls() + { + // ************************** Velocity lock zone ************************** + _velocity = rigidbody2D.velocity; + _horizontal = Input.GetAxisRaw("Horizontal"); + _vertical = Input.GetAxisRaw("Vertical"); + bool isGrounded=Physics2D.IsTouchingLayers(collider, groundMask); + + // Movement behaviour + _sp.flipX = _horizontal < 0; // Flip the sprite to face the direction + _velocity = new Vector2(_horizontal * _currentSpeed,_velocity.y); + rigidbody2D.velocity = _velocity; + + + StateManager(isGrounded); + Dash(_horizontal); + Jump(isGrounded); + + } + + private void Dash(float direction) // Needs to be replaced by event in update + { + if(!_dashTrigger) return; + if (Time.time - _lastDash < dashCooldown) return; + + Debug.Log("Dash!"); + + _lastDash = Time.time; + rigidbody2D.AddForce(Vector2.right * (dashSpeed * direction), ForceMode2D.Impulse); + _dashTrigger = false; + + } + private void Jump(bool isGrounded) + { + + if (!isGrounded) return; + if (!_jumpTrigger) return; + if (Time.time - _lastJump < jumpCooldown) return; + + _lastJump = Time.time; + rigidbody2D.AddForce(Vector2.up * jumpForce, ForceMode2D.Impulse); + _jumpTrigger = false; + + } + + private void StateManager(bool isGrounded) + { + //State Manager + if (_horizontal != 0) + { + if (Input.GetButton("Run")) + { + _currentSpeed = moveSpeed * sprintMultiplier; + _state = PlayerState.Running; + } + else + { + _currentSpeed = moveSpeed; + _state = PlayerState.Walking; + } + } + else + { + _state = PlayerState.Idle; + } + if (Input.GetButton("Crouch")) + { + _currentSpeed = moveSpeed * crouchMultiplier; + _state = PlayerState.Crouching; + } + + if (!isGrounded) + { + _state = PlayerState.Jumping; // Jump state is prioritized + } + if (Input.GetButtonDown("Dash")) + { + _state = PlayerState.Dashing; + } + } + + void AnimationController() // Animation switch function to change between stances + { + switch (_state) + { + case PlayerState.Crouching: + break; + case PlayerState.Running: + break; + case PlayerState.Walking: + break; + case PlayerState.Jumping: + break; + case PlayerState.Dead: + break; + case PlayerState.Idle: + break; + case PlayerState.Dashing: + break; + default: + throw new Exception("Unknown state"); + } + } + + private void Kill() + { + _isDead = true; + } + + private void Resurrect() + { + _isDead = false; + } +} diff --git a/InsAsterix/Assets/PlatformerController.cs.meta b/InsAsterix/Assets/PlatformerController.cs.meta new file mode 100644 index 00000000..5b201810 --- /dev/null +++ b/InsAsterix/Assets/PlatformerController.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b0a2be916f7fb314e8bc643a8b216d20 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/InsAsterix/Assets/Player.meta b/InsAsterix/Assets/Player.meta new file mode 100644 index 00000000..786e508f --- /dev/null +++ b/InsAsterix/Assets/Player.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6cbac4ffdfcd7b9488e89522b827b739 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/InsAsterix/Assets/Player/Animations.meta b/InsAsterix/Assets/Player/Animations.meta new file mode 100644 index 00000000..21641d08 --- /dev/null +++ b/InsAsterix/Assets/Player/Animations.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 579ffd6170771b049aa205e0146d6018 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/InsAsterix/Assets/Player/Animations/Attack.anim b/InsAsterix/Assets/Player/Animations/Attack.anim new file mode 100644 index 00000000..2b98e085 --- /dev/null +++ b/InsAsterix/Assets/Player/Animations/Attack.anim @@ -0,0 +1,83 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!74 &7400000 +AnimationClip: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Attack + serializedVersion: 6 + m_Legacy: 0 + m_Compressed: 0 + m_UseHighQualityCurve: 1 + m_RotationCurves: [] + m_CompressedRotationCurves: [] + m_EulerCurves: [] + m_PositionCurves: [] + m_ScaleCurves: [] + m_FloatCurves: [] + m_PPtrCurves: + - curve: + - time: 0 + value: {fileID: -117336037, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - time: 0.1 + value: {fileID: -1634394426, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - time: 0.2 + value: {fileID: 667507610, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - time: 0.28333333 + value: {fileID: 780955946, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - time: 0.38333333 + value: {fileID: -1831765527, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - time: 0.51666665 + value: {fileID: 1105640414, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + attribute: m_Sprite + path: Body + classID: 212 + script: {fileID: 0} + m_SampleRate: 60 + m_WrapMode: 0 + m_Bounds: + m_Center: {x: 0, y: 0, z: 0} + m_Extent: {x: 0, y: 0, z: 0} + m_ClipBindingConstant: + genericBindings: + - serializedVersion: 2 + path: 2073732236 + attribute: 0 + script: {fileID: 0} + typeID: 212 + customType: 23 + isPPtrCurve: 1 + pptrCurveMapping: + - {fileID: -117336037, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - {fileID: -1634394426, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - {fileID: 667507610, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - {fileID: 780955946, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - {fileID: -1831765527, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - {fileID: 1105640414, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + m_AnimationClipSettings: + serializedVersion: 2 + m_AdditiveReferencePoseClip: {fileID: 0} + m_AdditiveReferencePoseTime: 0 + m_StartTime: 0 + m_StopTime: 0.5333333 + m_OrientationOffsetY: 0 + m_Level: 0 + m_CycleOffset: 0 + m_HasAdditiveReferencePose: 0 + m_LoopTime: 1 + m_LoopBlend: 0 + m_LoopBlendOrientation: 0 + m_LoopBlendPositionY: 0 + m_LoopBlendPositionXZ: 0 + m_KeepOriginalOrientation: 0 + m_KeepOriginalPositionY: 1 + m_KeepOriginalPositionXZ: 0 + m_HeightFromFeet: 0 + m_Mirror: 0 + m_EditorCurves: [] + m_EulerEditorCurves: [] + m_HasGenericRootTransform: 0 + m_HasMotionFloatCurves: 0 + m_Events: [] diff --git a/InsAsterix/Assets/Player/Animations/Attack.anim.meta b/InsAsterix/Assets/Player/Animations/Attack.anim.meta new file mode 100644 index 00000000..7b5dbc60 --- /dev/null +++ b/InsAsterix/Assets/Player/Animations/Attack.anim.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ef0d984043bf3f4438d1c00d65e31364 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 7400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/InsAsterix/Assets/Player/Animations/Crouch.anim b/InsAsterix/Assets/Player/Animations/Crouch.anim new file mode 100644 index 00000000..0745bdeb --- /dev/null +++ b/InsAsterix/Assets/Player/Animations/Crouch.anim @@ -0,0 +1,328 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!74 &7400000 +AnimationClip: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Crouch + serializedVersion: 6 + m_Legacy: 0 + m_Compressed: 0 + m_UseHighQualityCurve: 1 + m_RotationCurves: [] + m_CompressedRotationCurves: [] + m_EulerCurves: [] + m_PositionCurves: + - curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: {x: 0, y: -0.08, z: 0} + inSlope: {x: 0, y: 0, z: 0} + outSlope: {x: 0, y: 0, z: 0} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + path: Body + m_ScaleCurves: [] + m_FloatCurves: + - curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0.63 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_Size.x + path: + classID: 70 + script: {fileID: 0} + - curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0.88 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_Size.y + path: + classID: 70 + script: {fileID: 0} + - curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_Offset.x + path: + classID: 70 + script: {fileID: 0} + - curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.11 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_Offset.y + path: + classID: 70 + script: {fileID: 0} + m_PPtrCurves: + - curve: + - time: 0 + value: {fileID: -1500295248, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + attribute: m_Sprite + path: Body + classID: 212 + script: {fileID: 0} + m_SampleRate: 60 + m_WrapMode: 0 + m_Bounds: + m_Center: {x: 0, y: 0, z: 0} + m_Extent: {x: 0, y: 0, z: 0} + m_ClipBindingConstant: + genericBindings: + - serializedVersion: 2 + path: 2073732236 + attribute: 0 + script: {fileID: 0} + typeID: 212 + customType: 23 + isPPtrCurve: 1 + - serializedVersion: 2 + path: 2073732236 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + - serializedVersion: 2 + path: 0 + attribute: 4197328169 + script: {fileID: 0} + typeID: 70 + customType: 0 + isPPtrCurve: 0 + - serializedVersion: 2 + path: 0 + attribute: 2368279999 + script: {fileID: 0} + typeID: 70 + customType: 0 + isPPtrCurve: 0 + - serializedVersion: 2 + path: 0 + attribute: 413499720 + script: {fileID: 0} + typeID: 70 + customType: 0 + isPPtrCurve: 0 + - serializedVersion: 2 + path: 0 + attribute: 1872933342 + script: {fileID: 0} + typeID: 70 + customType: 0 + isPPtrCurve: 0 + pptrCurveMapping: + - {fileID: -1500295248, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + m_AnimationClipSettings: + serializedVersion: 2 + m_AdditiveReferencePoseClip: {fileID: 0} + m_AdditiveReferencePoseTime: 0 + m_StartTime: 0 + m_StopTime: 0.016666668 + m_OrientationOffsetY: 0 + m_Level: 0 + m_CycleOffset: 0 + m_HasAdditiveReferencePose: 0 + m_LoopTime: 1 + m_LoopBlend: 0 + m_LoopBlendOrientation: 0 + m_LoopBlendPositionY: 0 + m_LoopBlendPositionXZ: 0 + m_KeepOriginalOrientation: 0 + m_KeepOriginalPositionY: 1 + m_KeepOriginalPositionXZ: 0 + m_HeightFromFeet: 0 + m_Mirror: 0 + m_EditorCurves: + - curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalPosition.x + path: Body + classID: 4 + script: {fileID: 0} + - curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.08 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalPosition.y + path: Body + classID: 4 + script: {fileID: 0} + - curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalPosition.z + path: Body + classID: 4 + script: {fileID: 0} + - curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0.63 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_Size.x + path: + classID: 70 + script: {fileID: 0} + - curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0.88 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_Size.y + path: + classID: 70 + script: {fileID: 0} + - curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_Offset.x + path: + classID: 70 + script: {fileID: 0} + - curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.11 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_Offset.y + path: + classID: 70 + script: {fileID: 0} + m_EulerEditorCurves: [] + m_HasGenericRootTransform: 0 + m_HasMotionFloatCurves: 0 + m_Events: [] diff --git a/InsAsterix/Assets/Player/Animations/Crouch.anim.meta b/InsAsterix/Assets/Player/Animations/Crouch.anim.meta new file mode 100644 index 00000000..626d4808 --- /dev/null +++ b/InsAsterix/Assets/Player/Animations/Crouch.anim.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e055cc629468d69479bd277463ac50dc +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 7400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/InsAsterix/Assets/Player/Animations/Idle.anim b/InsAsterix/Assets/Player/Animations/Idle.anim new file mode 100644 index 00000000..dbcbf7cb --- /dev/null +++ b/InsAsterix/Assets/Player/Animations/Idle.anim @@ -0,0 +1,86 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!74 &7400000 +AnimationClip: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Idle + serializedVersion: 6 + m_Legacy: 0 + m_Compressed: 0 + m_UseHighQualityCurve: 1 + m_RotationCurves: [] + m_CompressedRotationCurves: [] + m_EulerCurves: [] + m_PositionCurves: [] + m_ScaleCurves: [] + m_FloatCurves: [] + m_PPtrCurves: + - curve: + - time: 0 + value: {fileID: 2067066292, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - time: 0.16666667 + value: {fileID: -280901731, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - time: 0.33333334 + value: {fileID: 1285329481, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - time: 0.5 + value: {fileID: -1160484785, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - time: 0.6666667 + value: {fileID: -1907629784, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - time: 0.8333333 + value: {fileID: -1401510412, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - time: 1 + value: {fileID: 2067066292, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + attribute: m_Sprite + path: Body + classID: 212 + script: {fileID: 0} + m_SampleRate: 60 + m_WrapMode: 0 + m_Bounds: + m_Center: {x: 0, y: 0, z: 0} + m_Extent: {x: 0, y: 0, z: 0} + m_ClipBindingConstant: + genericBindings: + - serializedVersion: 2 + path: 2073732236 + attribute: 0 + script: {fileID: 0} + typeID: 212 + customType: 23 + isPPtrCurve: 1 + pptrCurveMapping: + - {fileID: 2067066292, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - {fileID: -280901731, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - {fileID: 1285329481, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - {fileID: -1160484785, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - {fileID: -1907629784, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - {fileID: -1401510412, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - {fileID: 2067066292, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + m_AnimationClipSettings: + serializedVersion: 2 + m_AdditiveReferencePoseClip: {fileID: 0} + m_AdditiveReferencePoseTime: 0 + m_StartTime: 0 + m_StopTime: 1.0166667 + m_OrientationOffsetY: 0 + m_Level: 0 + m_CycleOffset: 0 + m_HasAdditiveReferencePose: 0 + m_LoopTime: 1 + m_LoopBlend: 0 + m_LoopBlendOrientation: 0 + m_LoopBlendPositionY: 0 + m_LoopBlendPositionXZ: 0 + m_KeepOriginalOrientation: 0 + m_KeepOriginalPositionY: 1 + m_KeepOriginalPositionXZ: 0 + m_HeightFromFeet: 0 + m_Mirror: 0 + m_EditorCurves: [] + m_EulerEditorCurves: [] + m_HasGenericRootTransform: 0 + m_HasMotionFloatCurves: 0 + m_Events: [] diff --git a/InsAsterix/Assets/Player/Animations/Idle.anim.meta b/InsAsterix/Assets/Player/Animations/Idle.anim.meta new file mode 100644 index 00000000..1e2ab923 --- /dev/null +++ b/InsAsterix/Assets/Player/Animations/Idle.anim.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ac536f29e9294c348b49563dca3a7b74 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 7400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/InsAsterix/Assets/Player/Animations/Jump.anim b/InsAsterix/Assets/Player/Animations/Jump.anim new file mode 100644 index 00000000..783b3e6f --- /dev/null +++ b/InsAsterix/Assets/Player/Animations/Jump.anim @@ -0,0 +1,89 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!74 &7400000 +AnimationClip: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Jump + serializedVersion: 6 + m_Legacy: 0 + m_Compressed: 0 + m_UseHighQualityCurve: 1 + m_RotationCurves: [] + m_CompressedRotationCurves: [] + m_EulerCurves: [] + m_PositionCurves: [] + m_ScaleCurves: [] + m_FloatCurves: [] + m_PPtrCurves: + - curve: + - time: 0 + value: {fileID: -448520186, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - time: 0.05 + value: {fileID: -1500295248, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - time: 0.15 + value: {fileID: -1090048074, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - time: 0.2 + value: {fileID: -78034866, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - time: 0.25 + value: {fileID: -1319392232, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - time: 0.3 + value: {fileID: -542877531, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - time: 0.46666667 + value: {fileID: 218722396, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - time: 0.51666665 + value: {fileID: 746966511, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + attribute: m_Sprite + path: Body + classID: 212 + script: {fileID: 0} + m_SampleRate: 60 + m_WrapMode: 0 + m_Bounds: + m_Center: {x: 0, y: 0, z: 0} + m_Extent: {x: 0, y: 0, z: 0} + m_ClipBindingConstant: + genericBindings: + - serializedVersion: 2 + path: 2073732236 + attribute: 0 + script: {fileID: 0} + typeID: 212 + customType: 23 + isPPtrCurve: 1 + pptrCurveMapping: + - {fileID: -448520186, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - {fileID: -1500295248, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - {fileID: -1090048074, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - {fileID: -78034866, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - {fileID: -1319392232, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - {fileID: -542877531, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - {fileID: 218722396, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - {fileID: 746966511, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + m_AnimationClipSettings: + serializedVersion: 2 + m_AdditiveReferencePoseClip: {fileID: 0} + m_AdditiveReferencePoseTime: 0 + m_StartTime: 0 + m_StopTime: 0.5333333 + m_OrientationOffsetY: 0 + m_Level: 0 + m_CycleOffset: 0 + m_HasAdditiveReferencePose: 0 + m_LoopTime: 1 + m_LoopBlend: 0 + m_LoopBlendOrientation: 0 + m_LoopBlendPositionY: 0 + m_LoopBlendPositionXZ: 0 + m_KeepOriginalOrientation: 0 + m_KeepOriginalPositionY: 1 + m_KeepOriginalPositionXZ: 0 + m_HeightFromFeet: 0 + m_Mirror: 0 + m_EditorCurves: [] + m_EulerEditorCurves: [] + m_HasGenericRootTransform: 0 + m_HasMotionFloatCurves: 0 + m_Events: [] diff --git a/InsAsterix/Assets/Player/Animations/Jump.anim.meta b/InsAsterix/Assets/Player/Animations/Jump.anim.meta new file mode 100644 index 00000000..a10e2e5b --- /dev/null +++ b/InsAsterix/Assets/Player/Animations/Jump.anim.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: fc73dd6ecada51f44ba917e650b3e0ef +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 7400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/InsAsterix/Assets/Player/Animations/Run.anim b/InsAsterix/Assets/Player/Animations/Run.anim new file mode 100644 index 00000000..26ed7c9d --- /dev/null +++ b/InsAsterix/Assets/Player/Animations/Run.anim @@ -0,0 +1,95 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!74 &7400000 +AnimationClip: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Run + serializedVersion: 6 + m_Legacy: 0 + m_Compressed: 0 + m_UseHighQualityCurve: 1 + m_RotationCurves: [] + m_CompressedRotationCurves: [] + m_EulerCurves: [] + m_PositionCurves: [] + m_ScaleCurves: [] + m_FloatCurves: [] + m_PPtrCurves: + - curve: + - time: 0 + value: {fileID: 1515893929, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - time: 0.033333335 + value: {fileID: -897432108, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - time: 0.06666667 + value: {fileID: 162301961, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - time: 0.1 + value: {fileID: -2110086513, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - time: 0.13333334 + value: {fileID: -794628961, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - time: 0.16666667 + value: {fileID: -1254964656, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - time: 0.2 + value: {fileID: 1069934941, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - time: 0.23333333 + value: {fileID: -1894956767, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - time: 0.26666668 + value: {fileID: -369329291, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - time: 0.3 + value: {fileID: -867281489, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + attribute: m_Sprite + path: Body + classID: 212 + script: {fileID: 0} + m_SampleRate: 60 + m_WrapMode: 0 + m_Bounds: + m_Center: {x: 0, y: 0, z: 0} + m_Extent: {x: 0, y: 0, z: 0} + m_ClipBindingConstant: + genericBindings: + - serializedVersion: 2 + path: 2073732236 + attribute: 0 + script: {fileID: 0} + typeID: 212 + customType: 23 + isPPtrCurve: 1 + pptrCurveMapping: + - {fileID: 1515893929, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - {fileID: -897432108, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - {fileID: 162301961, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - {fileID: -2110086513, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - {fileID: -794628961, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - {fileID: -1254964656, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - {fileID: 1069934941, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - {fileID: -1894956767, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - {fileID: -369329291, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - {fileID: -867281489, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + m_AnimationClipSettings: + serializedVersion: 2 + m_AdditiveReferencePoseClip: {fileID: 0} + m_AdditiveReferencePoseTime: 0 + m_StartTime: 0 + m_StopTime: 0.3166667 + m_OrientationOffsetY: 0 + m_Level: 0 + m_CycleOffset: 0 + m_HasAdditiveReferencePose: 0 + m_LoopTime: 1 + m_LoopBlend: 0 + m_LoopBlendOrientation: 0 + m_LoopBlendPositionY: 0 + m_LoopBlendPositionXZ: 0 + m_KeepOriginalOrientation: 0 + m_KeepOriginalPositionY: 1 + m_KeepOriginalPositionXZ: 0 + m_HeightFromFeet: 0 + m_Mirror: 0 + m_EditorCurves: [] + m_EulerEditorCurves: [] + m_HasGenericRootTransform: 0 + m_HasMotionFloatCurves: 0 + m_Events: [] diff --git a/InsAsterix/Assets/Player/Animations/Run.anim.meta b/InsAsterix/Assets/Player/Animations/Run.anim.meta new file mode 100644 index 00000000..971099b7 --- /dev/null +++ b/InsAsterix/Assets/Player/Animations/Run.anim.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 65ccae5521be97c48b273d2360599ccc +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 7400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/InsAsterix/Assets/Player/Animations/Slide.anim b/InsAsterix/Assets/Player/Animations/Slide.anim new file mode 100644 index 00000000..e2ef5214 --- /dev/null +++ b/InsAsterix/Assets/Player/Animations/Slide.anim @@ -0,0 +1,202 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!74 &7400000 +AnimationClip: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Slide + serializedVersion: 6 + m_Legacy: 0 + m_Compressed: 0 + m_UseHighQualityCurve: 1 + m_RotationCurves: [] + m_CompressedRotationCurves: [] + m_EulerCurves: [] + m_PositionCurves: + - curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: {x: 0, y: -0.39, z: 0} + inSlope: {x: 0, y: 0, z: 0} + outSlope: {x: 0, y: 0, z: 0} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + - serializedVersion: 3 + time: 0.2 + value: {x: 0, y: -0.3, z: 0} + inSlope: {x: 0, y: 0, z: 0} + outSlope: {x: 0, y: 0, z: 0} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + - serializedVersion: 3 + time: 0.21666667 + value: {x: 0, y: -0.3, z: 0} + inSlope: {x: 0, y: 0, z: 0} + outSlope: {x: 0, y: 0, z: 0} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + path: Body + m_ScaleCurves: [] + m_FloatCurves: [] + m_PPtrCurves: + - curve: + - time: 0 + value: {fileID: -92820843, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - time: 0.06666667 + value: {fileID: -1097625382, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - time: 0.13333334 + value: {fileID: -1780820042, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - time: 0.2 + value: {fileID: -1144045606, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + attribute: m_Sprite + path: Body + classID: 212 + script: {fileID: 0} + m_SampleRate: 60 + m_WrapMode: 0 + m_Bounds: + m_Center: {x: 0, y: 0, z: 0} + m_Extent: {x: 0, y: 0, z: 0} + m_ClipBindingConstant: + genericBindings: + - serializedVersion: 2 + path: 2073732236 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + - serializedVersion: 2 + path: 2073732236 + attribute: 0 + script: {fileID: 0} + typeID: 212 + customType: 23 + isPPtrCurve: 1 + pptrCurveMapping: + - {fileID: -92820843, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - {fileID: -1097625382, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - {fileID: -1780820042, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - {fileID: -1144045606, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + m_AnimationClipSettings: + serializedVersion: 2 + m_AdditiveReferencePoseClip: {fileID: 0} + m_AdditiveReferencePoseTime: 0 + m_StartTime: 0 + m_StopTime: 0.21666667 + m_OrientationOffsetY: 0 + m_Level: 0 + m_CycleOffset: 0 + m_HasAdditiveReferencePose: 0 + m_LoopTime: 1 + m_LoopBlend: 0 + m_LoopBlendOrientation: 0 + m_LoopBlendPositionY: 0 + m_LoopBlendPositionXZ: 0 + m_KeepOriginalOrientation: 0 + m_KeepOriginalPositionY: 1 + m_KeepOriginalPositionXZ: 0 + m_HeightFromFeet: 0 + m_Mirror: 0 + m_EditorCurves: + - curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.21666667 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalPosition.x + path: Body + classID: 4 + script: {fileID: 0} + - curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.21666667 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalPosition.z + path: Body + classID: 4 + script: {fileID: 0} + - curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.39 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.2 + value: -0.3 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalPosition.y + path: Body + classID: 4 + script: {fileID: 0} + m_EulerEditorCurves: [] + m_HasGenericRootTransform: 0 + m_HasMotionFloatCurves: 0 + m_Events: [] diff --git a/InsAsterix/Assets/Player/Animations/Slide.anim.meta b/InsAsterix/Assets/Player/Animations/Slide.anim.meta new file mode 100644 index 00000000..fd60ac28 --- /dev/null +++ b/InsAsterix/Assets/Player/Animations/Slide.anim.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: deadf84aca40a904697dae841e407b22 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 7400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/InsAsterix/Assets/Player/Animations/Walk.anim b/InsAsterix/Assets/Player/Animations/Walk.anim new file mode 100644 index 00000000..a411bbcb --- /dev/null +++ b/InsAsterix/Assets/Player/Animations/Walk.anim @@ -0,0 +1,95 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!74 &7400000 +AnimationClip: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Walk + serializedVersion: 6 + m_Legacy: 0 + m_Compressed: 0 + m_UseHighQualityCurve: 1 + m_RotationCurves: [] + m_CompressedRotationCurves: [] + m_EulerCurves: [] + m_PositionCurves: [] + m_ScaleCurves: [] + m_FloatCurves: [] + m_PPtrCurves: + - curve: + - time: 0 + value: {fileID: 1515893929, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - time: 0.083333336 + value: {fileID: -897432108, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - time: 0.16666667 + value: {fileID: 162301961, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - time: 0.25 + value: {fileID: -2110086513, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - time: 0.33333334 + value: {fileID: -794628961, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - time: 0.41666666 + value: {fileID: -1254964656, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - time: 0.5 + value: {fileID: 1069934941, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - time: 0.5833333 + value: {fileID: -1894956767, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - time: 0.6666667 + value: {fileID: -369329291, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - time: 0.75 + value: {fileID: -867281489, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + attribute: m_Sprite + path: Body + classID: 212 + script: {fileID: 0} + m_SampleRate: 60 + m_WrapMode: 0 + m_Bounds: + m_Center: {x: 0, y: 0, z: 0} + m_Extent: {x: 0, y: 0, z: 0} + m_ClipBindingConstant: + genericBindings: + - serializedVersion: 2 + path: 2073732236 + attribute: 0 + script: {fileID: 0} + typeID: 212 + customType: 23 + isPPtrCurve: 1 + pptrCurveMapping: + - {fileID: 1515893929, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - {fileID: -897432108, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - {fileID: 162301961, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - {fileID: -2110086513, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - {fileID: -794628961, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - {fileID: -1254964656, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - {fileID: 1069934941, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - {fileID: -1894956767, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - {fileID: -369329291, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + - {fileID: -867281489, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} + m_AnimationClipSettings: + serializedVersion: 2 + m_AdditiveReferencePoseClip: {fileID: 0} + m_AdditiveReferencePoseTime: 0 + m_StartTime: 0 + m_StopTime: 0.76666665 + m_OrientationOffsetY: 0 + m_Level: 0 + m_CycleOffset: 0 + m_HasAdditiveReferencePose: 0 + m_LoopTime: 1 + m_LoopBlend: 0 + m_LoopBlendOrientation: 0 + m_LoopBlendPositionY: 0 + m_LoopBlendPositionXZ: 0 + m_KeepOriginalOrientation: 0 + m_KeepOriginalPositionY: 1 + m_KeepOriginalPositionXZ: 0 + m_HeightFromFeet: 0 + m_Mirror: 0 + m_EditorCurves: [] + m_EulerEditorCurves: [] + m_HasGenericRootTransform: 0 + m_HasMotionFloatCurves: 0 + m_Events: [] diff --git a/InsAsterix/Assets/Player/Animations/Walk.anim.meta b/InsAsterix/Assets/Player/Animations/Walk.anim.meta new file mode 100644 index 00000000..e38004dc --- /dev/null +++ b/InsAsterix/Assets/Player/Animations/Walk.anim.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 62488a83663e37c4e806562c38042642 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 7400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/InsAsterix/Assets/Player/Player.controller b/InsAsterix/Assets/Player/Player.controller new file mode 100644 index 00000000..e6d39453 --- /dev/null +++ b/InsAsterix/Assets/Player/Player.controller @@ -0,0 +1,275 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1102 &-8920895937224671628 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Crouch + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: [] + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: 7400000, guid: e055cc629468d69479bd277463ac50dc, type: 2} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!1102 &-8900061010377355442 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Jump + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: [] + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: 7400000, guid: fc73dd6ecada51f44ba917e650b3e0ef, type: 2} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!1102 &-6820054056362090471 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Run + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: [] + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: 7400000, guid: 65ccae5521be97c48b273d2360599ccc, type: 2} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!1102 &-6373532496150575700 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Walk + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: [] + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: 7400000, guid: 62488a83663e37c4e806562c38042642, type: 2} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!1102 &-5615341808109964735 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Slide + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: [] + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: 7400000, guid: deadf84aca40a904697dae841e407b22, type: 2} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!91 &9100000 +AnimatorController: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Player + serializedVersion: 5 + m_AnimatorParameters: [] + m_AnimatorLayers: + - serializedVersion: 5 + m_Name: Base Layer + m_StateMachine: {fileID: 1022809638626258686} + m_Mask: {fileID: 0} + m_Motions: [] + m_Behaviours: [] + m_BlendingMode: 0 + m_SyncedLayerIndex: -1 + m_DefaultWeight: 0 + m_IKPass: 0 + m_SyncedLayerAffectsTiming: 0 + m_Controller: {fileID: 9100000} +--- !u!1107 &1022809638626258686 +AnimatorStateMachine: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Base Layer + m_ChildStates: + - serializedVersion: 1 + m_State: {fileID: 2620402804328853265} + m_Position: {x: 580, y: 130, z: 0} + - serializedVersion: 1 + m_State: {fileID: -6373532496150575700} + m_Position: {x: 580, y: 180, z: 0} + - serializedVersion: 1 + m_State: {fileID: -6820054056362090471} + m_Position: {x: 580, y: 230, z: 0} + - serializedVersion: 1 + m_State: {fileID: -8900061010377355442} + m_Position: {x: 580, y: 280, z: 0} + - serializedVersion: 1 + m_State: {fileID: -8920895937224671628} + m_Position: {x: 580, y: 330, z: 0} + - serializedVersion: 1 + m_State: {fileID: 3323606246338399445} + m_Position: {x: 580, y: 380, z: 0} + - serializedVersion: 1 + m_State: {fileID: -5615341808109964735} + m_Position: {x: 580, y: 480, z: 0} + - serializedVersion: 1 + m_State: {fileID: 7792130209533516541} + m_Position: {x: 580, y: 430, z: 0} + m_ChildStateMachines: [] + m_AnyStateTransitions: [] + m_EntryTransitions: [] + m_StateMachineTransitions: {} + m_StateMachineBehaviours: [] + m_AnyStatePosition: {x: 50, y: 20, z: 0} + m_EntryPosition: {x: 30, y: 130, z: 0} + m_ExitPosition: {x: 800, y: 120, z: 0} + m_ParentStateMachinePosition: {x: 800, y: 20, z: 0} + m_DefaultState: {fileID: 2620402804328853265} +--- !u!1102 &2620402804328853265 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Idle + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: [] + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: 7400000, guid: ac536f29e9294c348b49563dca3a7b74, type: 2} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!1102 &3323606246338399445 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Dash + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: [] + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: 0} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!1102 &7792130209533516541 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Attack + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: [] + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: 7400000, guid: ef0d984043bf3f4438d1c00d65e31364, type: 2} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: diff --git a/InsAsterix/Assets/Player/Player.controller.meta b/InsAsterix/Assets/Player/Player.controller.meta new file mode 100644 index 00000000..ec235d5e --- /dev/null +++ b/InsAsterix/Assets/Player/Player.controller.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4fe501f22a3148d45a236320ccfe3ae9 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 9100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/InsAsterix/Assets/PlayerActions.inputactions b/InsAsterix/Assets/PlayerActions.inputactions new file mode 100644 index 00000000..09c7c66f --- /dev/null +++ b/InsAsterix/Assets/PlayerActions.inputactions @@ -0,0 +1,973 @@ +{ + "name": "PlayerActions", + "maps": [ + { + "name": "Player", + "id": "b28dd2b2-c553-444d-b968-f983a85a96ed", + "actions": [ + { + "name": "Move", + "type": "Value", + "id": "004102f2-7239-467f-bb9d-0dac730f3e8f", + "expectedControlType": "Vector2", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Look", + "type": "Value", + "id": "66694b56-38d3-4b71-956b-b20c137d2539", + "expectedControlType": "Vector2", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Attack", + "type": "Button", + "id": "9c576f00-da36-43fc-9d04-60bc3c4eb6da", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Jump", + "type": "Button", + "id": "17198255-8e04-49d6-abfb-a317ecf09d35", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Dash", + "type": "Button", + "id": "9408516b-8e34-4478-928d-097aedeb81cd", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Crouch", + "type": "Button", + "id": "0c58132b-1a06-44a8-a6a3-d815d3533163", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Sprint", + "type": "Button", + "id": "a5f911d2-1511-46ae-89a2-d655bd19e112", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + } + ], + "bindings": [ + { + "name": "", + "id": "978bfe49-cc26-4a3d-ab7b-7d7a29327403", + "path": "/leftStick", + "interactions": "", + "processors": "", + "groups": ";Gamepad", + "action": "Move", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "WASD", + "id": "00ca640b-d935-4593-8157-c05846ea39b3", + "path": "Dpad", + "interactions": "", + "processors": "", + "groups": "", + "action": "Move", + "isComposite": true, + "isPartOfComposite": false + }, + { + "name": "up", + "id": "e2062cb9-1b15-46a2-838c-2f8d72a0bdd9", + "path": "/w", + "interactions": "", + "processors": "", + "groups": ";Keyboard&Mouse", + "action": "Move", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "up", + "id": "8180e8bd-4097-4f4e-ab88-4523101a6ce9", + "path": "/upArrow", + "interactions": "", + "processors": "", + "groups": ";Keyboard&Mouse", + "action": "Move", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "down", + "id": "320bffee-a40b-4347-ac70-c210eb8bc73a", + "path": "/s", + "interactions": "", + "processors": "", + "groups": ";Keyboard&Mouse", + "action": "Move", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "down", + "id": "1c5327b5-f71c-4f60-99c7-4e737386f1d1", + "path": "/downArrow", + "interactions": "", + "processors": "", + "groups": ";Keyboard&Mouse", + "action": "Move", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "left", + "id": "d2581a9b-1d11-4566-b27d-b92aff5fabbc", + "path": "/a", + "interactions": "", + "processors": "", + "groups": ";Keyboard&Mouse", + "action": "Move", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "left", + "id": "2e46982e-44cc-431b-9f0b-c11910bf467a", + "path": "/leftArrow", + "interactions": "", + "processors": "", + "groups": ";Keyboard&Mouse", + "action": "Move", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "right", + "id": "fcfe95b8-67b9-4526-84b5-5d0bc98d6400", + "path": "/d", + "interactions": "", + "processors": "", + "groups": ";Keyboard&Mouse", + "action": "Move", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "right", + "id": "77bff152-3580-4b21-b6de-dcd0c7e41164", + "path": "/rightArrow", + "interactions": "", + "processors": "", + "groups": ";Keyboard&Mouse", + "action": "Move", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "", + "id": "1635d3fe-58b6-4ba9-a4e2-f4b964f6b5c8", + "path": "/{Primary2DAxis}", + "interactions": "", + "processors": "", + "groups": "XR", + "action": "Move", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "3ea4d645-4504-4529-b061-ab81934c3752", + "path": "/stick", + "interactions": "", + "processors": "", + "groups": "Joystick", + "action": "Move", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "c444f5ee-ccc1-4fb5-9883-fe928893fa81", + "path": "/leftStick", + "interactions": "", + "processors": "", + "groups": "", + "action": "Move", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "c1f7a91b-d0fd-4a62-997e-7fb9b69bf235", + "path": "/rightStick", + "interactions": "", + "processors": "", + "groups": ";Gamepad", + "action": "Look", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "8c8e490b-c610-4785-884f-f04217b23ca4", + "path": "/delta", + "interactions": "", + "processors": "", + "groups": ";Keyboard&Mouse;Touch", + "action": "Look", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "3e5f5442-8668-4b27-a940-df99bad7e831", + "path": "/{Hatswitch}", + "interactions": "", + "processors": "", + "groups": "Joystick", + "action": "Look", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "a40e75c2-c8ce-43c8-8f3c-bcbc4067722c", + "path": "/space", + "interactions": "", + "processors": "", + "groups": "", + "action": "Jump", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "c3988410-5f80-4233-ab96-11a7a14398f7", + "path": "/buttonSouth", + "interactions": "", + "processors": "", + "groups": "", + "action": "Jump", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "f5c18acc-2f4d-4d74-9091-2ec754a3776c", + "path": "/buttonEast", + "interactions": "", + "processors": "", + "groups": "", + "action": "Jump", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "6f5adc13-e898-432b-8b30-d108adeac6c2", + "path": "/c", + "interactions": "", + "processors": "", + "groups": "", + "action": "Dash", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "6885591c-ef83-4153-9127-ebdd1d148637", + "path": "/v", + "interactions": "", + "processors": "", + "groups": "", + "action": "Crouch", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "d9792518-5f42-41c2-be8c-8d6470e209fa", + "path": "/buttonEast", + "interactions": "", + "processors": "", + "groups": "", + "action": "Crouch", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "3f2607e7-7a5f-4791-ba55-28ccb3d7f715", + "path": "/buttonSouth", + "interactions": "", + "processors": "", + "groups": "", + "action": "Crouch", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "8f5b1e38-61ca-42df-88cc-58705d0149c1", + "path": "/buttonWest", + "interactions": "", + "processors": "", + "groups": "", + "action": "Dash", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "9985432d-252f-482c-8787-24949e467718", + "path": "/buttonNorth", + "interactions": "", + "processors": "", + "groups": "", + "action": "Dash", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "9b7b1075-d7ff-4b31-ab12-b61f2bd5dd5b", + "path": "/z", + "interactions": "", + "processors": "", + "groups": "", + "action": "Attack", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "5f7dd965-d55c-46f9-8dda-a8909cd46e3e", + "path": "/buttonNorth", + "interactions": "", + "processors": "", + "groups": "", + "action": "Attack", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "bb02cd41-b0b1-4ea3-91d3-0b728c5a17b3", + "path": "/buttonWest", + "interactions": "", + "processors": "", + "groups": "", + "action": "Attack", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "fe676ac3-73a6-4fb5-8f84-1e590b5c122b", + "path": "/shift", + "interactions": "", + "processors": "", + "groups": "", + "action": "Sprint", + "isComposite": false, + "isPartOfComposite": false + } + ] + }, + { + "name": "UI", + "id": "2afff04a-63e7-4a17-8cc5-12d39ab8b275", + "actions": [ + { + "name": "Navigate", + "type": "PassThrough", + "id": "f88d6f76-a792-48ac-82dd-545c34b17014", + "expectedControlType": "Vector2", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Submit", + "type": "Button", + "id": "d8511937-780e-4017-becb-742fb3e13219", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Cancel", + "type": "Button", + "id": "2b8aacf7-1d25-4420-883b-da76763a9dd6", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Point", + "type": "PassThrough", + "id": "3186eaa2-3ef0-4900-bd6a-3f72d0f0a2bf", + "expectedControlType": "Vector2", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Click", + "type": "PassThrough", + "id": "b504f292-6d4e-4f70-a73f-23f709b0eba3", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "ScrollWheel", + "type": "PassThrough", + "id": "72501458-9690-47c4-9ac6-6d7dcad33da6", + "expectedControlType": "Vector2", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "MiddleClick", + "type": "PassThrough", + "id": "89f6e474-fb4a-44c1-9626-54c31ee99232", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "RightClick", + "type": "PassThrough", + "id": "8aa1a29b-b305-44ef-89fb-b7f7f1032f4b", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "TrackedDevicePosition", + "type": "PassThrough", + "id": "5da7e19b-482c-4540-9bbd-ae485624ff92", + "expectedControlType": "Vector3", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "TrackedDeviceOrientation", + "type": "PassThrough", + "id": "347eb2f8-d45a-4964-a440-c43a8b544086", + "expectedControlType": "Quaternion", + "processors": "", + "interactions": "", + "initialStateCheck": false + } + ], + "bindings": [ + { + "name": "Gamepad", + "id": "809f371f-c5e2-4e7a-83a1-d867598f40dd", + "path": "2DVector", + "interactions": "", + "processors": "", + "groups": "", + "action": "Navigate", + "isComposite": true, + "isPartOfComposite": false + }, + { + "name": "up", + "id": "14a5d6e8-4aaf-4119-a9ef-34b8c2c548bf", + "path": "/leftStick/up", + "interactions": "", + "processors": "", + "groups": ";Gamepad", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "up", + "id": "9144cbe6-05e1-4687-a6d7-24f99d23dd81", + "path": "/rightStick/up", + "interactions": "", + "processors": "", + "groups": ";Gamepad", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "down", + "id": "2db08d65-c5fb-421b-983f-c71163608d67", + "path": "/leftStick/down", + "interactions": "", + "processors": "", + "groups": ";Gamepad", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "down", + "id": "58748904-2ea9-4a80-8579-b500e6a76df8", + "path": "/rightStick/down", + "interactions": "", + "processors": "", + "groups": ";Gamepad", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "left", + "id": "8ba04515-75aa-45de-966d-393d9bbd1c14", + "path": "/leftStick/left", + "interactions": "", + "processors": "", + "groups": ";Gamepad", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "left", + "id": "712e721c-bdfb-4b23-a86c-a0d9fcfea921", + "path": "/rightStick/left", + "interactions": "", + "processors": "", + "groups": ";Gamepad", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "right", + "id": "fcd248ae-a788-4676-a12e-f4d81205600b", + "path": "/leftStick/right", + "interactions": "", + "processors": "", + "groups": ";Gamepad", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "right", + "id": "1f04d9bc-c50b-41a1-bfcc-afb75475ec20", + "path": "/rightStick/right", + "interactions": "", + "processors": "", + "groups": ";Gamepad", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "", + "id": "fb8277d4-c5cd-4663-9dc7-ee3f0b506d90", + "path": "/dpad", + "interactions": "", + "processors": "", + "groups": ";Gamepad", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "Joystick", + "id": "e25d9774-381c-4a61-b47c-7b6b299ad9f9", + "path": "2DVector", + "interactions": "", + "processors": "", + "groups": "", + "action": "Navigate", + "isComposite": true, + "isPartOfComposite": false + }, + { + "name": "up", + "id": "3db53b26-6601-41be-9887-63ac74e79d19", + "path": "/stick/up", + "interactions": "", + "processors": "", + "groups": "Joystick", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "down", + "id": "0cb3e13e-3d90-4178-8ae6-d9c5501d653f", + "path": "/stick/down", + "interactions": "", + "processors": "", + "groups": "Joystick", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "left", + "id": "0392d399-f6dd-4c82-8062-c1e9c0d34835", + "path": "/stick/left", + "interactions": "", + "processors": "", + "groups": "Joystick", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "right", + "id": "942a66d9-d42f-43d6-8d70-ecb4ba5363bc", + "path": "/stick/right", + "interactions": "", + "processors": "", + "groups": "Joystick", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "Keyboard", + "id": "ff527021-f211-4c02-933e-5976594c46ed", + "path": "2DVector", + "interactions": "", + "processors": "", + "groups": "", + "action": "Navigate", + "isComposite": true, + "isPartOfComposite": false + }, + { + "name": "up", + "id": "563fbfdd-0f09-408d-aa75-8642c4f08ef0", + "path": "/w", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "up", + "id": "eb480147-c587-4a33-85ed-eb0ab9942c43", + "path": "/upArrow", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "down", + "id": "2bf42165-60bc-42ca-8072-8c13ab40239b", + "path": "/s", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "down", + "id": "85d264ad-e0a0-4565-b7ff-1a37edde51ac", + "path": "/downArrow", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "left", + "id": "74214943-c580-44e4-98eb-ad7eebe17902", + "path": "/a", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "left", + "id": "cea9b045-a000-445b-95b8-0c171af70a3b", + "path": "/leftArrow", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "right", + "id": "8607c725-d935-4808-84b1-8354e29bab63", + "path": "/d", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "right", + "id": "4cda81dc-9edd-4e03-9d7c-a71a14345d0b", + "path": "/rightArrow", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "", + "id": "9e92bb26-7e3b-4ec4-b06b-3c8f8e498ddc", + "path": "*/{Submit}", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse;Gamepad;Touch;Joystick;XR", + "action": "Submit", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "82627dcc-3b13-4ba9-841d-e4b746d6553e", + "path": "*/{Cancel}", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse;Gamepad;Touch;Joystick;XR", + "action": "Cancel", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "c52c8e0b-8179-41d3-b8a1-d149033bbe86", + "path": "/position", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Point", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "e1394cbc-336e-44ce-9ea8-6007ed6193f7", + "path": "/position", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Point", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "5693e57a-238a-46ed-b5ae-e64e6e574302", + "path": "/touch*/position", + "interactions": "", + "processors": "", + "groups": "Touch", + "action": "Point", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "4faf7dc9-b979-4210-aa8c-e808e1ef89f5", + "path": "/leftButton", + "interactions": "", + "processors": "", + "groups": ";Keyboard&Mouse", + "action": "Click", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "8d66d5ba-88d7-48e6-b1cd-198bbfef7ace", + "path": "/tip", + "interactions": "", + "processors": "", + "groups": ";Keyboard&Mouse", + "action": "Click", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "47c2a644-3ebc-4dae-a106-589b7ca75b59", + "path": "/touch*/press", + "interactions": "", + "processors": "", + "groups": "Touch", + "action": "Click", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "bb9e6b34-44bf-4381-ac63-5aa15d19f677", + "path": "/trigger", + "interactions": "", + "processors": "", + "groups": "XR", + "action": "Click", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "38c99815-14ea-4617-8627-164d27641299", + "path": "/scroll", + "interactions": "", + "processors": "", + "groups": ";Keyboard&Mouse", + "action": "ScrollWheel", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "24066f69-da47-44f3-a07e-0015fb02eb2e", + "path": "/middleButton", + "interactions": "", + "processors": "", + "groups": ";Keyboard&Mouse", + "action": "MiddleClick", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "4c191405-5738-4d4b-a523-c6a301dbf754", + "path": "/rightButton", + "interactions": "", + "processors": "", + "groups": ";Keyboard&Mouse", + "action": "RightClick", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "7236c0d9-6ca3-47cf-a6ee-a97f5b59ea77", + "path": "/devicePosition", + "interactions": "", + "processors": "", + "groups": "XR", + "action": "TrackedDevicePosition", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "23e01e3a-f935-4948-8d8b-9bcac77714fb", + "path": "/deviceRotation", + "interactions": "", + "processors": "", + "groups": "XR", + "action": "TrackedDeviceOrientation", + "isComposite": false, + "isPartOfComposite": false + } + ] + } + ], + "controlSchemes": [ + { + "name": "Keyboard&Mouse", + "bindingGroup": "Keyboard&Mouse", + "devices": [ + { + "devicePath": "", + "isOptional": false, + "isOR": false + }, + { + "devicePath": "", + "isOptional": false, + "isOR": false + } + ] + }, + { + "name": "Gamepad", + "bindingGroup": "Gamepad", + "devices": [ + { + "devicePath": "", + "isOptional": false, + "isOR": false + } + ] + }, + { + "name": "Touch", + "bindingGroup": "Touch", + "devices": [ + { + "devicePath": "", + "isOptional": false, + "isOR": false + } + ] + }, + { + "name": "Joystick", + "bindingGroup": "Joystick", + "devices": [ + { + "devicePath": "", + "isOptional": false, + "isOR": false + } + ] + }, + { + "name": "XR", + "bindingGroup": "XR", + "devices": [ + { + "devicePath": "", + "isOptional": false, + "isOR": false + } + ] + } + ] +} \ No newline at end of file diff --git a/InsAsterix/Assets/PlayerActions.inputactions.meta b/InsAsterix/Assets/PlayerActions.inputactions.meta new file mode 100644 index 00000000..403777b2 --- /dev/null +++ b/InsAsterix/Assets/PlayerActions.inputactions.meta @@ -0,0 +1,14 @@ +fileFormatVersion: 2 +guid: 9900487a8eaa15641bdf56f14edfb3f1 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 8404be70184654265930450def6a9037, type: 3} + generateWrapperCode: 0 + wrapperCodePath: + wrapperClassName: + wrapperCodeNamespace: diff --git a/InsAsterix/Assets/PlayerControls.cs b/InsAsterix/Assets/PlayerControls.cs new file mode 100644 index 00000000..c0022b9d --- /dev/null +++ b/InsAsterix/Assets/PlayerControls.cs @@ -0,0 +1,181 @@ + +using UnityEngine; + +// Nouvelle version du Platform Character Controller de Gwen + +public class PlayerController : MonoBehaviour +{ + [Header("Main Components")] + [Tooltip("Position de départ du personnage")] [SerializeField] private Transform spawn; + [Tooltip("Corps du personnage responsable des forces et mouvements")] [SerializeField] private Rigidbody2D rb2D; + [Tooltip("Corps du personnage responsable des collisions")] [SerializeField] private Collider2D bodyCollider; + [Tooltip("Position du vérificateur de sol nécessaire au saut")] [SerializeField] private Transform groundCheck; + [Tooltip("Layer à utiliser pour identifier le sol")] [SerializeField] private LayerMask groundMask; + [Tooltip("Position du vérificateur de mur nécessaire au wall jump")] [SerializeField] private Transform wallCheck; + [Tooltip("Layer a utiliser pour identifier un mur")] [SerializeField] private LayerMask wallMask; + [Tooltip("Liste de sons jouable par le joueur (exemple : Saut,Mort)")] [SerializeField] private AudioClip[] cliplist; + + [Header("Move Variables")] + [Tooltip("Vitesse de marche")] [SerializeField] private float defaultSpeed; + [Tooltip("Multiplieur amplificateur de vitesse")][Range(1f,3f)] [SerializeField] private float sprintMultiplier; + [Tooltip("Multiplieur réducteur de vitesse")][Range(0,1f)] [SerializeField] private float crouchMultiplier; + private float _moveSpeed; + private float _horizontal; // Movement Input + private float _vertical; // Crouch Input + private SpriteRenderer _spriteRenderer; + + [Header("Jump Variables")] + [Tooltip("Hauteur du saut")][Min(20)][SerializeField] private float jumpForce; + [Tooltip("Temps d'attente entre 2 sauts")][SerializeField] private float jumpCooldown; + [Tooltip("Multiplieur réducteur pour ralentir la vitesse pendant le saut et la distance par la même occasion")][Range(0,1f)] [SerializeField] private float jumpMultiplier; + private float _defaultJump; + private float _lastJump; + private bool _isGrounded; + private Collider2D _groundCollider; + + [Header("Death Variables")] + [Tooltip("Hauteur du saut lors de l'animation de mort")][Min(15)] [SerializeField] private float jumpHeight; + + private static bool _isDead = false; + + + // [Header("Wall Sliding and Jumping variables")] + + + // Start is called before the first frame update + void Start() + { + rb2D = gameObject.GetComponent(); + if(spawn != null) + { + rb2D.position = spawn.position; + } + _moveSpeed = defaultSpeed; + _isGrounded = false; + _defaultJump = jumpForce; + _isDead = false; + _lastJump = Time.time; + _spriteRenderer = gameObject.GetComponent(); + + } + + // Update is called once per frame + void Update() + { + + if (_isDead) + { + return; + } + _horizontal = Input.GetAxisRaw("Horizontal"); + _vertical = Input.GetAxisRaw("Vertical"); + Speed(); + } + + void FixedUpdate() + { + if (!_isDead) + { + Moving(); + Flip(); + Jumping(); + } + } + + void Speed() + { + + if (!_isGrounded) + { + _moveSpeed = defaultSpeed *jumpMultiplier; + return; + } + if (_vertical < -0.99f || Input.GetButton("Crouch")) + { + _moveSpeed = defaultSpeed * crouchMultiplier; + //anim.CrossFade("Crouch", 0f, 0); + } + else if (_horizontal < -.9f || _horizontal > 0.1f) + { + if (Input.GetButton("Sprint")) + { + _moveSpeed = defaultSpeed * sprintMultiplier; + //anim.CrossFade("Sprint", 0f, 0); + } + else + { + //anim.CrossFade("Walk", 0f, 0); + _moveSpeed = defaultSpeed; + } + } + else + { + //anim.CrossFade("Idle", 0f, 0); + } + + } + void Moving() + { + if (_horizontal > 0.1f || _horizontal < -0.99f) + { + + rb2D.AddForce(new Vector2(_horizontal * _moveSpeed, 0f), ForceMode2D.Impulse); + } + } + void Jumping() + { + _isGrounded = Physics2D.OverlapBox(groundCheck.position, new Vector2(0.3f, 0.03f),0f, groundMask) ; + + + if (_isGrounded && (Input.GetButton("Jump") || _vertical > 0.1f)) + { + if(Time.time - _lastJump > jumpCooldown) + { + + + _lastJump = Time.time; + rb2D.AddForce(new Vector2(0f, jumpForce), ForceMode2D.Impulse); + _isGrounded = false; + //anim.CrossFade("Jump", 0f, 0); + } + + } + } + + void Flip() + { + if(_horizontal < -0.99f) + { + _spriteRenderer.flipX = true; + } + else if (_horizontal > 0.01f) + { + _spriteRenderer.flipX = false; + } + } + + void Kill() + { + bodyCollider.enabled = false; + rb2D.AddForce(Vector2.up * jumpHeight, ForceMode2D.Impulse); + _isDead = true; + //anim.CrossFade("Death", 0f,0); + } + + + + public static bool IsDead() + { + return _isDead; + } + public void IncreaseSpeed(float value) + { + defaultSpeed += value; + } + + public static void Resurrect() + { + _isDead = false; + } + +} \ No newline at end of file diff --git a/InsAsterix/Assets/PlayerControls.cs.meta b/InsAsterix/Assets/PlayerControls.cs.meta new file mode 100644 index 00000000..db90e438 --- /dev/null +++ b/InsAsterix/Assets/PlayerControls.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 03352c416ff6553489179ed4470afe5a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/InsAsterix/Assets/Plugins.meta b/InsAsterix/Assets/Plugins.meta new file mode 100644 index 00000000..7167093b --- /dev/null +++ b/InsAsterix/Assets/Plugins.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 07a83ad26ba2b6a4e8f28a9d6d82b4db +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/InsAsterix/Assets/Plugins/Demigiant.meta b/InsAsterix/Assets/Plugins/Demigiant.meta new file mode 100644 index 00000000..c6818985 --- /dev/null +++ b/InsAsterix/Assets/Plugins/Demigiant.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 52fed19b93bb03c4480b6f73a4f990b8 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/InsAsterix/Assets/Plugins/Demigiant/DOTween.meta b/InsAsterix/Assets/Plugins/Demigiant/DOTween.meta new file mode 100644 index 00000000..cbebc392 --- /dev/null +++ b/InsAsterix/Assets/Plugins/Demigiant/DOTween.meta @@ -0,0 +1,21 @@ +fileFormatVersion: 2 +guid: a50bd9a009c8dfc4ebd88cc8101225a7 +labels: +- Tween +- Tweening +- Animation +- HOTween +- Paths +- iTween +- DFTween +- LeanTween +- Ease +- Easing +- Shake +- Punch +- 2DToolkit +- TextMeshPro +- Text +folderAsset: yes +DefaultImporter: + userData: diff --git a/InsAsterix/Assets/Plugins/Demigiant/DOTween/DOTween.XML b/InsAsterix/Assets/Plugins/Demigiant/DOTween/DOTween.XML new file mode 100644 index 00000000..ceb16e43 --- /dev/null +++ b/InsAsterix/Assets/Plugins/Demigiant/DOTween/DOTween.XML @@ -0,0 +1,3077 @@ + + + + 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 + + + + + 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 + + + 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 + + + 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 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 intervale 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 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/InsAsterix/Assets/Plugins/Demigiant/DOTween/DOTween.XML.meta b/InsAsterix/Assets/Plugins/Demigiant/DOTween/DOTween.XML.meta new file mode 100644 index 00000000..7a866b54 --- /dev/null +++ b/InsAsterix/Assets/Plugins/Demigiant/DOTween/DOTween.XML.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: 34192c5e0d14aee43a0e86cc4823268a +TextScriptImporter: + userData: diff --git a/InsAsterix/Assets/Plugins/Demigiant/DOTween/DOTween.dll b/InsAsterix/Assets/Plugins/Demigiant/DOTween/DOTween.dll new file mode 100644 index 0000000000000000000000000000000000000000..475d77ca1d6b863a200e949d8151dbc274d962bc GIT binary patch literal 175104 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 literal 0 HcmV?d00001 diff --git a/InsAsterix/Assets/Plugins/Demigiant/DOTween/DOTween.dll.meta b/InsAsterix/Assets/Plugins/Demigiant/DOTween/DOTween.dll.meta new file mode 100644 index 00000000..482dbb83 --- /dev/null +++ b/InsAsterix/Assets/Plugins/Demigiant/DOTween/DOTween.dll.meta @@ -0,0 +1,22 @@ +fileFormatVersion: 2 +guid: a811bde74b26b53498b4f6d872b09b6d +PluginImporter: + serializedVersion: 1 + iconMap: {} + executionOrder: {} + isPreloaded: 0 + platformData: + Any: + enabled: 1 + settings: {} + Editor: + enabled: 0 + settings: + DefaultValueInitialized: true + WindowsStoreApps: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/InsAsterix/Assets/Plugins/Demigiant/DOTween/Editor.meta b/InsAsterix/Assets/Plugins/Demigiant/DOTween/Editor.meta new file mode 100644 index 00000000..532edfb4 --- /dev/null +++ b/InsAsterix/Assets/Plugins/Demigiant/DOTween/Editor.meta @@ -0,0 +1,5 @@ +fileFormatVersion: 2 +guid: b27f58ae5d5c33a4bb2d1f4f34bd036d +folderAsset: yes +DefaultImporter: + userData: diff --git a/InsAsterix/Assets/Plugins/Demigiant/DOTween/Editor/DOTweenEditor.XML b/InsAsterix/Assets/Plugins/Demigiant/DOTween/Editor/DOTweenEditor.XML new file mode 100644 index 00000000..26bd562a --- /dev/null +++ b/InsAsterix/Assets/Plugins/Demigiant/DOTween/Editor/DOTweenEditor.XML @@ -0,0 +1,124 @@ + + + + DOTweenEditor + + + +

+ Contains compatibility methods taken from DemiEditor (for when DOTween is without it) + + + + + 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 utiity 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/InsAsterix/Assets/Plugins/Demigiant/DOTween/Editor/DOTweenEditor.XML.meta b/InsAsterix/Assets/Plugins/Demigiant/DOTween/Editor/DOTweenEditor.XML.meta new file mode 100644 index 00000000..7cec1135 --- /dev/null +++ b/InsAsterix/Assets/Plugins/Demigiant/DOTween/Editor/DOTweenEditor.XML.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: 2e2c6224d345d9249acfa6e8ef40bb2d +TextScriptImporter: + userData: diff --git a/InsAsterix/Assets/Plugins/Demigiant/DOTween/Editor/DOTweenEditor.dll b/InsAsterix/Assets/Plugins/Demigiant/DOTween/Editor/DOTweenEditor.dll new file mode 100644 index 0000000000000000000000000000000000000000..9c2e7cadb3406d362b18734079bb46cdafd01479 GIT binary patch literal 69632 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%0AbUPrLhxqvT0k6{Kr$CIT*$iJnopGZ$WO}!p4PK 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%0A>n#dj}kkh>#JpxMLRv{8y=s-MV*Q}11 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 literal 0 HcmV?d00001 diff --git a/InsAsterix/Assets/Plugins/Demigiant/DOTween/Editor/DOTweenEditor.dll.meta b/InsAsterix/Assets/Plugins/Demigiant/DOTween/Editor/DOTweenEditor.dll.meta new file mode 100644 index 00000000..53590f3b --- /dev/null +++ b/InsAsterix/Assets/Plugins/Demigiant/DOTween/Editor/DOTweenEditor.dll.meta @@ -0,0 +1,22 @@ +fileFormatVersion: 2 +guid: 45d5034162d6cf04dbe46da84fc7d074 +PluginImporter: + serializedVersion: 1 + iconMap: {} + executionOrder: {} + isPreloaded: 0 + platformData: + Any: + enabled: 0 + settings: {} + Editor: + enabled: 1 + settings: + DefaultValueInitialized: true + WindowsStoreApps: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/InsAsterix/Assets/Plugins/Demigiant/DOTween/Editor/Imgs.meta b/InsAsterix/Assets/Plugins/Demigiant/DOTween/Editor/Imgs.meta new file mode 100644 index 00000000..a81ba5ff --- /dev/null +++ b/InsAsterix/Assets/Plugins/Demigiant/DOTween/Editor/Imgs.meta @@ -0,0 +1,5 @@ +fileFormatVersion: 2 +guid: 0034ebae0c2a9344e897db1160d71b6d +folderAsset: yes +DefaultImporter: + userData: diff --git a/InsAsterix/Assets/Plugins/Demigiant/DOTween/Editor/Imgs/DOTweenIcon.png b/InsAsterix/Assets/Plugins/Demigiant/DOTween/Editor/Imgs/DOTweenIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..d06fc7c3e49fb705b19f50a23884e11e08fd6e89 GIT binary patch literal 1565 zcmV+&2IBdNP)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 literal 0 HcmV?d00001 diff --git a/InsAsterix/Assets/Plugins/Demigiant/DOTween/Editor/Imgs/DOTweenIcon.png.meta b/InsAsterix/Assets/Plugins/Demigiant/DOTween/Editor/Imgs/DOTweenIcon.png.meta new file mode 100644 index 00000000..61c3ccec --- /dev/null +++ b/InsAsterix/Assets/Plugins/Demigiant/DOTween/Editor/Imgs/DOTweenIcon.png.meta @@ -0,0 +1,47 @@ +fileFormatVersion: 2 +guid: 8da095e39e9b4df488dfd436f81116d6 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 128 + textureSettings: + filterMode: 1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/InsAsterix/Assets/Plugins/Demigiant/DOTween/Editor/Imgs/DOTweenMiniIcon.png b/InsAsterix/Assets/Plugins/Demigiant/DOTween/Editor/Imgs/DOTweenMiniIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..7cd74c1a26df1a45564c7a0e21c62d0ef3af2fd1 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/InsAsterix/Assets/Plugins/Demigiant/DOTween/Editor/Imgs/DOTweenMiniIcon.png.meta b/InsAsterix/Assets/Plugins/Demigiant/DOTween/Editor/Imgs/DOTweenMiniIcon.png.meta new file mode 100644 index 00000000..c343a61a --- /dev/null +++ b/InsAsterix/Assets/Plugins/Demigiant/DOTween/Editor/Imgs/DOTweenMiniIcon.png.meta @@ -0,0 +1,68 @@ +fileFormatVersion: 2 +guid: 61521df2e071645488ba3d05e49289ae +timeCreated: 1602317874 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/InsAsterix/Assets/Plugins/Demigiant/DOTween/Editor/Imgs/Footer.png b/InsAsterix/Assets/Plugins/Demigiant/DOTween/Editor/Imgs/Footer.png new file mode 100644 index 0000000000000000000000000000000000000000..e29d02fe18b777b1d316feb647b339803c5126de GIT binary patch literal 4409 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 literal 0 HcmV?d00001 diff --git a/InsAsterix/Assets/Plugins/Demigiant/DOTween/Editor/Imgs/Footer.png.meta b/InsAsterix/Assets/Plugins/Demigiant/DOTween/Editor/Imgs/Footer.png.meta new file mode 100644 index 00000000..7ca19119 --- /dev/null +++ b/InsAsterix/Assets/Plugins/Demigiant/DOTween/Editor/Imgs/Footer.png.meta @@ -0,0 +1,47 @@ +fileFormatVersion: 2 +guid: 7051dba417b3d53409f2918f1ea4938d +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 256 + textureSettings: + filterMode: 1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/InsAsterix/Assets/Plugins/Demigiant/DOTween/Editor/Imgs/Footer_dark.png b/InsAsterix/Assets/Plugins/Demigiant/DOTween/Editor/Imgs/Footer_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..e48db5ef7a2b83eff50d6e3b5fe9ba3bcd4a5015 GIT binary patch literal 4429 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 TqmFO~00000NkvXXu0mjf{EM6C literal 0 HcmV?d00001 diff --git a/InsAsterix/Assets/Plugins/Demigiant/DOTween/Editor/Imgs/Footer_dark.png.meta b/InsAsterix/Assets/Plugins/Demigiant/DOTween/Editor/Imgs/Footer_dark.png.meta new file mode 100644 index 00000000..f12a1a7d --- /dev/null +++ b/InsAsterix/Assets/Plugins/Demigiant/DOTween/Editor/Imgs/Footer_dark.png.meta @@ -0,0 +1,47 @@ +fileFormatVersion: 2 +guid: 519694efe2bb2914788b151fbd8c01f4 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 0 + textureType: -1 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/InsAsterix/Assets/Plugins/Demigiant/DOTween/Editor/Imgs/Header.jpg b/InsAsterix/Assets/Plugins/Demigiant/DOTween/Editor/Imgs/Header.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4d710d719075150879b1ee76680af87791c4d3b3 GIT binary patch literal 22787 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 QE#Li`lK-oJv9mh=KQ4fgsQ>@~ literal 0 HcmV?d00001 diff --git a/InsAsterix/Assets/Plugins/Demigiant/DOTween/Editor/Imgs/Header.jpg.meta b/InsAsterix/Assets/Plugins/Demigiant/DOTween/Editor/Imgs/Header.jpg.meta new file mode 100644 index 00000000..26e42551 --- /dev/null +++ b/InsAsterix/Assets/Plugins/Demigiant/DOTween/Editor/Imgs/Header.jpg.meta @@ -0,0 +1,47 @@ +fileFormatVersion: 2 +guid: 78a59ca99f8987941adb61f9e14a06a7 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 512 + textureSettings: + filterMode: 1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/InsAsterix/Assets/Plugins/Demigiant/DOTween/Modules.meta b/InsAsterix/Assets/Plugins/Demigiant/DOTween/Modules.meta new file mode 100644 index 00000000..24cd2ac5 --- /dev/null +++ b/InsAsterix/Assets/Plugins/Demigiant/DOTween/Modules.meta @@ -0,0 +1,5 @@ +fileFormatVersion: 2 +guid: 143604b8bad857d47a6f7cc7a533e2dc +folderAsset: yes +DefaultImporter: + userData: diff --git a/InsAsterix/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleAudio.cs b/InsAsterix/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleAudio.cs new file mode 100644 index 00000000..d958ae03 --- /dev/null +++ b/InsAsterix/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleAudio.cs @@ -0,0 +1,198 @@ +// 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/InsAsterix/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleAudio.cs.meta b/InsAsterix/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleAudio.cs.meta new file mode 100644 index 00000000..50aa010f --- /dev/null +++ b/InsAsterix/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleAudio.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b766d08851589514b97afb23c6f30a70 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/InsAsterix/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleEPOOutline.cs b/InsAsterix/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleEPOOutline.cs new file mode 100644 index 00000000..2ab3775c --- /dev/null +++ b/InsAsterix/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleEPOOutline.cs @@ -0,0 +1,146 @@ +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/InsAsterix/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleEPOOutline.cs.meta b/InsAsterix/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleEPOOutline.cs.meta new file mode 100644 index 00000000..4b8991f5 --- /dev/null +++ b/InsAsterix/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleEPOOutline.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: e944529dcaee98f4e9498d80e541d93e +timeCreated: 1602593330 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/InsAsterix/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModulePhysics.cs b/InsAsterix/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModulePhysics.cs new file mode 100644 index 00000000..08b07006 --- /dev/null +++ b/InsAsterix/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModulePhysics.cs @@ -0,0 +1,216 @@ +// 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/InsAsterix/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModulePhysics.cs.meta b/InsAsterix/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModulePhysics.cs.meta new file mode 100644 index 00000000..0ce0d755 --- /dev/null +++ b/InsAsterix/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModulePhysics.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: dae9aa560b4242648a3affa2bfabc365 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/InsAsterix/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModulePhysics2D.cs b/InsAsterix/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModulePhysics2D.cs new file mode 100644 index 00000000..8ce2b561 --- /dev/null +++ b/InsAsterix/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModulePhysics2D.cs @@ -0,0 +1,193 @@ +// 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/InsAsterix/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModulePhysics2D.cs.meta b/InsAsterix/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModulePhysics2D.cs.meta new file mode 100644 index 00000000..ca9ed299 --- /dev/null +++ b/InsAsterix/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModulePhysics2D.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 230fe34542e175245ba74b4659dae700 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/InsAsterix/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleSprite.cs b/InsAsterix/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleSprite.cs new file mode 100644 index 00000000..72afb7ba --- /dev/null +++ b/InsAsterix/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleSprite.cs @@ -0,0 +1,93 @@ +// 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/InsAsterix/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleSprite.cs.meta b/InsAsterix/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleSprite.cs.meta new file mode 100644 index 00000000..a0c67c42 --- /dev/null +++ b/InsAsterix/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleSprite.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 188918ab119d93148aa0de59ccf5286b +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/InsAsterix/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleUI.cs b/InsAsterix/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleUI.cs new file mode 100644 index 00000000..2381f4cb --- /dev/null +++ b/InsAsterix/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleUI.cs @@ -0,0 +1,662 @@ +// 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/InsAsterix/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleUI.cs.meta b/InsAsterix/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleUI.cs.meta new file mode 100644 index 00000000..60d55eff --- /dev/null +++ b/InsAsterix/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleUI.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a060394c03331a64392db53a10e7f2d1 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/InsAsterix/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleUnityVersion.cs b/InsAsterix/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleUnityVersion.cs new file mode 100644 index 00000000..8f818ba5 --- /dev/null +++ b/InsAsterix/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleUnityVersion.cs @@ -0,0 +1,389 @@ +// 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/InsAsterix/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleUnityVersion.cs.meta b/InsAsterix/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleUnityVersion.cs.meta new file mode 100644 index 00000000..290189f5 --- /dev/null +++ b/InsAsterix/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleUnityVersion.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 63c02322328255542995bd02b47b0457 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/InsAsterix/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleUtils.cs b/InsAsterix/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleUtils.cs new file mode 100644 index 00000000..12a365d4 --- /dev/null +++ b/InsAsterix/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleUtils.cs @@ -0,0 +1,167 @@ +// 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/InsAsterix/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleUtils.cs.meta b/InsAsterix/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleUtils.cs.meta new file mode 100644 index 00000000..ab62186c --- /dev/null +++ b/InsAsterix/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleUtils.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7bcaf917d9cf5b84090421a5a2abe42e +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/InsAsterix/Assets/Plugins/Demigiant/DOTween/readme.txt b/InsAsterix/Assets/Plugins/Demigiant/DOTween/readme.txt new file mode 100644 index 00000000..37ff7ef5 --- /dev/null +++ b/InsAsterix/Assets/Plugins/Demigiant/DOTween/readme.txt @@ -0,0 +1,29 @@ +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/InsAsterix/Assets/Plugins/Demigiant/DOTween/readme.txt.meta b/InsAsterix/Assets/Plugins/Demigiant/DOTween/readme.txt.meta new file mode 100644 index 00000000..37991656 --- /dev/null +++ b/InsAsterix/Assets/Plugins/Demigiant/DOTween/readme.txt.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: fccfc62abf2eb0a4db614853430894fd +TextScriptImporter: + userData: diff --git a/InsAsterix/Assets/Plugins/Sirenix.meta b/InsAsterix/Assets/Plugins/Sirenix.meta new file mode 100644 index 00000000..41e82c0b --- /dev/null +++ b/InsAsterix/Assets/Plugins/Sirenix.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 04ecb813b57f4a645bce354be020e478 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/InsAsterix/Assets/Plugins/Sirenix/Odin Validator.meta b/InsAsterix/Assets/Plugins/Sirenix/Odin Validator.meta new file mode 100644 index 00000000..50567b2d --- /dev/null +++ b/InsAsterix/Assets/Plugins/Sirenix/Odin Validator.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2c4d914f1bc2a794fb6d336bc972a1ce +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/InsAsterix/Assets/Plugins/Sirenix/Odin Validator/Editor.meta b/InsAsterix/Assets/Plugins/Sirenix/Odin Validator/Editor.meta new file mode 100644 index 00000000..5b642cea --- /dev/null +++ b/InsAsterix/Assets/Plugins/Sirenix/Odin Validator/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 26e34da4ce0b5ef43a37519908e3cca3 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/InsAsterix/Assets/Plugins/Sirenix/Odin Validator/Editor/Config.meta b/InsAsterix/Assets/Plugins/Sirenix/Odin Validator/Editor/Config.meta new file mode 100644 index 00000000..7b1c62ba --- /dev/null +++ b/InsAsterix/Assets/Plugins/Sirenix/Odin Validator/Editor/Config.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a4f2d1f0dfca7944f8eedc7681e05ead +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/InsAsterix/Assets/Plugins/Sirenix/Odin Validator/Editor/Config/GlobalValidationConfig.asset b/InsAsterix/Assets/Plugins/Sirenix/Odin Validator/Editor/Config/GlobalValidationConfig.asset new file mode 100644 index 00000000..633940a2 --- /dev/null +++ b/InsAsterix/Assets/Plugins/Sirenix/Odin Validator/Editor/Config/GlobalValidationConfig.asset @@ -0,0 +1,84 @@ +%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: 0} + m_Name: GlobalValidationConfig + m_EditorClassIdentifier: + ValidateScenesOnSceneLoad: + serializedValue: 0 + changedFromDefault: 0 + ValidateMainProfileOnLoad: + serializedValue: 0 + changedFromDefault: 0 + QueueAssetsOnLoad: + serializedValue: 0 + changedFromDefault: 0 + QueueScenesOnLoad: + serializedValue: 0 + changedFromDefault: 0 + PopulateQueueOnAssetDeleted: + serializedValue: 0 + changedFromDefault: 0 + PopulateQueueOnGameObjectDeleted: + serializedValue: 0 + changedFromDefault: 0 + RunMainValidationSessionOnLoad: + serializedValue: 0 + changedFromDefault: 0 + DeepValidation: + serializedValue: 0 + changedFromDefault: 0 + ContinuouslyValidateVisibleIssues: + serializedValue: 0 + changedFromDefault: 0 + PauseValidationWhileWorkingInSceneView: + serializedValue: 0 + changedFromDefault: 0 + PingOnDoubleClick: + serializedValue: 0 + changedFromDefault: 0 + FocusObjectOnDoubleClick: + serializedValue: 0 + changedFromDefault: 0 + FrameSelection: + serializedValue: 0 + changedFromDefault: 0 + SkipFirstSample: + serializedValue: 0 + changedFromDefault: 0 + ShowWidget: + serializedValue: 0 + changedFromDefault: 0 + DebugMode: + serializedValue: 0 + changedFromDefault: 0 + ShowWidgetOnlyWhenErrorOrWarnings: + serializedValue: 0 + changedFromDefault: 0 + EnableLeakDetection: + serializedValue: 0 + changedFromDefault: 0 + SupressAssetLoadErrorsFromUnityLogger: + serializedValue: 0 + changedFromDefault: 0 + OpenComponentInInspectorAndCloseOthers: + serializedValue: 0 + changedFromDefault: 0 + WatchForChanges: + serializedValue: 0 + changedFromDefault: 0 + ValidateInBackground: + serializedValue: 0 + changedFromDefault: 0 + KeepMainValidationSessionAliveInBackground: + serializedValue: 0 + changedFromDefault: 0 + HasShownValidationConfig: 0 diff --git a/InsAsterix/Assets/Plugins/Sirenix/Odin Validator/Editor/Config/GlobalValidationConfig.asset.meta b/InsAsterix/Assets/Plugins/Sirenix/Odin Validator/Editor/Config/GlobalValidationConfig.asset.meta new file mode 100644 index 00000000..2a90857f --- /dev/null +++ b/InsAsterix/Assets/Plugins/Sirenix/Odin Validator/Editor/Config/GlobalValidationConfig.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2e9fd1f77cb525347ae25a7452c54bd6 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/InsAsterix/Assets/Plugins/Sirenix/Odin Validator/Editor/Profiles.meta b/InsAsterix/Assets/Plugins/Sirenix/Odin Validator/Editor/Profiles.meta new file mode 100644 index 00000000..3e3833ed --- /dev/null +++ b/InsAsterix/Assets/Plugins/Sirenix/Odin Validator/Editor/Profiles.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4042abf49c9354e4a9a358d7cbe567e5 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/InsAsterix/Assets/Plugins/Sirenix/Odin Validator/Editor/Profiles/Main Profile.asset b/InsAsterix/Assets/Plugins/Sirenix/Odin Validator/Editor/Profiles/Main Profile.asset new file mode 100644 index 00000000..5f7f5f00 --- /dev/null +++ b/InsAsterix/Assets/Plugins/Sirenix/Odin Validator/Editor/Profiles/Main Profile.asset @@ -0,0 +1,65 @@ +%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: 0} + m_Name: Main Profile + m_EditorClassIdentifier: + Include: + - Enabled: 1 + Type: 2 + Asset: + Path: + Filter: + Object: {fileID: 0} + Scene: + Type: 2 + Value: + IncludeAssetDependencies: 1 + AssetBundle: + AddressableGroup: + - Enabled: 1 + Type: 2 + Asset: + Path: + Filter: + Object: {fileID: 0} + Scene: + Type: 1 + Value: + IncludeAssetDependencies: 1 + AssetBundle: + AddressableGroup: + - Enabled: 1 + Type: 2 + Asset: + Path: + Filter: + Object: {fileID: 0} + Scene: + Type: 0 + Value: Assets + IncludeAssetDependencies: 0 + AssetBundle: + AddressableGroup: + - Enabled: 1 + Type: 0 + Asset: + Path: Assets + Filter: + Object: {fileID: 0} + Scene: + Type: 0 + Value: + IncludeAssetDependencies: 0 + AssetBundle: + AddressableGroup: + Exclude: [] + icon: 391 diff --git a/InsAsterix/Assets/Plugins/Sirenix/Odin Validator/Editor/Profiles/Main Profile.asset.meta b/InsAsterix/Assets/Plugins/Sirenix/Odin Validator/Editor/Profiles/Main Profile.asset.meta new file mode 100644 index 00000000..ba2a0f59 --- /dev/null +++ b/InsAsterix/Assets/Plugins/Sirenix/Odin Validator/Editor/Profiles/Main Profile.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 95e4d7852281e9e4f9aee21ccb3bbb62 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/InsAsterix/Assets/Resources.meta b/InsAsterix/Assets/Resources.meta new file mode 100644 index 00000000..012a4105 --- /dev/null +++ b/InsAsterix/Assets/Resources.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5405f5b5ac677cd4ea6e323a956daa16 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/InsAsterix/Assets/Resources/DOTweenSettings.asset b/InsAsterix/Assets/Resources/DOTweenSettings.asset new file mode 100644 index 00000000..62ebbaf2 --- /dev/null +++ b/InsAsterix/Assets/Resources/DOTweenSettings.asset @@ -0,0 +1,54 @@ +%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: 16995157, guid: a811bde74b26b53498b4f6d872b09b6d, type: 3} + m_Name: DOTweenSettings + m_EditorClassIdentifier: + useSafeMode: 1 + safeModeOptions: + logBehaviour: 2 + nestedTweenFailureBehaviour: 0 + timeScale: 1 + unscaledTimeScale: 1 + useSmoothDeltaTime: 0 + maxSmoothUnscaledTime: 0.15 + rewindCallbackMode: 0 + showUnityEditorReport: 0 + logBehaviour: 0 + drawGizmos: 1 + defaultRecyclable: 0 + defaultAutoPlay: 3 + defaultUpdateType: 0 + defaultTimeScaleIndependent: 0 + defaultEaseType: 6 + defaultEaseOvershootOrAmplitude: 1.70158 + defaultEasePeriod: 0 + defaultAutoKill: 1 + defaultLoopType: 0 + debugMode: 0 + debugStoreTargetId: 1 + showPreviewPanel: 1 + storeSettingsLocation: 0 + modules: + showPanel: 0 + audioEnabled: 1 + physicsEnabled: 1 + physics2DEnabled: 1 + spriteEnabled: 1 + uiEnabled: 1 + textMeshProEnabled: 0 + tk2DEnabled: 0 + deAudioEnabled: 0 + deUnityExtendedEnabled: 0 + epoOutlineEnabled: 0 + createASMDEF: 0 + showPlayingTweens: 0 + showPausedTweens: 0 diff --git a/InsAsterix/Assets/Resources/DOTweenSettings.asset.meta b/InsAsterix/Assets/Resources/DOTweenSettings.asset.meta new file mode 100644 index 00000000..7862d217 --- /dev/null +++ b/InsAsterix/Assets/Resources/DOTweenSettings.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2af8eaa87e8fa834e8dc3b2ad0b14ac9 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/InsAsterix/Assets/Scenes/Sandbox Gwen.unity b/InsAsterix/Assets/Scenes/Sandbox Gwen.unity index 4f52a6f1..de9aea29 100644 --- a/InsAsterix/Assets/Scenes/Sandbox Gwen.unity +++ b/InsAsterix/Assets/Scenes/Sandbox Gwen.unity @@ -1686,7 +1686,7 @@ GameObject: - component: {fileID: 253906655} - component: {fileID: 253906658} m_Layer: 0 - m_Name: Capsule + m_Name: Body m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -1701,8 +1701,8 @@ Transform: m_GameObject: {fileID: 253906654} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} - m_ConstrainProportionsScale: 0 + m_LocalScale: {x: 10, y: 10, z: 10} + m_ConstrainProportionsScale: 1 m_Children: [] m_Father: {fileID: 1760894969} m_RootOrder: 0 @@ -1748,7 +1748,7 @@ SpriteRenderer: m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 - m_Sprite: {fileID: -9095717837082945937, guid: 207ee8102dd4143d288186ef0be518ee, type: 3} + m_Sprite: {fileID: 2067066292, guid: f8bf3edc8aa60e54b9ff7968bef6a6db, type: 3} m_Color: {r: 1, g: 1, b: 1, a: 1} m_FlipX: 0 m_FlipY: 0 @@ -4159,6 +4159,7 @@ GameObject: - component: {fileID: 1760894970} - component: {fileID: 1760894973} - component: {fileID: 1760894972} + - component: {fileID: 1760894974} m_Layer: 0 m_Name: Player m_TagString: Untagged @@ -4198,7 +4199,7 @@ CapsuleCollider2D: m_UsedByEffector: 0 m_UsedByComposite: 0 m_Offset: {x: 0, y: 0} - m_Size: {x: 0.5, y: 1} + m_Size: {x: 0.62, y: 1.47} m_Direction: 0 --- !u!50 &1760894971 Rigidbody2D: @@ -4419,6 +4420,7 @@ MonoBehaviour: serializedVersion: 2 m_Bits: 72 spawnPoint: {fileID: 0} + anim: {fileID: 0} dashCooldown: 1.5 jumpCooldown: 0.5 death: @@ -4427,6 +4429,26 @@ MonoBehaviour: resurrect: m_PersistentCalls: m_Calls: [] +--- !u!95 &1760894974 +Animator: + serializedVersion: 5 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1760894967} + m_Enabled: 1 + m_Avatar: {fileID: 0} + m_Controller: {fileID: 9100000, guid: 4fe501f22a3148d45a236320ccfe3ae9, type: 2} + m_CullingMode: 0 + m_UpdateMode: 0 + m_ApplyRootMotion: 0 + m_LinearVelocityBlending: 0 + m_StabilizeFeet: 0 + m_WarningMessage: + m_HasTransformHierarchy: 1 + m_AllowConstantClipSamplingOptimization: 1 + m_KeepAnimatorStateOnDisable: 0 --- !u!1 &1934325932 GameObject: m_ObjectHideFlags: 0