es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Controlador de jugador en Unity 3D no salta correctamente.

Estoy haciendo un juego en 3D con un mecanismo de cambio de gravedad. Tengo al jugador caminando por el mapa y funciona en todos los ángulos, sin embargo, el salto es un desorden. Me preguntaba cómo podría hacer que el salto funcionara.

Actualmente, el salto simplemente agrega un valor al vector local hacia arriba. No tengo idea de cómo arreglarlo. Lo tenía funcionando en un momento, pero luego tuve que cambiar a movimiento físico en lugar de movimiento estático y ahora no funciona.

Aquí está el código:

void Update()
{
    //piénsalo mover
    isRunning = (Input.GetKey(KeyCode.LeftControl));
    isShifting = IntToBool((int)((BoolToInt(Input.GetKey(KeyCode.LeftAlt)))<em>BoolToInt(!isShiftable))+(BoolToInt(Input.GetKey(KeyCode.LeftShift))</em>BoolToInt(isShiftable)));

    Vector3 forward = transform.forward;//transform.TransformDirection(Vector3.forward);
    Vector3 right = transform.right;//transform.TransformDirection(Vector3.right);

    if (((isShifting && isRunning) || !(isShifting && isRunning)))
    {
        curSpeedX = walkingSpeed * Input.GetAxis("Vertical");
        curSpeedY = walkingSpeed * Input.GetAxis("Horizontal");
    }
    if (isShifting)
    {
        curSpeedX = ShiftSpeed * Input.GetAxis("Vertical");
        curSpeedY = ShiftSpeed * Input.GetAxis("Horizontal");
    }
    if (isRunning)
    {
        curSpeedX = runningSpeed * Input.GetAxis("Vertical");
        curSpeedY = runningSpeed * Input.GetAxis("Horizontal");
    }

    //salto
    if (!isGrounded)
    {
        ypoa -= gravity;
    }
    if (Input.GetKeyDown(KeyCode.Space))
    {
        ypoa = jumpheight;
    }

    //mover actualmente
    moveDir = (ypoa * transform.up) + (curSpeedX * transform.forward) + (curSpeedY * transform.right);
    rb.velocity = (moveDir * speed);

    moveDir = new Vector3(0, 0, 0);
}

void OnCollisionEnter()
{
    jumcount = 0;
    ypoa = 0;
    isGrounded = true;
}

void OnCollisionExit()
{
    isGrounded = false;
}

void OnCollisionStay()
{
    isGrounded = true;
}

Estoy usando Unity 2019.4.28f y trabajo en Windows 10.

Se agradece la ayuda.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para solucionar el salto en tu juego con el mecánico de cambio de gravedad, debes cambiar la implementación actual de agregar un valor al vector de arriba local para aplicar una fuerza de impulso al componente Rigidbody del jugador. Puedes hacer esto agregando el siguiente código al enunciado if que comprueba la entrada de la barra espaciadora:

    if (Input.GetKeyDown(KeyCode.Space) && isGrounded) {
        rb.AddForce(transform.up * jumpForce, ForceMode.Impulse);
        isGrounded = false;
    }
    

    Este código agregará una fuerza de impulso al componente Rigidbody del jugador en la dirección hacia arriba, lo que lo hará saltar. La variable isGrounded también se actualiza a false cuando el jugador salta, lo que evitará que salte de nuevo hasta que toque el suelo.

    También necesitarás ajustar la altura del salto ajustando el valor de jumpForce para adaptarlo a la mecánica de tu juego. Finalmente, asegúrate de actualizar apropiadamente la variable isGrounded en las devoluciones de llamada de colisión para asegurarte de que el jugador solo pueda saltar cuando está de pie sobre una superficie.

    ¡Espero que esto ayude!

Comments are closed.