Raycase를 사용할 때는 ray를 밖에서 선언하고 사용하는 방법과 별도로 선언하고 넘기는 방법이 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
public void Update()
{
float l_rayDistance = 2f;
// ray를 밖에서 선언하는 방법
Ray ray = new Ray(transform.position, transform.forward);
if (Physics.Raycast(ray, out RaycastHit hit, l_rayDistance))
{
}
// ray를 별도로 선언하지 않고 넘기는 방법
if (Physics.Raycast(transform.position, transform.forward, out RaycastHit l_hit, l_rayDistance))
{
}
}
|
스크린의 위치로 레이를 발사하는 방법도 있으니 참고.
1
2
|
// 마우스 위치를 ray로 변환한다.
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
|
Ray를 외부로 쓰면 Debug.DrawRay를 쓸 때 ray 값을 가져올 수 있어서 편하다.
1
2
3
4
5
6
7
8
9
10
11
|
public void Update()
{
// ray를 밖에서 선언하는 방법
Ray ray = new Ray(transform.position, transform.forward);
Debug.DrawRay(ray.origin, ray.direction * l_rayDistance, Color.red, 5f); // 디버그 레이
if (Physics.Raycast(ray, out RaycastHit hit, l_rayDistance))
{
}
}
|
#. 레이캐스트 마스크 예제.
레이어 마스크의 경우 int 형식으로 선언되어있지만 비트 연산을 통한 레이어 마스크를 정의한다.
따라서 두개 이상의 레이어를 검출하고 싶다면
+가 아니라 | 를 써줘야한다. (논리적 OR을 뜻하는 || 가 아니라 비트연산에서 OR을 뜻하는 | 이다)
LayerMask는 int 값으로 선언해야 한다! 주의할 것!
LayerMask 라는 structure가 존재하는데다가 아래의 코드에서 int를 LayerMask로 써도 오류가 출력되지 않으니 주의.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
public void Update()
{
float l_rayDistance = 2f;
// ray를 밖에서 선언하는 방법
Ray ray = new Ray(transform.position, transform.forward);
// Wall 레이어와 PlayerWall 레이어만을 검출한다.
int layerMask = 1 << LayerMask.NameToLayer("Wall") | 1 << LayerMask.NameToLayer("PlayerWall");
Debug.DrawRay(ray.origin, ray.direction * l_rayDistance, Color.red, 5f); // 디버그 레이
if (Physics.Raycast(ray, out RaycastHit hit, l_rayDistance, layerMask))
{
}
}
|
public void Update()
{
float l_rayDistance = 2f;
// ray를 밖에서 선언하는 방법
Ray ray = new Ray(transform.position, transform.forward);
// Wall 레이어와 PlayerWall 레이어만을 검출한다.
int layerMask = 1 << LayerMask.NameToLayer("Wall") | 1 << LayerMask.NameToLayer("PlayerWall");
Debug.DrawRay(ray.origin, ray.direction * l_rayDistance, Color.red, 5f); // 디버그 레이
if (Physics.Raycast(ray, out RaycastHit hit, l_rayDistance, layerMask))
{
}
}
만약 제외하고싶은거라면
~layermask 를 써주면된다. (비트연산 NOT)
layerMask = ~layerMask ;
전체중에 두개를 제외하고 싶다면 | 연산으로 비트OR을 구한다음에 layerMask = ~layerMask ; 를 사용하면된다.
'🌍 Unity > 물리' 카테고리의 다른 글
Physics.OverlapBox (0) | 2020.01.23 |
---|---|
유니티 스폰 시 OnTriggerEnter ( Unity spawn OnTriggerEnter ) 문제 (0) | 2019.09.05 |
Canvas WorldToScreenPoint 스크립트 (0) | 2018.11.04 |