Ejemplo de un controlador básico usando Input System + CharacterController.
using UnityEngine;
using UnityEngine.InputSystem;
public class PlayerMovement : MonoBehaviour
{
[Header("Referencias")]
[SerializeField]
private InputActionReference moveAction;
[SerializeField]
private InputActionReference jumpAction;
[SerializeField]
private Transform camara;
[Header("Movimiento")]
[SerializeField]
private float velocidad = 5f;
[SerializeField]
private float velocidadRotacion = 10f;
[Header("Salto")]
[SerializeField]
private float gravedad = -20f;
[SerializeField]
private float alturaSalto = 2f;
private CharacterController controller;
private float velocidadVertical;
void Awake()
{
controller = GetComponent<CharacterController>();
}
void Update()
{
Vector2 input =
moveAction.action.ReadValue<Vector2>();
Vector3 forward = camara.forward;
Vector3 right = camara.right;
forward.y = 0f;
right.y = 0f;
forward.Normalize();
right.Normalize();
Vector3 direccion =
forward * input.y +
right * input.x;
direccion = Vector3.ClampMagnitude(
direccion,
1f
);
if (direccion.sqrMagnitude > 0.001f)
{
Quaternion objetivo =
Quaternion.LookRotation(direccion);
transform.rotation =
Quaternion.Slerp(
transform.rotation,
objetivo,
velocidadRotacion *
Time.deltaTime
);
}
if (controller.isGrounded &&
velocidadVertical < 0f)
{
velocidadVertical = -2f;
}
if (controller.isGrounded &&
jumpAction.action.WasPressedThisFrame())
{
velocidadVertical = Mathf.Sqrt(
alturaSalto * -2f * gravedad
);
}
velocidadVertical +=
gravedad * Time.deltaTime;
Vector3 movimiento =
direccion * velocidad;
movimiento.y = velocidadVertical;
controller.Move(
movimiento * Time.deltaTime
);
}
}
isGrounded.Podés agregar: