Tutorial de salto de pared 3D y 2D de Player para Unity

Salto de paredes, una mecánica frecuente en plataformas y juegos de acción, permite a los jugadores saltar de las paredes, añadiendo complejidad y versatilidad a la navegación. Este tutorial tiene como objetivo integrar el salto de pared en el controlador FPS proporcionado. Al final, el personaje del jugador podrá ejecutar saltos de pared en configuraciones 2D y 3D.

Implementación de Wall Jump para 3D usando el script 'SC_FPSController'

Comenzando con el código base proporcionado del tutorial Unity FPS Controller, presentaremos la mecánica de salto de pared.

Paso 1: configurar la detección de paredes

  • Agregue una nueva capa en Unity llamada "Wall" para objetos desde los que se puede saltar desde la pared.
  • Actualice la clase 'SC_FPSController', que puede obtener de nuestro tutorial Unity FPS Controller, con las siguientes variables:
public LayerMask wallLayer;
public float wallJumpForce = 10f;
private bool isTouchingWall = false;

Paso 2: Detectar la pared

  • Incorpore la siguiente lógica dentro del método 'Update()' para detectar una pared:
RaycastHit hit;
if (Physics.Raycast(transform.position, transform.right, out hit, 1f, wallLayer) || Physics.Raycast(transform.position, -transform.right, out hit, 1f, wallLayer))
{
    isTouchingWall = true;
}
else
{
    isTouchingWall = false;
}

Este raycast en el código anterior detectará paredes a la izquierda y derecha del jugador.

Paso 3: Implementación del salto de pared para 3D

  • Dentro del método 'Update()', después de la lógica del salto al suelo, inserte:
else if (Input.GetButton("Jump") && canMove && isTouchingWall)
{
    moveDirection.y = wallJumpForce;

    // This adds a bit of horizontal force opposite the wall for a more dynamic jump
    if (Physics.Raycast(transform.position, transform.right, 1f, wallLayer))
    {
        moveDirection += -transform.right * wallJumpForce / 2.5f; // Adjust the divisor for stronger/weaker push.
    }
    else if (Physics.Raycast(transform.position, -transform.right, 1f, wallLayer))
    {
        moveDirection += transform.right * wallJumpForce / 2.5f;
    }
}

Esta lógica en el código anterior verifica si el jugador está presionando el botón de salto, puede moverse y si toca una pared. Si es así, imparte una fuerza vertical y una ligera fuerza horizontal alejándose de la pared.

Implementación de Wall Jump para 2D usando el script 'CharacterController2D'

Comenzando con el código base proporcionado del tutorial 2D Character Controller para Unity, presentaremos la mecánica wall jump.

Paso 1: configurar la detección de paredes

  • Agregue una nueva capa en Unity llamada "Wall" para objetos desde los que se puede saltar desde la pared.
  • Actualice la clase 'CharacterController2D', que puede obtener de nuestro tutorial 2D Character Controller para Unity, con las siguientes variables:
public LayerMask wallLayer;
public float wallJumpForce = 10f;
private bool isTouchingWall = false;

Paso 2: Detectar la pared en 2D

  • Incorpore la siguiente lógica dentro del método 'Update()' para detectar una pared:
RaycastHit2D wallHitLeft = Physics2D.Raycast(transform.position, Vector2.left, 1f, wallLayer);
RaycastHit2D wallHitRight = Physics2D.Raycast(transform.position, Vector2.right, 1f, wallLayer);

if (wallHitLeft.collider != null || wallHitRight.collider != null)
{
    isTouchingWall = true;
}
else
{
    isTouchingWall = false;
}

Paso 3: Implementación del salto de pared para 2D

  • Dentro del método 'Update()', después de la lógica del salto al suelo, inserte:
if (Input.GetKeyDown(KeyCode.W) && isTouchingWall && !isGrounded)
{
    r2d.velocity = new Vector2(r2d.velocity.x, jumpHeight);
    if (wallHitLeft.collider != null)
    {
        r2d.AddForce(new Vector2(wallJumpForce, 0)); // Push to the right when wall is on the left
    }
    else if (wallHitRight.collider != null)
    {
        r2d.AddForce(new Vector2(-wallJumpForce, 0)); // Push to the left when wall is on the right
    }
}

Preguntas abordadas:

  1. ¿Cómo puede un personaje detectar una pared en Unity? : Un personaje puede detectar paredes usando raycasting. Al disparar un rayo invisible del jugador en la dirección deseada, se puede determinar si un objeto, como una pared, se cruza con este rayo.
  2. ¿Cuál es la diferencia entre la implementación de salto de pared 2D y 3D en Unity?: En Unity, la física 2D usa métodos 'Physics2D' (como 'Physics2D.Raycast()'), mientras que la física 3D utiliza métodos 'Physics' (como 'Physics.Raycast()'). La lógica sigue siendo relativamente similar, pero los métodos y direcciones (Vector2 para 2D, Vector3 para 3D) varían.

Conclusión

Esta adición permite al personaje en el espacio 2D saltar de las paredes. Puede que sea necesario experimentar con los valores de fuerza para garantizar un juego fluido. Al integrar estos pasos, los jugadores encontrarán que el movimiento del personaje 2D es más versátil y dinámico en entornos con paredes.

Artículos sugeridos
Tutorial del controlador de jugador de arriba hacia abajo para Unity
Agregar soporte de doble salto a un controlador de personajes de plataformas 2D en Unity
Implementación del sistema Parkour en Unity
Tutorial de linterna para Unity
Tutorial del controlador de gusanos 3D para Unity
Controlador de jugador planetario basado en cuerpo rígido para Unity
Controlador de personajes 2D para Unity