RayCast (레이캐스트)

  • Unity 에서 특정 경로에있는 객체를 감지하기 위해 사용되는 기술
  • Ray는 특정한 지점에서 시작하여 한 방향으로 무한히 연장되는 선
  • Raycasting은 발사체를 쏘거나 AI의 시야를 구현, 또는 개체와 상호작용하는 다양한 상황에 사용
  • Physisc.Raycast 메서드를 사용
using UnityEngine;

public class RaycastExample : MonoBehaviour
{
    public float rayDistance = 10f;
    public LayerMask hitLayers;

    void Update()
    {
        Ray ray = new Ray(transform.position, transform.forward);
        RaycastHit hitInfo;

        if (Physics.Raycast(ray, out hitInfo, rayDistance, hitLayers))
        {
            Debug.Log("객체를 맞췄습니다: " + hitInfo.collider.gameObject.name);
        }
    }
}

매개변수:

  • Ray ray: 쏠 레이, 원점과 방향을 포함합니다.
  • RaycastHit hitInfo: 레이가 맞은 것에 대한 정보입니다.
  • float maxDistance: 레이가 충돌을 확인할 최대 거리입니다.
  • LayerMask layerMask: 레이가 맞출 수 있는 객체를 필터링하는 비트마스크입니다.

선택적 매개변수:

Physics.Raycast 메서드의 여러 오버로드를 사용하면 트리거 콜라이더와 어떻게 상호 작용할지 지정하는 QueryTriggerInteraction과 같은 추가 정보를 제공할 수 있습니다.

용도:

  1. 객체 상호작용: 플레이어가 어떤 객체를 가리키고 있는지 확인합니다.
  2. AI 감지: 플레이어나 다른 객체가 AI의 시야 내에 있는지 감지합니다.
  3. 슈팅 메커니즘: 총알이나 다른 발사체를 시뮬레이션합니다.
  4. 지형 분석: 지형의 경사나 구조를 분석합니다.

DrawRay

  • Ray는 시각적으로 표시되지 않기 때문에 개발할 때는 DrawRay 함수를 이용 시각적으로 표시
public static void DrawRay(Vector3 start, Vector3 dir, Color color)  
{  
	bool depthTest = true;  
	float duration = 0.0f;  
	Debug.DrawRay(start, dir, color, duration, depthTest);  
}

Debug.DrawRay(firePos.position, firePos.forward * 10.0f, Color.green);

Raycast, RaycastHit

RaycastHit

  • Ray를 쏘아 어떠한 GameObject에 맞았을 때 맞은 GameObject의 정보를 반환받을 변수
    // Raycast 결괏값을 저장하지 위한 구조체 선언
    private RaycastHit _rayHit;_
    

    RaycastHit 구조체의 주요 속성

속성 설명
collider 맞은 GameObject의 Collider 반환
transform 맞은 GameObject의 Transform 반환
point 맞은 위치의 World Coordinate 반환 (Vector3 Type)
distance 발사 위치와 맞은 위치 사이의 거리
normal Ray가 맞은 표면의 법선 벡터

Raycast

  • 사용 가능한 RayCast 함수 16종
public static bool Raycast(  
Vector3 origin,  
Vector3 direction,  
[UnityEngine.Internal.DefaultValue("Mathf.Infinity")] float maxDistance,  
[UnityEngine.Internal.DefaultValue("DefaultRaycastLayers")] int layerMask,  
[UnityEngine.Internal.DefaultValue("QueryTriggerInteraction.UseGlobal")] QueryTriggerInteraction queryTriggerInteraction)  
{  
	return Physics.defaultPhysicsScene.Raycast(
	origin, direction, maxDistance, layerMask, queryTriggerInteraction);  
}  
  
[ExcludeFromDocs]  
public static bool Raycast(Vector3 origin, Vector3 direction, float maxDistance, int layerMask)  
{  
	return Physics.defaultPhysicsScene.Raycast(
			origin, direction, maxDistance, layerMask);  
}  
  
[ExcludeFromDocs]  
public static bool Raycast(Vector3 origin, Vector3 direction, float maxDistance) => Physics.defaultPhysicsScene.Raycast(origin, direction, maxDistance);  
  
