TOOLS GAMES DEVLOG DOCS ABOUT CONTACT
HOME > DOCS > Math & Physics > 각도와 거리 가중치를 합산하는 스마트 타깃 조준 보정 알고리즘
Math & Physics Intermediate Unity 2021.3+ / Unity 6

각도와 거리 가중치를 합산하는 스마트 타깃 조준 보정 알고리즘

급박한 플레이 환경에서 마우스 조준 방향과 대상 간의 각도 오차, 거리 비율을 정규화 가중치로 평가해 최적의 앵커/적을 선별하는 타깃팅 수학.

#Math #Algorithm #Aim Assist #2D Physics #Gameplay
핵심 개념고속 액션에서 플레이어가 마우스 픽셀 하나를 정확히 맞추기는 불가능합니다. 유효 시야각 안의 타깃 후보들을 찾아 각도 오차($\theta$)와 거리 비율($d / D_{max}$)을 가중치 합산하여 가장 점수가 낮은(최적의) 타깃으로 조준선을 자동 스냅(Snap)시킵니다.

1. 타깃 보정 스코어링 알고리즘

AimAssistScoring.cs
using UnityEngine;

public static class AimAssistScoring
{
    public static Transform FindBestTarget(
        Vector2 origin, Vector2 aimDirection, float maxDistance, float maxAngle,
        LayerMask targetLayer, LayerMask obstacleLayer, float distanceBias = 20f)
    {
        var colliders = Physics2D.OverlapCircleAll(origin, maxDistance, targetLayer);
        Transform bestTarget = null;
        float bestScore = float.MaxValue;

        foreach (var col in colliders)
        {
            Vector2 targetPos = col.bounds.center;
            Vector2 toTarget = targetPos - origin;
            float dist = toTarget.magnitude;
            if (dist < 0.1f) continue;

            Vector2 dir = toTarget / dist;
            float angle = Vector2.Angle(aimDirection, dir);

            if (angle <= maxAngle)
            {
                // 장애물 가림 검사 (Raycast)
                var hit = Physics2D.Raycast(origin, dir, dist - 0.2f, obstacleLayer);
                if (hit.collider == null)
                {
                    // 스코어 = 각도(도) + 거리비율(0~1) * 거리 가중치
                    float score = angle + (dist / maxDistance) * distanceBias;
                    if (score < bestScore)
                    {
                        bestScore = score;
                        bestTarget = col.transform;
                    }
                }
            }
        }
        return bestTarget;
    }
}

참고자료 & 관련 링크