Menu
CoddyTech

Camadas e LayerMask

Parte da seção Física e Jogabilidade do Journey de Unity da Coddy. Lição 38 de 71.

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ê nomeia as suas em Tags and Layers, começando pela User Layer 3. Uma LayerMask é um conjunto de camadas, com um bit por camada. Passe uma para um raycast após maxDistance, e o raio ignorará todos os colliders em camadas fora do conjunto.

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

[SerializeField] private LayerMask groundMask;

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

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

challenge icon

Desafio

Médio

Faça o raio do batedor olhar além da própria lanterna.

  1. Em LookAhead(), crie int mask = ~LayerMask.GetMask("Player");: todas as camadas, exceto Player, onde estão o batedor e a lanterna.
  2. Passe mask para o raycast, depois de range.

Pressione “Jogar” e vire o batedor com as setas: o Console mostra os nomes Rocha e Árvore. Depois, pressione “Verificar”.

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

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

Pratique por conta própria: Playground de Unity