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.
Desafio
MédioFaça o raio do batedor olhar além da própria lanterna.
- Em
LookAhead(), crieint mask = ~LayerMask.GetMask("Player");: todas as camadas, exceto Player, onde estão o batedor e a lanterna. - Passe
maskpara o raycast, depois derange.
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
1Rigidbody
Gravidade e MassaEmpurrar com AddForcePular com um ImpulsoFixedUpdate para FísicaVelocidadeCorpos CinemáticosRevisão: Plataforma de Lançamento4Corrotinas
InvocarInvocar repetidamente, Cancelar invocaçãoSua primeira corrotinaLoops em corrotinasInterrompendo corrotinasRevisão: contagem regressiva10Projeto: Fuga da Arena
A ArenaCaçadores2Colisõ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 ColetarPratique por conta própria: Playground de Unity