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
과 같은 추가 정보를 제공할 수 있습니다.
용도:
- 객체 상호작용: 플레이어가 어떤 객체를 가리키고 있는지 확인합니다.
- AI 감지: 플레이어나 다른 객체가 AI의 시야 내에 있는지 감지합니다.
- 슈팅 메커니즘: 총알이나 다른 발사체를 시뮬레이션합니다.
- 지형 분석: 지형의 경사나 구조를 분석합니다.
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);