public static bool BoxCast(Vector3 center, Vector3 halfExtents, Vector3 direction, out RaycastHit hitInfo, Quaternion orientation = Quaternion.identity, float maxDistance = Mathf.Infinity, int layerMask = DefaultRaycastLayers, QueryTriggerInteraction queryTriggerInteraction = QueryTriggerInteraction.UseGlobal);
Vector3 center
박스의 시작 중심 위치
Vector3 halfExtents
박스 크기를 정의하는 세 개 축의 각 길이의 절반값들
Vector3 direction
박스 모양을 쏠 방향
RaycastHit hitInfo
콜라이더와 충돌 정보
Quaternion orientation
쏘는 박스의 회전값
float maxDistance
박스를 쏘는 최대 거리(충돌 지점과의 direction으로 최대 거리는 halfExtents 값 + maxDistance)
int layerMask
충돌 목표 레이어(충돌 가능한 레이어)
QueryTriggerInteraction queryTriggerInteraction
Ignore이면 Trigger 콜라이더와의 충돌은 무시
Collide이면 Trigger와 상관없이 콜라이더와 충돌 검출
UseGlobal이면 Edit > Project Settings > Physics > Layer Collision Matrix 설정을 따름
충돌이 검출되면 true. 아니라면 false
박스 모양을 쏘아 충돌을 검출
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BoxcastTest : MonoBehaviour
{
public float distance;
public Vector3 boxSize;
public bool isHit;
public RaycastHit hit;
public Vector3 rotationAngles;
void FixedUpdate()
{
isHit = Physics.BoxCast(transform.position, boxSize, Vector3.forward, out hit, Quaternion.Euler(rotationAngles), distance, Physics.DefaultRaycastLayers, QueryTriggerInteraction.UseGlobal);
}
private void OnDrawGizmos()
{
Gizmos.color = Color.red;
Gizmos.DrawRay(transform.position, Vector3.forward * distance);
Gizmos.DrawWireSphere(transform.position + Vector3.forward * distance, 3f);
if (isHit)
{
Gizmos.color = Color.green;
Vector3 position = hit.point;
Gizmos.DrawWireSphere(hit.point, 2f);
Gizmos.color = Color.yellow;
Vector3 impact = hit.point - transform.position;
float l = Vector3.Dot(Vector3.forward, impact);
Vector3 a = transform.position + Vector3.forward * l;
a -= Vector3.forward * boxSize.z;
Gizmos.DrawWireCube(a, boxSize * 2f);
}
}
}
충돌 지점으로 모양을 추론하면 회전된 것을 알 수 있음. 대체로 충돌 지점들이 왼쪽위에서 오른쪽아래 대각선으로 방향으로 분포함