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.
Desafio
MédioO 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";
}
}
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
1Rigidbody
Gravidade e MassaEmpurrar com AddForcePular com um ImpulsoFixedUpdate para FísicaVelocidadeCorpos CinemáticosRevisão: Plataforma de Lançamento2Colisões
OnCollisionEnterO que eu acertei?Quebre no impactoNo chãoQuique e atritoFormas dos collidersRevisão: Parede destrutível5Projeto: Corrida das Moedas
A Bola RolanteMoedas para Coletar