반응형

Raycast 를 사용하여 타겟에게 ray 를 쏴서 처리하고 있을때 

자신과 타겟사이에 오브젝트가 끼어들면 ray를 쏘지 못하게 되죠.

당연한 말이지만, raycast 사용중 자신과 타겟사이에 오브젝트가 끼어들어도 계속 타겟에게 ray를 쏘고 싶을때가 있습니다.


이럴경우 layermask를 쓰면 아주 좋은데요 , 우선 Raycast 오버로딩된 함수에 layermask를 어덯게 넣고 쓰는지 알아 보겟습니다.


우선 아래 사진처럼 타겟대상(사진에선 Player) 에게 Layer 를 설정해주세요









이제 자신에 해당하는 스크립트에 raycast 사용시 아래와같이 layermask 변수를 넣어주세요 

1
2
3
4
 
//특정 Layer만 raycast하기
RaycastHit hit;
float distance = 10f;
int layerMask = 1 << LayerMask.NameToLayer("Player");  // Player 레이어만 충돌 체크함
Physics.Raycast (transform.position, transform.TransformDirection (Vector3.forward), out hit, distance ,layerMask);
cs


그러면 raycast시 타겟 사이에 다른 오브젝트가 껴도 타겟만 쏘게 됩니다.






아래에 layermask 다른 예시가 있습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
//특정 Layer만 raycast하기
int layerMask = 1 << LayerMask.NameToLayer("Player");  // Player 레이어만 충돌 체크함
Physics.Raycast (transform.position, transform.TransformDirection (Vector3.forward), hit, Mathf.Infinity, layerMask);
 
//두개 레이어 raycast하기
int layerMask = (1 << LayerMask.NameToLayer("Player")) + (1 << LayerMask.NameToLayer("MyTeammate"));    // Player 와 MyTeammate 레이어만 충돌체크함
Physics.Raycast (transform.position, transform.TransformDirection (Vector3.forward), hit, Mathf.Infinity, layerMask);
 
 
//특정 layer만 raycast제외하기 (1)
int layerMask = (-1- (1 << LayerMask.NameToLayer("Player"));  // Everything에서 Player 레이어만 제외하고 충돌 체크함
Physics.Raycast (transform.position, transform.TransformDirection (Vector3.forward), hit, Mathf.Infinity, layerMask);
 
 
//특정 layer만 raycast제외하기 (2)
int layerMask = (1 << LayerMask.NameToLayer("Player"));  // Everything에서 Player 레이어만 제외하고 충돌 체크함
layerMask  = ~layerMask ;
Physics.Raycast (transform.position, transform.TransformDirection (Vector3.forward), hit, Mathf.Infinity, layerMask);

//특정 2개이상 layer raycast 제외하기 
int layerMask = ((1 << LayerMask.NameToLayer("Player")) | (1 << LayerMask.NameToLayer("GUN")));  // Everything에서 Player,GUN 레이어만 제외하고 충돌 체크함
layerMask  = ~layerMask ;
Physics.Raycast (transform.position, transform.TransformDirection (Vector3.forward), hit, Mathf.Infinity, layerMask);
 
 
cs



이상입니다.

반응형

+ Recent posts