[ExcludeFromDocs]  
public static bool Raycast(Vector3 origin, Vector3 direction) => Physics.defaultPhysicsScene.Raycast(origin, direction);  
  
public static bool Raycast(  
Vector3 origin,  
Vector3 direction,  
out RaycastHit hitInfo,  
float maxDistance,  
int layerMask,  
QueryTriggerInteraction queryTriggerInteraction)  
{  
	return Physics.defaultPhysicsScene.Raycast(origin, direction, 
			out hitInfo, maxDistance, layerMask, queryTriggerInteraction);  
}  
  
[ExcludeFromDocs]  
[RequiredByNativeCode]  
public static bool Raycast(  
Vector3 origin,  
Vector3 direction,  
out RaycastHit hitInfo,  
float maxDistance,  
int layerMask)  
{  
	return Physics.defaultPhysicsScene.Raycast(origin, direction, 
									out hitInfo, maxDistance, layerMask);  
}  
  
[ExcludeFromDocs]  
public static bool Raycast(  
Vector3 origin,  
Vector3 direction,  
out RaycastHit hitInfo,  
float maxDistance)  
{  
	return Physics.defaultPhysicsScene.Raycast(origin, direction, 
												out hitInfo, maxDistance);  
}  
  
[ExcludeFromDocs]  
public static bool Raycast(Vector3 origin, Vector3 direction, out RaycastHit hitInfo) => Physics.defaultPhysicsScene.Raycast(origin, direction, out hitInfo);  
public static bool Raycast(  
Ray ray,  
[UnityEngine.Internal.DefaultValue("Mathf.Infinity")] float maxDistance,  
[UnityEngine.Internal.DefaultValue("DefaultRaycastLayers")] int layerMask,  
[UnityEngine.Internal.DefaultValue("QueryTriggerInteraction.UseGlobal")] QueryTriggerInteraction queryTriggerInteraction)  
{  
return Physics.defaultPhysicsScene.Raycast(ray.origin, ray.direction, maxDistance, layerMask, queryTriggerInteraction);  
}  
  
[ExcludeFromDocs]  
public static bool Raycast(Ray ray, float maxDistance, int layerMask) => Physics.defaultPhysicsScene.Raycast(ray.origin, ray.direction, maxDistance, layerMask);  
  
[ExcludeFromDocs]  
public static bool Raycast(Ray ray, float maxDistance) => Physics.defaultPhysicsScene.Raycast(ray.origin, ray.direction, maxDistance);  
  
[ExcludeFromDocs]  
public static bool Raycast(Ray ray) => Physics.defaultPhysicsScene.Raycast(ray.origin, ray.direction);  
  
public static bool Raycast(  
Ray ray,  
out RaycastHit hitInfo,  
[UnityEngine.Internal.DefaultValue("Mathf.Infinity")] float maxDistance,  
[UnityEngine.Internal.DefaultValue("DefaultRaycastLayers")] int layerMask,  
[UnityEngine.Internal.DefaultValue("QueryTriggerInteraction.UseGlobal")] QueryTriggerInteraction queryTriggerInteraction)  
{  
return Physics.defaultPhysicsScene.Raycast(ray.origin, ray.direction, out hitInfo, maxDistance, layerMask, queryTriggerInteraction);  
}  
  
[ExcludeFromDocs]  
public static bool Raycast(Ray ray, out RaycastHit hitInfo, float maxDistance, int layerMask) => Physics.Raycast(ray.origin, ray.direction, out hitInfo, maxDistance, layerMask, QueryTriggerInteraction.UseGlobal);  
  
[ExcludeFromDocs]  
public static bool Raycast(Ray ray, out RaycastHit hitInfo, float maxDistance) => Physics.defaultPhysicsScene.Raycast(ray.origin, ray.direction, out hitInfo, maxDistance);  
  
[ExcludeFromDocs]  
public static bool Raycast(Ray ray, out RaycastHit hitInfo) => Physics.defaultPhysicsScene.Raycast(ray.origin, ray.direction, out hitInfo);