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 37 de 71.

Um salto só deve começar a partir do chão. Em Pé no Chão, isso era determinado com base nas normais de contato, atualizadas continuamente pelas mensagens de colisão. Um raio responde à pergunta “estou em pé sobre alguma coisa?” no local, a qualquer momento: dispare-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 com 2 unidades de altura, então a 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 em repouso 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 detecta o chão em alguns quadros. Um comprimento muito maior causa o problema oposto: com 3, o jogador poderia saltar de novo estando 2 unidades acima 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 colisor do próprio jogador, que os raios ignoram, então ele nunca detecta o jogador. A tecla é lida em Update(), porque GetKeyDown é verdadeiro por apenas um quadro, e um impulso pontual pode ser adicionado ali mesmo, como em Salto com um Impulso.

challenge icon

Desafio

Médio

Faça o sapo pular somente do chão.

  1. Adicione bool IsGrounded(), que retorna Physics.Raycast(transform.position, Vector3.down, 0.85f): o raio do sapo, 0.75, mais 0.1.
  2. Em Update(), adicione && IsGrounded() ao if da tecla Space.

Pressione “Jogar” e aperte Space duas vezes: o sapo pula uma vez. Depois, clique em “Verificar”.

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);
        }
    }
}

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

Pratique por conta própria: Playground de Unity