Primero que nada, para quien no lo sepa, el CharacterControler cuenta con una función llamada "isGrounded", la cual devuelve un "True" si el CharacterControler toca el piso, y "False" sino.
Pues simplemente no me funciona, para no hacer el cuento largo, si CharacterControler esta tocando el piso, "IsGrounded" devuelve trues y false aleatoriamente, en cambio, si no esta tocando el piso, si devuelve únicamente "false".
Mi Script de Movimiento es el siguiente;
//Rotacion
transform.Rotate(0, Input.GetAxis("Mouse X") * rotateSpeed * Time.deltaTime, 0);
//Obtiene los valores de entrada
motion = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
if (controller.isGrounded)
{
//Calcula el Movimiento
motion = transform.TransformDirection(motion);
motion *= speed;
//Corre
if (Input.GetKey(KeyCode.AltGr))
{
if (DataUsuario.GetEstadoAnimación().Contains("Rápido"))
motion *= 2.0f;
segundos = 0;
}
//Salta
if (Input.GetButton("Jump"))
{
motion.y = jumpForce;
}
}else{
//Gravedad
motion.y -= gravity * Time.deltaTime * 2;
}
//Se mueve
controller.Move(motion * Time.deltaTime);
Y funciona bien, pero necesito que el "IsGrounded" funcione bien, para que mi Script de Animacion funcione correctamente. Alguien sabe que puede provocar el fallo?
@Centauro5legs Hola, cómo estás?
Usa tu variable gravity en el eje Y de motion:
float gravity = 0.0f;
motion = new Vector3(Input.GetAxis("Horizontal"), gravity, Input.GetAxis("Vertical"));
También usa la misma variable gravity en el código del salto...
(En lugar de
motion.y) :
if (controller.isGrounded)
{
if (Input.GetButton("Jump"))
{
gravity = jumpForce;
}
}
else
{
gravity += Physics.gravity.y * Time.deltaTime * 2;
}
A ver si así no tienes el mismo problema.
Suerteee.
Ya lo corregir, la solución queda de este modo;
//Rotacion
transform.Rotate(0, Input.GetAxis("Mouse X") * rotateSpeed * Time.deltaTime, 0);
//Obtiene los valores de entrada
motion = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
if (controller.isGrounded)
{
//Calcula el Movimiento
motion = transform.TransformDirection(motion);
motion *= speed;
//Corre
if (Input.GetKey(KeyCode.AltGr))
{
if (DataUsuario.GetEstadoAnimación().Contains("Rápido"))
motion *= 2.0f;
segundos = 0;
}
//Salta
if (Input.GetButton("Jump"))
{
motion.y = jumpForce;
}
}
//Gravedad
motion.y -= gravity * Time.deltaTime * 2;
//Se mueve
controller.Move(motion * Time.deltaTime);
Si no notan la diferencia, al final quite el ultimo "else". El problema era que como la "Gravedad" no se activaba por completo al aterrizar, no acababa de "aterrizar" correctamente.
lo primero que deberías hacer cuando te pasen estas cosas es averiguar si el fallo esta realmente en el script, como dice lightbug llénalo de Debug.Log("falloRandom");