기존에 디버깅용으로 사용하던 그리드 표시 방식을 제거하고, 실제 게임 플레이에서 사용할 수 있는 건설 모드 전용 그리드 표시 기능을 구현했다. 추가로, 건설 모드에 진입했을 때 이미 설치된 발전기들의 전력 범위를 확인할 수 있도록 시각화 기능도 추가했다.
게임용 그리드 Actor
AKOGridVisual은 UInstancedStaticMeshComponent를 사용해 실제 Mesh 기반의 그리드 선을 생성한다.
Cube Mesh를 사용했는데, 기본 Cube를 그대로 사용하면 선이 아니라 두꺼운 박스처럼 보였다. 그래서 Z Scale을 작게 줄여 바닥 위에 얇은 선처럼 보이도록 조정했다.
const FVector Scale(
LineThickness / 100.0f,
(MaxY - MinY) / 100.0f,
0.005f
);
가로선과 세로선을 각각 인스턴스로 추가해 전체 그리드를 구성했다.
건설 모드에서만 그리드 표시
그리드는 평상시에는 보이지 않고, 건설과 관련된 모드에서만 보이도록 했다. 건설 시스템은 BuildMenu, Placing, Destroying, None 상태를 가지고 있기 때문에, 이 상태값을 기준으로 그리드 표시 여부를 제어했다.
const bool bShouldShowGrid =
CurrentMode == EKOGridBuildMode::BuildMenu ||
CurrentMode == EKOGridBuildMode::Placing ||
CurrentMode == EKOGridBuildMode::Destroying;
GridVisualActor->SetGridVisible(bShouldShowGrid);
UKOGridBuildComponent의 모드 변경 시점에 호출되도록 연결했다. 그 결과 건설 메뉴를 열거나 설치/파괴 모드에 들어갔을 때만 그리드가 보이고, 건설 모드를 종료하면 자동으로 숨겨진다.
설치된 발전기의 전력 범위 표시
건설 모드에서 이미 설치된 발전기들의 전력 범위를 표시하도록 했다.
이를 위해 AKOGridVisual에서 월드에 설치된 건물들을 순회하고, 그중 UKOEnergyProducerComponent가 붙은 건물만 발전기로 판단했다.
for (TActorIterator<AKOBaseBuilding> It(World); It; ++It)
{
AKOBaseBuilding* Building = *It;
if (!IsValid(Building))
{
continue;
}
UKOEnergyProducerComponent* Producer =
Building->FindComponentByClass<UKOEnergyProducerComponent>();
if (!Producer)
{
continue;
}
}
발전기라고 판단된 건물은 FactoryId를 통해 DataTable Row를 찾고, 해당 Row의 EnergyCoverageRadius 값을 가져온다. 이 값이 실제 전력 범위 반경으로 사용된다.
const FKOFactoryRow* FactoryRow = LoadSub->FindFactoryRow(FactoryId);
if (!FactoryRow)
{
continue;
}
const int32 PowerRadius = FactoryRow->EnergyCoverageRadius;
if (PowerRadius <= 0)
{
continue;
}
이후 GridSubsystem에서 해당 건물이 점유하고 있는 그리드 영역을 가져온 뒤, 그 영역을 기준으로 전력 범위를 계산했다.
FIntPoint OccupiedAnchor;
FIntPoint OccupiedSize;
if (!GridSub->TryGetOccupiedAreaForActor(Building, OccupiedAnchor, OccupiedSize))
{
continue;
}
AddPowerCoverageArea(OccupiedAnchor, OccupiedSize, PowerRadius);
전력 범위는 발전기가 차지하는 영역을 기준으로 상하좌우 반경만큼 확장해서 계산했다.
const FIntPoint CoverageAnchor(
Anchor.X - PowerRadius,
Anchor.Y - PowerRadius
);
const FIntPoint CoverageSize(
Size.X + PowerRadius * 2,
Size.Y + PowerRadius * 2
);
계산된 영역 안의 셀마다 노란색 Plane 인스턴스를 배치해 전력 범위를 표시했다.
정리
역할 분리
UKOGridSubsystem
- 그리드 데이터 관리
- 설치 가능 여부 검사
- 점유 영역 관리
AKOGridVisual
- 건설 모드에서 보이는 그리드 표시
- 설치된 발전기들의 전력 범위 표시
UKOGridBuildComponent
- 건설 모드 상태에 따라 GridVisual 표시 제어
최종적으로 평상시에는 그리드가 보이지 않고, 건설 모드에 들어갔을 때만 바닥 그리드와 설치된 발전기들의 전력 범위가 표시된다. 이를 통해 플레이어가 설비를 배치할 때 전력 공급 범위를 더 직관적으로 확인할 수 있게 되었다.
'Unreal 최종 팀프로젝트' 카테고리의 다른 글
| [TIL] 컨베이어 벨트 포트 선택 | 최종 팀프로젝트 (0) | 2026.06.24 |
|---|---|
| [TIL] 컨베이어 벨트 고스트 프리뷰 방향 표시 | 최종 팀프로젝트 (0) | 2026.06.23 |
| [TIL] UI 구조 개선 | 최종 팀프로젝트 (0) | 2026.06.19 |
| [TIL] 개수 지정 제작 기능 | 최종 팀프로젝트 (0) | 2026.06.15 |
| [TIL] 설비 제작 UI | 최종 팀프로젝트 (0) | 2026.06.11 |