[Unity] 레이캐스트(Raycast)

jh Seo·2022년 7월 12일
0

유니티

목록 보기
3/42

Raycast란 오브젝트에서 광선을 쏘는 걸 말하고,
레이캐스트를 사용한다면 광선에 맞는 collider에 대한
거리,위치 등의 정보를 RaycastHit으로 return한다.

레이캐스트는 충돌한 collider을 반환하므로
오브젝트에 collider가 없다면 레이캐스트는 감지할 수 없다.

다양한 레이캐스트 함수들

Physics.Raycast(Vector3 origin, Vector3 direction, out RaycastHit hitInfo)

origin 벡터에서 direction 벡터 방향으로 레이를 써서,
Raycast에 정보를 넘겨준다.
collider 충돌시 return true

Physics.Raycast(Vector3 origin, Vector3 direction, out RaycastHit hitInfo, float maxDistance)

마찬가지로 origin 벡터에서 시작해 direction벡터 방향으로 레이를 쏴서 Raycast에 정보를 넘겨주지만, maxDistance 거리만큼 광선을 쏜다.
collider 충돌시 return true

Physics.Raycast(Vector3 origin, Vector3 direction, out RaycastHit hitInfo, float maxDistance, int layerMask)

위 함수와 다 같지만 layerMask를 인자로 받아서
해당 layer만 감지하고 나머지 layer은 통과하는 레이를 쏜다.
해당 layer 가진 collider 충돌시 return true

Physics.Raycast(Ray ray, out RaycastHit hitInfo, float maxDistance)

시작 위치 벡터와 방향 벡터를 가진 클래스 Ray를 인자로 받아, maxDistance만큼 레이를 쏘고, 해당 collider 정보 RaycastHit에 넣어준다.
collider 충돌시 return true;

Ray 사용 예제

using UnityEngine;

public class ExampleClass : MonoBehaviour
{
    
    void FixedUpdate()
    {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;

        if (Physics.Raycast(ray, out hit, 100))
            Debug.DrawLine(ray.origin, hit.point);
    }
}

마우스 클릭시 스크린에서 월드 공간으로 레이를 쏘는 예제다.

origin벡터와 direction벡터는 ray.origin, ray.direction으로
대체된다.

layerMask 설정

//특정 레이어 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);

//아니면 
layerMask.GetMask(string layerName); //을 raycast인자로 넣어줘도 된다.
 

출처

profile
코딩 창고!

0개의 댓글