육각 그리드와 이동 비용 기반 경로 탐색
ProjectTB의 좌표, 지형, 이동 범위 분리
본 블로그 작성 글들은, 강의를 목표로 하고 제작되었습니다. 또한 작성된 글의 정보도 틀렸을 수 있으니, 주의해주세요.
육각 그리드는 사각형처럼 상하좌우 네 방향만 확인할 수 없다. ProjectTB에서는 FTBHexCoord를 Key로 사용하고, GridManager가 이웃과 이동 비용을 계산한다.
UPROPERTY(BlueprintReadOnly, Category = "Grid")
TMap<FTBHexCoord, TObjectPtr<ATBHexTile>> Tiles;
좌표와 월드 위치를 분리한다
게임 규칙은 Hex 좌표로 계산하고, 화면 배치는 HexToWorld()에서 변환한다.
FTBHexCoord
이웃 검색 / 범위 / 경로 탐색
↓ HexToWorld
FVector
Actor의 실제 위치
이렇게 하면 타일 간격이나 Mesh 크기를 바꿔도 경로 탐색 규칙까지 다시 만들 필요가 없다.
이동 가능 범위는 거리만 보면 안 된다
평지는 비용 1, 늪은 비용 2이고 진입 불가 타일도 있을 수 있다. 단순히 반경 3칸을 표시하면 실제 이동 가능 범위와 달라진다.
ProjectTB의 GridManager는 시작점부터 누적 이동 비용을 계산한다.
bool FindPath(
ATBHexTile* StartTile,
ATBHexTile* DestinationTile,
TArray<ATBHexTile*>& OutPath,
int32& OutCost
) const;
TArray<ATBHexTile*> GetReachableTiles(
ATBHexTile* StartTile,
int32 MovementBudget
) const;
이 구조는 Dijkstra 탐색과 비슷하다. 현재까지 비용이 가장 작은 타일부터 확장하고, 더 싼 경로를 발견하면 비용과 이전 좌표를 갱신한다.
육각 그리드 구현에서 중요한 것은 육각형 Mesh를 그리는 일이 아니다. 논리 좌표, 월드 위치, 지형 비용, 점유 상태를 서로 다른 책임으로 분리해야 이동 규칙이 커져도 버티기 쉽다.