출처 : http://tech031.blogspot.kr/2015/08/unity.html





레이캐스트 메서드를 사용할 때 특정 레이어를 인자값으로 넘겨서 그 레이어만 충돌체크 할 수 있다.
사용 예는 아래와 같다.

RaycastHit 충돌을 받아올 변수; 
Physics.Raycast (Vector3 레이의 시작점 백터, Vector3 레이의 방향백터, RaycastHit 충돌을 받아올 변수, float 탐지거리, int 레이어마스크); 

레이어마스크는 비트 값을 이용하므로 정수 1에 쉬프트연산자를 사용해서
원하는 레이어의 비트 값을 얻어낼 수 있다.
예를 들어 레이어이름이 Stuck이라는 레이어의 비트마스크를 얻으려면

int layerMask = 1<<LayerMask.NameToLayer("Stuck");  

문제는 복수의 레이어를 상대로 레이캐스팅을 해야할 때 인자값으로 넘겨줄 레이어마스크 값은 하나만 지정해줄 수 있는 것이 문제. 
이 때는 OR연산자( | )를 이용해서 복수의 레이어를 하나의 비트마스크 값으로 만들어낼 수 있다. 
아래의 예는 1번 레이어와 2번 레이어의 정보를 담는 레이어마스크 값을 만들어낸다.

int layermask = (1<<LayerMask.NameToLayer(“1번 레이어이름”) | (1<<LayerMask.NameToLayer(“5번 레이어이름”); 


다른 경우로 전체 레이어중에서 특정 레이어만 제외하고자 하는 값을 만들어내고자 한다면 아래와 같이 해주면 된다.
아래의 예는 전체 레이어마스크에서 10번 레이어와 11번 레이어를  제외하는 정보를 담는 값을 만들어낸다.
두 코드는 같은 결과를 보여준다.

방법 1
int layerMask = (-1) - ((1 << LayerMask.NameToLayer("10번레이어이름")) | (1 << LayerMask.NameToLayer("11번레이어이름"))); 

방법 2
int layerMask = (1 << LayerMask.NameToLayer("10번레이어이름")) | (1 << LayerMask.NameToLayer("11번레이어이름"));
layerMask = ~layerMask // 비트연산자(Not) 

이렇게 만들어진 값을 레이캐스트 메서드의 인자 값으로 넘겨주면 해당 레이어의 오브젝트만 충돌검사를 수행한다.




'Unity > 스크립트' 카테고리의 다른 글

직렬화의 이해  (0) 2016.03.24
Reactive Extension  (0) 2015.12.11
Swipe 판별  (0) 2015.07.20
Android 국가코드 정보  (0) 2015.06.07
에셋 Android Native Plugins에 대해  (0) 2015.03.02

WRITTEN BY
빨강꼬마

,