bdfgdfg
Raycasting / LayerMask 본문
Raycasting
물리적인 광선을 쏘아내 충돌을 할 수 있게한다.
Physics라는 물리클래스안에 Raycast가 존재하고.
이것은 레이캐스트를 어느 시작점이 주어지면 그 시작점을 기준으로 내가 원하는 값을 넣어 그 방향을 향해 레이를 쏠 수 있다.
매우 많은 인자를 받을 수 있지만, 그 중 매우 간단한 인자버전.
위에서 말한 시작점과 방향값을 넣어줄 수 있다.
그리고. 이렇게 레이를 쏠 때, 어느 물체와 충돌했는지 안했는지를 판별할 수 있게 bool값을 리턴한다.
물론 레이를 맞은 대상의 정보를 가져올 수도 있다.
참고로 out은 c#에서 내가 넘긴 인자에 결과값을 저장한다는 의미.
저 RaycastHit에 인자를 넘겨주기 위해. RaycastHit 변수를 만들고 넘겨준다.
void Update()
{
// 눈에 보이는 Ray를 그려주기 위함.
Debug.DrawRay(this.transform.position + Vector3.up, this.transform.forward * 10,Color.red);
RaycastHit hit;
if(Physics.Raycast(this.transform.position + Vector3.up, this.transform.forward, out hit, 10))
{
Debug.Log($"RayCast! {hit.transform.gameObject.name}");
}
}
이렇게하면 밑의 사진과 같이 Ray를 쏘게된다.
콘솔을 확인해보면.
이렇게. 충돌한 대상을 확인할 수 있다.
다만 일반적인 Ray는 길이가 얼마나 됐건, 많은 오브젝트들과 레이와 충돌을 하더라도. 맨 처음 충돌한 대상의 정보만 가져온다.
이 때 사용하는게 RaycastAll
반환값이. Ray에 맞은 녀석들의 집합(배열)을 반환한다.
void Update()
{
Debug.DrawRay(this.transform.position + Vector3.up, this.transform.forward * 10,Color.red);
RaycastHit[] hits;
hits = Physics.RaycastAll(this.transform.position + Vector3.up, this.transform.forward, 10);
foreach (RaycastHit hit in hits)
{
Debug.Log($"Raycast! {hit.transform.gameObject.name}");
}
}
결과를 보면
레이를맞은 모든 오브젝트를 출력.
LayerMask
Physics내부의 Raycast 함수의 인자를 보면 layerMask라는 int형 변수를 건낼 수 있다.
이 layerMask는 비트플래그 방식을 이용한다.
layerMask를 사용하기 위해. 게임오브젝트의 Layer에 우리가 원하는 Layer값을 넣어주면 되는데.
Add Layer를 누르고
유저 레이어부터 (8) 우리가 원하는 것을 넣어 줄 수있다.
Monster라고하고 넣은 뒤.
여기서 말하는 8. (참고로 Layer는 0부터 31까지 있는데. 4바이트 크기로 비트플래그가 가능)
8은 8번째 비트를 대상으로 Monster라는 이름을 부여한다고 생각.
즉 Raycast의 인자로. 8번째 비트만 켜진 int형 값을 건네면 우리는 Monster라고 지정한 Layer를 대상으로만 Ray연산을 진행한다는 뜻.
(비트 플래그를 이용한 방식)
int monsterMask = (1 << 8);
RaycastHit hit;
if (Physics.Raycast(this.transform.position + Vector3.up, Vector3.forward,out hit, 10.0f, monsterMask))
{
Debug.Log($"Ray only Monster hit! {hit.transform.gameObject.name}");
}
'게임프로그래밍 > Unity' 카테고리의 다른 글
데이터 관리(Json) (0) | 2021.08.08 |
---|---|
Coroutine(코루틴) (0) | 2021.08.08 |
Animation State패턴 (0) | 2021.08.06 |
투영 (0) | 2021.08.05 |
Input Manager / Resource Manager (0) | 2021.08.05 |