Menu
CoddyTech

Verificação do chão com um raio

Parte da seção Física e jogabilidade do Journey de Unity da Coddy. Lição 35 de 63.

Um salto deve começar apenas do chão. Standing on the Ground descobriu isso a partir das normais de contato, mantidas atualizadas por mensagens de colisão. Um raio responde “estou em pé sobre alguma coisa?” no próprio local, a qualquer momento: lance-o diretamente para baixo a partir do centro, com um comprimento um pouco maior que a distância do centro até a parte inferior. Este jogador é uma cápsula de 2 unidades de altura, então sua parte inferior fica 1 unidade abaixo do centro, e o raio tem comprimento 1.1:

public float jumpForce = 5f;
private Rigidbody rb;

void Start()
{
    rb = GetComponent<Rigidbody>();
}

void Update()
{
    if (Input.GetKeyDown(KeyCode.Space) && IsGrounded())
    {
        rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
    }
}

bool IsGrounded()
{
    return Physics.Raycast(transform.position, Vector3.down, 1.1f);
}

Os 0.1 extras são uma margem. Um corpo apoiado no chão pode ficar um pouquinho acima dele ou afundar um pouquinho nele, então um raio com exatamente 1 de comprimento não acerta em alguns quadros. Um comprimento muito maior causa o problema oposto: com 3, o jogador poderia saltar novamente a 2 unidades do chão, e, sem comprimento algum, o raio sempre encontra o chão, então cada pressionamento resulta em um salto.

O raio começa dentro do próprio colisor do jogador, que os raios ignoram, então ele nunca retorna o jogador. A tecla é lida em Update(), porque GetKeyDown é verdadeiro por apenas um quadro, e um impulso único pode ser aplicado ali mesmo, como em Jump with an Impulse.

challenge icon

Desafio

Médio

O sapo pula sempre que a tecla Espaço é pressionada, mesmo no ar, então pode subir até o céu. Corrija Hopper para que ele pule apenas do chão:

  • Adicione um método bool IsGrounded() que lance um raio diretamente para baixo a partir do centro do sapo. O sapo é uma esfera escalada para 1.5, então seu raio é 0.75: faça o raio alcançar 0.1 além da parte inferior.
  • Pule apenas quando a tecla Espaço for pressionada e IsGrounded() for verdadeiro.

Pressione Play e tente pular duas vezes, depois Check.

Experimente você mesmo

using UnityEngine;

public class Hopper : MonoBehaviour
{
    public float jumpForce = 6f;
    private Rigidbody rb;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
        }
    }
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Física e jogabilidade