Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
- public class MovementScript : MonoBehaviour {
- [Header("General Components")]
- public Rigidbody2D rb;
- [Header("Walk Config")]
- [SerializeField]
- float walkSpeed;
- [SerializeField] float maxWalkSpeed;
- [Tooltip("Standard value = 10")] [SerializeField] float slowDownAmount = 10;
- [Header("Jump configs")]
- [SerializeField]
- float jumpForce;
- [SerializeField] float jumpTimeCounter;
- float jumpTimeCounterOriginal;
- [Header("Ground check config")]
- [SerializeField] bool isGrounded = true;
- [SerializeField] private Transform groundCheck;
- [SerializeField] private float groundCheckRadius;
- [SerializeField] private LayerMask whatIsGround;
- [Header("Double Jump Config")]
- [SerializeField] private bool canDoubleJump = true;
- [SerializeField] private float doubleJumpForce = 50f;
- [Header("Run Config")]
- [SerializeField] float runSpeed;
- [SerializeField] float maxRunSpeed;
- private void Start()
- {
- rb = GetComponent<Rigidbody2D>();
- jumpTimeCounterOriginal = jumpTimeCounter;
- }
- private void Update()
- {
- if (Input.GetKey(KeyCode.LeftShift)) // Se eu estiver pressionando Shift...
- {
- Run(); // Método para correr
- } else
- {
- Walk(); // Método para andar
- }
- Jump(); // Método para pular
- CheckIfIsGrounded(); // Método para checar se o jogador está no chão
- DoubleJump(); // Método para gerenciar pulo duplo
- Flip(); // Método para virar o personagem, se necessário
- }
- void Walk()
- {
- if (Input.GetKey(KeyCode.D)) // andar para esquerda
- {
- rb.AddForce(new Vector2(walkSpeed, 0f), ForceMode2D.Force);
- }
- if (Input.GetKey(KeyCode.A)) // Andar para direita
- {
- rb.AddForce(new Vector2(-walkSpeed, 0f), ForceMode2D.Force);
- }
- if (rb.velocity.x > maxWalkSpeed) // Se o jogador passar da velocidade máxima, diminui ela gradativamente até seu limite
- {
- rb.velocity = new Vector2(rb.velocity.x - (slowDownAmount * Time.deltaTime), rb.velocity.y);
- }
- else if (rb.velocity.x < -maxWalkSpeed) // Se o jogador passar da velocidade máxima, diminui ela gradativamente até seu limite
- {
- rb.velocity = new Vector2(rb.velocity.x + (slowDownAmount * Time.deltaTime), rb.velocity.y);
- }
- }
- void Jump()
- {
- if (Input.GetKey(KeyCode.Space) && isGrounded) // Se estou no chão e aperto a tecla de pulo...
- {
- rb.velocity = new Vector2(rb.velocity.x, jumpForce);
- }
- if (Input.GetKey(KeyCode.Space) && !isGrounded) // Se segurar o botão de pulo, pula mais alto
- {
- if (jumpTimeCounter > 0)
- {
- rb.velocity = new Vector2(rb.velocity.x, jumpForce);
- jumpTimeCounter -= Time.deltaTime;
- }
- }
- if (Input.GetKeyUp(KeyCode.Space)) // Quando eu soltar a tecla espaço, meu timer é zerado (para evitar que o player volte a pular depois de dar o segundo pulo)
- {
- jumpTimeCounter = 0f;
- }
- }
- void CheckIfIsGrounded() // Checa se estamos no chão por meio de um OverlapCircle
- {
- isGrounded = Physics2D.OverlapCircle(groundCheck.transform.position, groundCheckRadius, whatIsGround);
- if (isGrounded)
- {
- jumpTimeCounter = jumpTimeCounterOriginal;
- canDoubleJump = true;
- }
- }
- void DoubleJump()
- {
- if (Input.GetKeyDown(KeyCode.Space) && !isGrounded) // Se eu não estiver no chão e tentar pular...
- {
- if (jumpTimeCounter <= 0 && canDoubleJump)
- {
- rb.velocity = new Vector2(rb.velocity.x, doubleJumpForce);
- canDoubleJump = false;
- }
- }
- }
- void Run() // Método para correr. Mesma lógica do método para andar, só que será executado quando pressionado shift (faço esta checagem no método Update)
- {
- if (Input.GetKey(KeyCode.D))
- {
- rb.AddForce(new Vector2(runSpeed, 0f), ForceMode2D.Force);
- }
- if (Input.GetKey(KeyCode.A))
- {
- rb.AddForce(new Vector2(-runSpeed, 0f), ForceMode2D.Force);
- }
- // Diferente do método de andar, porém, não diminuo a velocidade gradativamente. Travo ela a um valor.
- if (rb.velocity.x > maxRunSpeed)
- {
- rb.velocity = new Vector2(maxRunSpeed, rb.velocity.y);
- }
- else if (rb.velocity.x < -maxRunSpeed)
- {
- rb.velocity = new Vector2(-maxRunSpeed, rb.velocity.y);
- }
- }
- void Flip() // Aqui apenas verifico para qual direção o personagem está caminhando e multiplico sua escala por -1 se necessário
- {
- if (Input.GetKeyDown(KeyCode.A) && transform.localScale.x > 0)
- {
- transform.localScale = (new Vector2(transform.localScale.x * -1, transform.localScale.y));
- }
- if (Input.GetKeyDown(KeyCode.D) && transform.localScale.x < 0)
- {
- transform.localScale = (new Vector2(transform.localScale.x * -1, transform.localScale.y));
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement