Buenas, estoy haciendo unas pruebas para un control de personaje que use únicamente el Character Controller y donde implemente yo sus físicas. Ahora mismo estoy implementando el salto y tengo un problema que seguro que es una tontearía pero no doy encontrado la solucion.
Es un juego VR y estoy usando el XR Interaction Toolkit de Unity asi que cuando se llama a la accion Jump hago lo siguiente:
private void OnJump(InputAction.CallbackContext obj)
{
//Find a way to keep momentum
if (!character.isGrounded) return;
horizontalVelocity = character.velocity;
_directionY = 1.0f * jumpSpeed;
_directionX = horizontalVelocity.x;
_directionZ = horizontalVelocity.z;
isJumping = true;
}
Y luego en el FixedUpdate añado el X y Z del vector velocity almacenado a la dirección del movimiento:
void FixedUpdate()
{
//Update collider position to player
CapsuleFollowPlayer();
if (character.isGrounded)
{
_continuousMovement.enabled = true;
_directionX = 0;
_directionZ = 0;
isJumping = false;
}
else
{
_continuousMovement.enabled = false;
if (isJumping)
{
_direction.x = _directionX;
_direction.z = _directionZ;
}
}
_directionY -= gravity * Time.deltaTime;
_direction.y = _directionY;
character.Move(_direction * Time.deltaTime);
}
El problema que tengo el que character.isGrounded devuelve true en el mismo frame que cargo la inercia y la setea a 0. Seguro que hay una forma mucho mejor de hacer esto de lo que estoy intentando y alguien con mas experiencia me puede arrojar luz.
Otra cosa que pense es anadir un CoyoteTime y saltarme un par de frames antes, pero no me convence la idea.