Files
Colosseum/Assets/_Game/Scripts/Combat/TargetSurfaceUtility.cs
dal4segno abfc43ae76 fix: 플레이어 접촉 이동과 타깃 표면 추적 보정
- TargetSurfaceUtility를 추가해 플레이어와 적의 실제 충돌 표면 기준으로 거리, 방향, 목적지를 계산

- 플레이어 이동과 적 루트모션, 추적 로직에서 접촉 시 수평 이동을 제한해 겹침과 밀어내기 문제를 완화

- 드로그 AI 거리 판정 노드들이 표면 거리 기준을 사용하도록 맞춰 사거리 분기 오차를 줄임
2026-04-09 23:22:28 +09:00

74 lines
2.7 KiB
C#

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