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
}
}