Math & Physics
Intermediate
Unity 2021.3+ / Unity 6
각도와 거리 가중치를 합산하는 스마트 타깃 조준 보정 알고리즘
급박한 플레이 환경에서 마우스 조준 방향과 대상 간의 각도 오차, 거리 비율을 정규화 가중치로 평가해 최적의 앵커/적을 선별하는 타깃팅 수학.
#Math #Algorithm #Aim Assist #2D Physics #Gameplay
핵심 개념고속 액션에서 플레이어가 마우스 픽셀 하나를 정확히 맞추기는 불가능합니다. 유효 시야각 안의 타깃 후보들을 찾아 각도 오차($\theta$)와 거리 비율($d / D_{max}$)을 가중치 합산하여 가장 점수가 낮은(최적의) 타깃으로 조준선을 자동 스냅(Snap)시킵니다.
1. 타깃 보정 스코어링 알고리즘
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;
}
}