본문 바로가기
Unity 3D

Unity C# 문법 (9) RaycastHit, Raycast

by 연꿈술사 2023. 8. 13.

안녕하세요 연꿈술사입니다. 오늘은 Unity에서 Raycast 함수를 통해 광선을 발사하여 물체와 충돌 시 반환하는 정보를 담고있는 구조체인 RaycastHit에 대해 알아보겠습니다.

광선이 어떤 물체와 충돌 시에 그 충돌에 대해 정보를 얻고싶을 때, RaycastHit 변수를 사용해 해당 정보를 얻을 수 있습니다.

 

RaycastHit에 포함된 주요 속성들에 대해 알아보겠습니다.

1. collider : 충돌한 오브젝트의 Collider 컴포넌트 값을 반환합니다.

2. point :  광선이 Collider와 처음으로 충돌한 지점의 좌표를 반환합니다.

3. normal : 충돌 지점에서의 표면의 외부를 향하는 법선 벡터를 반환합니다. 이는 충돌 표현의 방향을 나타냅니다.

4. distance : 광선의 시작점에서 충돌 지점까지의 거리를 반환합니다.

5. transform : 충돌한 오브젝트의 Transform 컴포넌트를 반환합니다.

이외에도 Rigidbody, textureCoord등 다양한 정보와 속성들이 있습니다.

 

간단한 예를 들어 플레이어의 위치에서 앞쪽으로 광선을 발사했을 시에 물체와의 충돌 정보를 얻는 코드를 작성해보겠습니다.

Ray ray = new Ray(transform.position, transform.forward);
    RaycastHit hit;

if (Physics.Raycast(ray, out hit))
{
    Debug.Log("Hit object: " + hit.collider.name);
    Debug.Log("Hit point: " + hit.point);
    Debug.Log("Surface normal: " + hit.normal);
    Debug.Log("Distance to hit: " + hit.distance);
}

이 코드는 광선이 물체와 충돌 시, 충돌한 오브젝트 이름, 충돌 지점, 표면의 방향, 그리고 광선의 시작점과 충돌점과의 거리를 출력하게 됩니다.

 

그럼 이제 밑의 Physics.Raycast()에 대해 궁금해지셨을 겁니다. 이는 Unity에서 광선(ray)를 발사 시 물체를 감지하는 데 사용되는 함수인데요, 이 함수에는 여러 오버로드가 있고, 매개 변수들의 내용에 대해 설명해드리겠습니다.

매개변수는 순서대로 넣어주셔야 하니 주의하시기 바랍니다.

1. Vector3 origin : 광선이 시작되는 위치

2. Vector3 direction : 광선이 향하는 방향

3. out RaycastHit hitInfo : 광선이 어떤 물체와 충돌할 경우, 충돌 정보를 저장하는 변수.

여기까지는 필수로 작성해야 하는 매개변수이고, 선택적으로 작성하는 매개변수들에 대해 설명하겠습니다.

4. float maxDistance : 광선의 최대 발사거리. 기본값은 무한대입니다.

5. int layerMask : 광선이 검사할 레이어를 지정하는데 사용됩니다. 특정 레이어의 오브젝트만 감지하고 싶을 때 사용합니다.

6. QueryTriggerInteraction queryTriggerInteraction : 트리거 콜라이더가 광선에 의해 감지되는 방식을 지정합니다. UseGlobal(프로젝트 설정을 사용), Ignore(트리거 무시), Collide(트리거에 충돌) 중 하나를 선택할 수 있습니다.

 

이 Raycast 함수는 bool형 함수로, 광선이 물체와 충돌시 true값을 반환하고 hitInfo 변수에 해당 충돌 정보를 저장합니다.

충돌하지 않았을 경우에 false를 반환합니다.

밑은 예시입니다.

 RaycastHit hit;
if (Physics.Raycast(transform.position, transform.forward, out hit, 10f))
{
    Debug.Log("Hit object: " + hit.collider.name);
}

예시는 현재 오브젝트의 위치에서 앞쪽으로 10유닛 거리까지 광선을 발사하고, 어떤 물체와 충돌했는지 확인하는 코드입니다.

 

오늘은 RaycastHit를 어떻게 사용하는지, 언제 사용하는 지에 대해 알아보았습니다.

저는 다른 정보글도 또 찾아오겠습니다. 연꿈술사였습니다. 감사합니다.

댓글