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; } } }