Menu
CoddyTech

Camadas e LayerMask

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

Cada GameObject fica em uma camada, escolhida no menu Layer na parte superior do Inspector. O Unity tem 32: algumas vêm integradas (0 Default, 2 Ignore Raycast, 4 Water, 5 UI), e você dá nomes às suas em Tags and Layers, começando pela User Layer 3. Uma LayerMask é um conjunto de camadas, um bit por camada. Passe uma para um raycast depois de maxDistance, e o raio ignora todos os colliders em camadas fora do conjunto.

Este jogador deve pular do chão, não da cabeça dos inimigos. Os pisos ficam em uma camada Ground, e o script recebe um campo LayerMask, que o Inspector mostra como um menu no qual você marca Ground:

[SerializeField] private LayerMask groundMask;

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

Uma máscara que inclui apenas Ground também impede que a verificação encontre o jogador. Um raio ignora o collider em que começa, mas não os outros colliders do jogador, como o de um filho; e os testes de sobreposição de uma lição posterior encontram o próprio collider do jogador, então uma verificação nos pés sem máscara sempre diria que ele está no chão. Coloque o jogador e seus filhos em uma camada Player e exclua Player das máscaras usadas pelas verificações. No código, LayerMask.GetMask("Ground", "Platform") cria uma máscara a partir de nomes de camadas, e ~ antes de uma máscara a inverte para incluir todas as camadas que ela não continha.

challenge icon

Desafio

Médio

O batedor deve informar o que está à frente, mas LookAhead() sempre retorna Lantern. Seu raio ignora o corpo do Scout, dentro do qual começa, e então atinge a lanterna que o Scout segura à frente. O Scout e sua Lantern estão na camada Player. Corrija LookAhead() em Spotter:

  • Crie no código uma máscara de todas as camadas, exceto Player, com LayerMask.GetMask.
  • Passe-a para o raycast, que mantém seu range, para que o raio atravesse a lanterna e informe a primeira coisa além dela.

Pressione Play e vire o batedor usando as setas: o Console registra o que ele vê. Depois, Check.

Experimente você mesmo

using UnityEngine;

public class Spotter : MonoBehaviour
{
    public float range = 10f;
    private string last = "";

    void Update()
    {
        string seen = LookAhead();
        if (seen != last)
        {
            Debug.Log("Ahead: " + seen);
            last = seen;
        }
    }

    // O nome da primeira coisa à frente dentro do alcance, ou "nothing".
    public string LookAhead()
    {
        if (Physics.Raycast(transform.position, transform.forward, out RaycastHit hit, range))
        {
            return hit.collider.name;
        }
        return "nothing";
    }
}
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