오늘은 아케인보드 시스템에서 특수 셀과 연결된 룬들에게 시각적 효과를 적용하는 시스템을 구현했음
처음엔 그리드 셀 자체에 테두리 효과를 주려고 했는데, 실제 구현해보니 룬 조각이 쪼개져 보이는 문제와 복잡한 테두리 로직 문제가 발생했음. 결국 룬 텍스처 자체를 교체하는 방식으로 완전히 설계를 변경하게 되었음
목표: 특수 셀과 연결된 룬들을 시각적으로 돋보이게 만들기
초기 아이디어:
TMap<uint8, TArray<FIntPoint>> ConnectedRuneCells로 연결 정보 저장구현 방식:
// 연결된 셀 정보 전달
TMap<uint8, TArray<FIntPoint>> ConnectedRuneCells;
// UI에서 각 셀에 테두리 효과 적용
for (auto& ConnectedRune : ConnectedRuneCells) {
for (FIntPoint CellPos : ConnectedRune.Value) {
if (GridCells.Contains(CellPos)) {
GridCells[CellPos]->ApplyConnectedEffect();
}
}
}

발견된 문제점:
1. 룬 조각 분리: 하나의 룬이 여러 셀에 걸쳐있는데 셀별로 효과를 주면 룬이 쪼개져 보임
2. 복잡한 테두리 로직: 룬의 실제 모양에 따라 상하좌우 테두리를 선택적으로 표시해야 함
3. 미적 문제: 그리드 테두리보다 룬 자체가 빛나는 게 더 자연스러움
그리드 테두리가 빛나는 것보다 룬 조각의 테두리가 빛나는게 미적으로 더 나은 것 같고, 구현 복잡성으로 봤을 때도 단순히 연결된 룬 이미지를 따로 저장해서 바꿔주기만 하는게 간단할 것 같아서 구현 방법 바꿈
새로운 접근법:
1차 단순화: ConnectedRuneCells 제거
// 기존
struct FArcaneBoardStats {
FGS_StatRow RuneStats;
FGS_StatRow BonusStats;
TMap<uint8, TArray<FIntPoint>> ConnectedRuneCells; // 제거 대상
};
// 변경 후
struct FArcaneBoardStats {
FGS_StatRow RuneStats;
FGS_StatRow BonusStats;
};
2차 단순화: bIsConnected 플래그 도입
struct FGridCellData {
// 기존 멤버들...
bool bIsConnected; // 연결 상태 플래그 추가
};
연결 탐색 로직 개선:
void UGS_ArcaneBoardManager::UpdateConnections() {
// 1. 모든 셀의 bIsConnected를 false로 초기화
for (auto& CellPair : CurrGridState) {
CellPair.Value.bIsConnected = false;
}
// 2. 특수 셀에서 DFS 탐색하여 bIsConnected = true 설정
TSet<FIntPoint> VisitedCells;
FindConnectedCells(SpecialCellPos, VisitedCells);
}
연결 텍스처 조각 저장:

struct FGridCellData {
UTexture2D* RuneTextureFrag; // 일반 상태 텍스처 조각
UTexture2D* ConnectedRuneTextureFrag; // 연결 상태 텍스처 조각
bool bIsConnected; // 연결 상태
};
// 매우 간단해진 텍스처 교체 로직
void UGS_RuneGridCellWidget::SetCellData(const FGridCellData& InCellData) {
CellData = InCellData;
// 단순 스왑!
UTexture2D* TextureToUse = CellData.bIsConnected && CellData.ConnectedRuneTextureFrag ?
CellData.ConnectedRuneTextureFrag : CellData.RuneTextureFrag;
SetRuneTexture(TextureToUse);
}

완성된 시스템의 특징: