Tutorial de salto de parede 3D e 2D do jogador para Unity

Wall jumping, uma mecânica predominante em plataformas e jogos de ação, permite aos jogadores pular paredes, adicionando complexidade e versatilidade à navegação. Este tutorial tem como objetivo integrar o salto na parede ao controlador FPS fornecido. Ao final, o personagem do jogador será capaz de executar saltos na parede em configurações 2D e 3D.

Implementando Wall Jump para 3D usando o script 'SC_FPSController'

Começando com o código base fornecido no tutorial Unity FPS Controller, apresentaremos a mecânica de salto na parede.

Etapa 1: configurar a detecção de parede

  • Adicione uma nova camada em Unity chamada "Wall" para objetos que podem ser saltados na parede.
  • Atualize a classe 'SC_FPSController', que você pode obter em nosso tutorial Unity FPS Controller, com as seguintes variáveis:
public LayerMask wallLayer;
public float wallJumpForce = 10f;
private bool isTouchingWall = false;

Passo 2: Detectando a Parede

  • Incorpore a seguinte lógica dentro do método 'Update()' para detectar uma parede:
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 no código acima detectará paredes à esquerda e à direita do jogador.

Etapa 3: Implementando o Wall Jump para 3D

  • Dentro do método 'Update()', após a lógica do salto no solo, insira:
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;
    }
}

Essa lógica no código acima verifica se o jogador está pressionando o botão de pular, se pode se mover e se está tocando uma parede. Se assim for, transmite uma força vertical e uma ligeira força horizontal afastada da parede.

Implementando Wall Jump para 2D usando o script 'CharacterController2D'

Começando com o código base fornecido no tutorial 2D Character Controller for Unity, apresentaremos a mecânica wall jump.

Etapa 1: configurar a detecção de parede

  • Adicione uma nova camada em Unity chamada "Wall" para objetos que podem ser saltados na parede.
  • Atualize a classe 'CharacterController2D', que você pode obter em nosso tutorial 2D Character Controller para Unity, com as seguintes variáveis:
public LayerMask wallLayer;
public float wallJumpForce = 10f;
private bool isTouchingWall = false;

Passo 2: Detectando a Parede em 2D

  • Incorpore a seguinte lógica dentro do método 'Update()' para detectar uma parede:
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;
}

Etapa 3: Implementando o Wall Jump para 2D

  • Dentro do método 'Update()', após a lógica do salto no solo, insira:
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
    }
}

Perguntas abordadas:

  1. Como um personagem pode detectar uma parede em Unity?: Um personagem pode detectar paredes usando raycasting. Ao disparar um raio invisível do jogador na direção desejada, pode-se determinar se um objeto, como uma parede, cruza esse raio.
  2. Qual é a diferença entre a implementação de salto de parede 2D e 3D em Unity?: Em Unity, a física 2D usa métodos 'Physics2D' (como 'Physics2D.Raycast()'), enquanto a física 3D usa métodos 'Physics' (como 'Physics.Raycast()'). A lógica permanece relativamente semelhante, mas os métodos e direções (Vetor2 para 2D, Vetor3 para 3D) variam.

Conclusão

Esta adição permite que o personagem no espaço 2D pule das paredes. A experimentação com os valores de força pode ser necessária para garantir uma jogabilidade suave. Ao integrar essas etapas, os jogadores descobrirão que o movimento do personagem 2D é mais versátil e dinâmico em ambientes com paredes.