using UnityEngine;
namespace Colosseum.Combat
{
///
/// 대상 루트가 아니라 실제 충돌 표면 기준의 위치와 거리를 계산하는 유틸리티입니다.
///
public static class TargetSurfaceUtility
{
///
/// 기준 위치에서 대상의 가장 가까운 충돌 표면 지점을 반환합니다.
///
public static Vector3 GetClosestSurfacePoint(Vector3 origin, GameObject target)
{
if (target == null)
return origin;
if (TryGetTargetCollider(target, out Collider targetCollider))
return targetCollider.ClosestPoint(origin);
return target.transform.position;
}
///
/// 기준 위치에서 대상 충돌 표면까지의 수평 거리를 반환합니다.
///
public static float GetHorizontalSurfaceDistance(Vector3 origin, GameObject target)
{
Vector3 closestPoint = GetClosestSurfacePoint(origin, target);
Vector3 horizontalDelta = closestPoint - origin;
horizontalDelta.y = 0f;
return horizontalDelta.magnitude;
}
///
/// 기준 위치에서 대상 충돌 표면으로 향하는 수평 방향 벡터를 반환합니다.
///
public static Vector3 GetHorizontalDirectionToSurface(Vector3 origin, GameObject target)
{
Vector3 direction = GetClosestSurfacePoint(origin, target) - origin;
direction.y = 0f;
return direction;
}
///
/// 대상에서 표면 계산에 사용할 대표 콜라이더를 찾습니다.
///
public static bool TryGetTargetCollider(GameObject target, out Collider targetCollider)
{
targetCollider = null;
if (target == null)
return false;
CharacterController characterController = target.GetComponent();
if (characterController == null)
characterController = target.GetComponentInParent();
if (characterController != null)
{
targetCollider = characterController;
return true;
}
targetCollider = target.GetComponent();
if (targetCollider == null)
targetCollider = target.GetComponentInChildren();
if (targetCollider == null)
targetCollider = target.GetComponentInParent();
return targetCollider != null;
}
}
}