Problema na movimentação em diagonal

Implementei a movimentação do personagem e tudo funcionou bem, incluindo corrida e salto, porém, quando ando nas diagonais, a movimentação muito lenta.

Está tudo programado para, na direção que for, resultar em 1 ou -1 nos eixos clicados. Porém, quando clico para os dois eixos, X e Y, ele vai apenas até 0.7

Queria saber se existe alguma forma padrão para solucionar isso. Lembro de ter visto, mas procurei e não encontrei em nenhuma aula.

Segue o código:

using UnityEngine;
using UnityEngine.InputSystem;

public class Movimentacao : MonoBehaviour {

    private Rigidbody rb;
    private Vector2 movimento;
    private Animator animator;

    public float velocidade = 2.5f; // Controla a velocidade do movimento
    public float forcaPulo = 200f; // Força do pulo

    [SerializeField] private Transform pePersonagem;
    [SerializeField] private LayerMask layerColisao;

    private int inputXHash = Animator.StringToHash("InputX");
    private int inputYHash = Animator.StringToHash("InputY");
    
    private bool noChao;

    private void Awake() {
        animator = GetComponent<Animator>();
        rb = GetComponent<Rigidbody>();
    }

    public void Movimentar(InputAction.CallbackContext valor) {
        movimento = valor.ReadValue<Vector2>();
    }

    public void Pular(InputAction.CallbackContext valor) {
        if (valor.performed && noChao) {
            rb.AddForce(Vector3.up * forcaPulo);
            animator.SetTrigger("Pular");
        }

    }

    public void Correr(InputAction.CallbackContext valor) {
        if (valor.performed) {
            velocidade = 3f;
        } else if (valor.canceled) {
            velocidade = 2.5f;
        }
    }

    // Movimenta o personagem de forma física, aplicando força com o Rigidbody
    private void FixedUpdate() {
        Vector3 direcao = new Vector3(movimento.x, 0, movimento.y);
        if (direcao != Vector3.zero)
            transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(direcao), Time.deltaTime * 10);

        rb.MovePosition(rb.position + direcao.normalized * velocidade * Time.fixedDeltaTime);

        // Suaviza a transição das animações
        float smoothX = Mathf.Lerp(animator.GetFloat(inputXHash), movimento.x * (velocidade / 2.5f), Time.fixedDeltaTime * 10f);
        float smoothY = Mathf.Lerp(animator.GetFloat(inputYHash), movimento.y * (velocidade / 2.5f), Time.fixedDeltaTime * 10f);

        // Define os valores suavizados para o Animator
        animator.SetFloat(inputXHash, smoothX);
        animator.SetFloat(inputYHash, smoothY);

        noChao = Physics.CheckSphere(pePersonagem.position, 0.3f, layerColisao);
        animator.SetBool("NoChao", noChao);
    }

    public void OnFootstep() {
        // Aqui você pode colocar o som de passos ou outros efeitos
    }
}
2 curtidas

Acho que o problema é na linha: “rb.MovePosition(rb.position + direcao.normalized * velocidade * Time.fixedDeltaTime);”

Eu lembro de ter alguma aula que fala sobre o normalized, não lembro qual, sei que ele ajuda a manter o movimento uniforme nas diagonais, mas pode deixar o movimento mais lento.

    if (direcao.magnitude > 1) 
   {
        direcao.Normalize();
    }

   rb.MovePosition(rb.position + direcao * 
    velocidade * Time.fixedDeltaTime);

Acho que isso resolve o problema

1 curtida

Já tentei incluir esta lógica, mas segue igual infelizmente :confused:

2 curtidas