fix: 플레이어 접촉 이동과 타깃 표면 추적 보정
- TargetSurfaceUtility를 추가해 플레이어와 적의 실제 충돌 표면 기준으로 거리, 방향, 목적지를 계산 - 플레이어 이동과 적 루트모션, 추적 로직에서 접촉 시 수평 이동을 제한해 겹침과 밀어내기 문제를 완화 - 드로그 AI 거리 판정 노드들이 표면 거리 기준을 사용하도록 맞춰 사거리 분기 오차를 줄임
This commit is contained in:
73
Assets/_Game/Scripts/Combat/TargetSurfaceUtility.cs
Normal file
73
Assets/_Game/Scripts/Combat/TargetSurfaceUtility.cs
Normal file
@@ -0,0 +1,73 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
2
Assets/_Game/Scripts/Combat/TargetSurfaceUtility.cs.meta
Normal file
2
Assets/_Game/Scripts/Combat/TargetSurfaceUtility.cs.meta
Normal file
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 09a6561ba8b8e4325ad39f70740b32d4
|
||||
Reference in New Issue
Block a user