레이어와 LayerMask
Coddy Unity 여정의 물리와 게임플레이 섹션에 포함된 레슨. 71개 중 38번째.
모든 GameObject는 Inspector 상단의 Layer 메뉴에서 선택한 하나의 레이어에 속합니다. Unity에는 32개의 레이어가 있습니다. 몇몇 레이어는 기본 제공됩니다(0 Default, 2 Ignore Raycast, 4 Water, 5 UI). Tags and Layers에서 User Layer 3부터 직접 레이어 이름을 지정할 수 있습니다. LayerMask는 레이어 집합이며, 레이어마다 비트 하나를 사용합니다. maxDistance 뒤에 레이캐스트에 하나를 전달하면, 레이는 집합에 포함되지 않은 레이어의 모든 콜라이더를 무시합니다.
이 플레이어는 적의 머리가 아니라 땅에서 점프해야 합니다. 바닥은 Ground 레이어에 두고, 스크립트에 LayerMask 필드를 추가합니다. 그러면 Inspector에 Ground를 선택할 수 있는 메뉴가 표시됩니다.
[SerializeField] private LayerMask groundMask;
bool IsGrounded()
{
return Physics.Raycast(transform.position, Vector3.down, 1.1f, groundMask);
}Ground만 포함하는 마스크를 사용하면 검사 대상에 플레이어가 포함되는 것도 방지할 수 있습니다. 레이는 시작 지점이 내부에 있는 콜라이더는 건너뛰지만, 자식 오브젝트의 콜라이더처럼 플레이어의 다른 콜라이더는 건너뛰지 않습니다. 또한 뒤의 수업에서 다룰 겹침 검사에서는 플레이어 자신의 콜라이더를 찾아내므로, 마스크 없이 발밑을 검사하면 항상 땅에 닿아 있다고 판단합니다. 플레이어와 자식 오브젝트를 Player 레이어에 두고, 검사에 사용하는 마스크에서는 Player를 제외하세요. 코드에서 LayerMask.GetMask("Ground", "Platform")는 레이어 이름으로 마스크를 만들고, 마스크 앞에 ~를 붙이면 그 마스크에 포함되지 않은 모든 레이어를 포함하도록 반전합니다.
챌린지
중급정찰자의 광선이 자신의 랜턴 너머를 보도록 만드세요.
LookAhead()에서int mask = ~LayerMask.GetMask("Player");를 만드세요. 정찰자와 랜턴이 있는 Player 레이어를 제외한 모든 레이어입니다.range뒤에mask를 레이캐스트에 전달하세요.
‘플레이’를 누르고 화살표 키로 정찰자를 돌리세요. 콘솔에 Rock과 Tree가 표시됩니다. 그런 다음 ‘확인’을 누르세요.
직접 해보기
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;
}
}
// 앞쪽의 range 내에서 처음으로 감지된 물체의 이름 또는 "nothing".
public string LookAhead()
{
if (Physics.Raycast(transform.position, transform.forward, out RaycastHit hit, range))
{
return hit.collider.name;
}
return "nothing";
}
}
물리와 게임플레이의 모든 레슨
직접 연습해 보세요: Unity 플레이그라운드