
맵 구조상 돔 형태의 Core를 지하 입구 위에 배치하게 되었다.
문제는 Core의 원점 위치가 공중에 떠 있다는 점이었다.
기존처럼 MoveTo() 기반으로 이동하게되면 AI가 공중 좌표를 목적지로 인식하게 되고, 결국 NavMesh 기반 경로 탐색이 실패했다.
그래서 적마다 Core 방향으로 LineTrace를 하고 Core Mesh에 Hit한 지점을 목적지로 사용하려 했다.
하지만 대규모 적들이 코어로 이동하려 할 때마다 Trace를 수행하는 건 부담이 클 것 같았다.

Core가 BeginPlay 시점에 자신의 테두리 좌표들을 미리 계산해서 Anchors 배열로 저장하는 방식을 구상해보았다.
그러면 적은 단순히 가장 가까운 Anchor 좌표를 받아 이동하면 되므로,
실시간 Trace 없이 메모리 참조 수준의 비용만 사용하게 된다.
추가로 ProjectPointToNavigation()도 고려했지만:
한다고 판단해 제외했다.
Core 중심을 기준으로 Anchor 개수만큼 사방으로 LineTrace 발사 후, Hit된 지점을 Anchor로 저장하였다.
처음에는 Trace가 정상적으로 보이는데도 Hit이 발생하지 않아 한참 디버깅했는데,
원인은 StaticMesh의 충돌 판정 방향이었다.
StaticMesh는:
내부 → 외부 방향 Trace는 Hit되지 않고,
외부 → 내부 방향이어야 충돌이 발생
하고 있었다.
그래서 단순히:
Start <-> End
를 반대로 바꿔주니 정상적으로 Anchor가 생성되는 것을 확인할 수 있었다.
void ABaseCore::FindAnchors()
{
Anchors.Reserve(ScanCount);
FCollisionObjectQueryParams ObjectParams;
ObjectParams.AddObjectTypesToQuery(ECC_WorldDynamic);
for (int32 i = 0; i < ScanCount; ++i)
{
float Angle = i * (360.f / ScanCount);
FVector Direction = FRotator(0.f, Angle, 0.f).Vector();
FVector End = Start + Direction * ScanRadius;
FHitResult Hit;
if (GetWorld()->LineTraceSingleByObjectType(Hit, End, Start, ObjectParams))
{
FVector HitLocation = Hit.Location;
Anchors.Add(HitLocation);
}
}
}
Core의 테두리 Anchor를 만들고 난 뒤, 이제는 적이 어떤 Anchor로 이동해야 하는지가 문제였다.
처음에는 단순하게:
하려 했다.
하지만 이 방식은:
일 때 결국 O(NM) 복잡도가 된다.
현재 프로젝트는 대규모 디펜스 게임이라,
적 수가 많아질수록 부담이 커질 수밖에 없었다.
Anchor 배열은 생성 시 다음 규칙을 가지도록 만들어두었다.

Anchors[0] : X축 양의 방향즉 배열 자체가 이미 원형 인덱스 구조를 가지고 있었다.
그래서 적 방향의 각도를 바로 Anchor 인덱스로 변환하는 방식으로 접근했다.

우선 Core 중심 → 적 방향 벡터를 구한 뒤, 이 벡터가 X축 기준 몇 도(Degrees)인지 계산했다.
그리고 AnchorAngle = 360 / AnchorCount로 Anchor 하나당 각도를 구했다.
이후 Index = Degrees / AnchorAngle 계산 결과를 그대로 Anchor 인덱스로 사용했다.
즉:
만으로 바로 목적지 Anchor를 찾을 수 있게 된 것이다.
결과적으로 모든 Anchor를 순회하지 않고, O(1) 시간복잡도로 이동 지점을 결정할 수 있게 되었다.
실제로 테스트해보니 적들이
하는 것을 확인할 수 있었다.
