[25.06.16] :: 가디언 앤 시커 프로젝트 14

chooha·2025년 6월 17일

가디언앤시커

목록 보기
14/25

📝 개발일지 - 아케인보드 룬 연결 시각효과 시스템

👨‍💻 오늘의 개발 작업

오늘은 아케인보드 시스템에서 특수 셀과 연결된 룬들에게 시각적 효과를 적용하는 시스템을 구현했음

처음엔 그리드 셀 자체에 테두리 효과를 주려고 했는데, 실제 구현해보니 룬 조각이 쪼개져 보이는 문제와 복잡한 테두리 로직 문제가 발생했음. 결국 룬 텍스처 자체를 교체하는 방식으로 완전히 설계를 변경하게 되었음


💡 오늘의 5분 기록

1. 초기 요구사항 - 그리드 기반 시각효과

목표: 특수 셀과 연결된 룬들을 시각적으로 돋보이게 만들기

초기 아이디어:

  • 연결된 그리드 셀들에 테두리나 글로우 효과 적용
  • TMap<uint8, TArray<FIntPoint>> ConnectedRuneCells로 연결 정보 저장
  • UI에서 셀 위치 정보를 받아서 각 셀에 효과 적용

2. 첫 번째 구현 시도 - 그리드 셀 테두리 효과

구현 방식:

// 연결된 셀 정보 전달
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. 미적 문제: 그리드 테두리보다 룬 자체가 빛나는 게 더 자연스러움

3. 설계 방향 전환 - 룬 텍스처 교체 방식

그리드 테두리가 빛나는 것보다 룬 조각의 테두리가 빛나는게 미적으로 더 나은 것 같고, 구현 복잡성으로 봤을 때도 단순히 연결된 룬 이미지를 따로 저장해서 바꿔주기만 하는게 간단할 것 같아서 구현 방법 바꿈

새로운 접근법:

  • 각 룬마다 일반 상태와 연결 상태의 텍스처를 별도로 준비
  • 연결 상태에 따라 텍스처만 교체

4. 데이터 구조 단순화 과정

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);
}

5. 룬 조각별 텍스처 적용

연결 텍스처 조각 저장:

현재는 임시 텍스쳐 넣어놓은 상태
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);
}

6. 핵심 성과와 깨달음

완성된 시스템의 특징:

  • 룬 단위의 자연스러운 시각 효과
  • 조각별 텍스처 교체로 완벽한 연결 표현
  • 복잡한 테두리 계산 로직 불필요
  • 단순한 boolean 플래그와 텍스처 스왑으로 구현

0개의 댓글