프로젝트 명 : Random Tower Defence
- 개발 기간 : 2026.03.05 ~ 2026.03.11 (총 6일)
- 참여 인원 : 1명 (개인)
- 게임 장르 : 아케이드 액션
- 플랫폼 : PC Windows
- 게임 설명:
- 26개의 모든 웨이브 막기.
- 문양 등장 확률을 바꾸고 최대한 같은 종류의 문양으로 타워를 설치하여 보너스 데미지를 활용하기.
[ 적용한 기능 및 기술 ]
- 이번 프로젝트는 단순하게 AStar알고리즘을 활용하여 해당 알고리즘을 시각화를 하는 것이 목표였던 프로젝트였습니다. 그렇기에, 이 Astar 알고리즘을 어떻게 개선하고 보완할 수 있는지에 초점을 맞추어 진행하게 되었습니다.
- Astar알고리즘의 시각화는 아래 그림의 파란색 루트를 나타냅니다.

1. A-Star 알고리즘 활용
- 기본적으로 Astar알고리즘을 활용하여 몬스터가 목적지까지 이동 가능하도록 진행하였습니다.
- 수업시간에 진행했던 Astar알고리즘의 코드를 개인 프로젝트에 맞게 수정 및 보완하여 진행하였습니다.
수정한 부분
-
가장 먼저 눈에 띄었던 부분은, 기존에는 vector를 활용하여 우선순위에 대한 처리를 O(n)의 방식으로 처리가 진행된 부분이었습니다. 이 부분을 우선순위 큐를 사용하여 O(1)의 복잡도로 우선순위에 대해 처리해주도록 수정하게 되었습니다.
-
유클리드 거리를 사용하여 대각선 이동을 했었기에, 맨허튼 거리를 사용하도록 수정해주었습니다.
보완한 부분
-
기존에는 모든 경로를 다 막았을 경우에 대한 처리를 따로 하지 않았었습니다. 타워 디펜스 특성 상 모든 길을 다 막아버릴 경우 너무나 쉽게 스테이지를 클리어 할 수 있었기에, 시스템상에서 이동경로를 막지 못하게 처리할 것인지, 아니면 막았을 경우 몬스터가 강제로 부수도록 할 것인지에 대해서 고민하게 되었고, 여기서는 후자를 선택하게 되었습니다. -> A*를 통해 길찾기를 진행할 때 휴리스틱한 좌표중 최솟값을 best한 좌표를 계속 갱신해나가며, 최종적으로 경로를 찾지 못했을 경우 best에 저장된 좌표로 이동하는 로직으로 추가를 진행해주었으며, best한 좌표로 이동하여 주변 타워를 검색하고 부수도록 처리를 진행해주는 방식으로 보완하게 되었습니다.
-
다량의 몬스터가 생성되어 각자 본인들의 경로인 A*를 이동할 때, 다음 경로가 겹칠 경우에 대한 우선순위 처리를 진행해주었습니다. 각 Enemy별로 id를 부여하여 작은 id가 더 높은 우선순위를 가질 수 있도록 진행해주었습니다.
2. bfs를 활용한 타워 시스템
- 단순하게 타워만 설치 및 공격하고 끝내기에는 아쉬울 것 같아, bfs를 활용한 데미지 증가 시스템을 추가하게 되었습니다. 같은 문양이 5개 이상 연결될 경우 연결된 개수만큼 데미지를 증가시켜주는 처리를 진행해주었습니다. 아래 그림에서 하트에 해당하는 타워가 그 모습을 보여주고 있습니다.

- 타워를 설치할 때마다 해당 좌표를 기준으로 bfs탐색을 시작하여 주변 타워를 검색하기 시작합니다. 동일한 인덱스를 가진 타워의 경우 카운팅이 +1씩 증가하며, 그 증가한 개수가 5이상이 된다면 bonusAttack이라는 값을 증가한 개수 * 0.7정도로 수치를 조정하여 보너스 공격력이 추가되도록 해주었습니다.
3. 타워 가챠 시스템
- 아래 UI의 상단에 있는 Tower Probability 부분을 마우스로 클릭 할 경우 타워 생성 확률이 달라지게 됩니다.

[문제 해결]
1. 특수문자 사용시 발생했던 문제점.
- 특수문자를 사용하기 위해 wchar_t형식으로 문자를 출력할 경우 아래와 같은 문제점이 발생하게 되었습니다.

- 이는 이 문자들이 길이를 2만큼을 사용하고 있었기에 발생했던 문제였습니다. 이를 해결하기 위해 게임 상에 배치되는 모든 Actor들에 대해서는 모두 길이를 2이상을 가질 수 있도록, 최소 문자 길이를 설정해주어 해결하게 되었습니다.
- 또한, 이렇게 할 경우 마우스로 콘솔 위치를 클릭했을 때, 올바르게 좌표값이 매칭되지 않는 문제가 발생했습니다. 타워의 경우 TileMap이라는 곳에서 2차원 배열로 관리가 되고 있었기에 콘솔 위치를 클릭했을 때 좌표값을 절반으로 나누어 올바른 TileMap의 인덱스 위치로 매칭되도록 ScreenToGrid함수를 통해 처리해주었습니다.
2. 드래그 유지 시 생성 삭제가 반복되는 현상.
-
드래그로 타워를 생성 및 삭제를 하도록 만들어야 했기에, 드래그 기능을 추가하였습니다. 이 때, 한 위치에서 마우스의 Down을 계속 유지하고 있게 된다면 생성과 삭제가 반복해서 일어나게 되는 문제가 발생하게 되었습니다.
-
이를 해결하기 위해 예외처리 변수를 추가하여, lastTile에 담겨있던 데이터와 새롭게 설치하려는 데이터가 일치할 경우 return해주는 방식으로 진행하여 수정하게 되었습니다.
[ 부족했던 점 ]
-
A-Star알고리즘을 진행함에 있어서 경로 설정을 어느 시점에 처리해야 할 지에 대해서 고민을 하게 되었습니다. 처음에 했던 방식은 한 칸씩 움직일 때마다 이동할 위치에 타워가 있어서 이동하지 못한다면 다시 경로 재설정을 하는 방식으로 진행했었는데, 이렇게 할 경우 ‘시각화’에 문제가 발생하게 됩니다. 경로가 설정된 상태에서 경로를 막는 방향으로 타워를 설치하여도, 해당 타워의 이전 위치까지 이동하기 전에는 막혀있는지를 판단할 수 없게 되기에 이는 올바른 방식이 아니었습니다. -> 타워를 설치할 때마다 경로를 재설정해주는 것이 여러모로 루트를 안전하게 보여줄 수 있다고 생각하여 해당 방식으로 수정하게 되었습니다.
-
또한, 기획적인 부분에서도 어려움을 겪었습니다. 프로젝트의 주제가 시각화하는 주제였기에 많은 동기분들이 타워디펜스 장르를 선택할 것이라 생각하였고, 저 또한 타워 디펜스 장르를 좋아하는 입장에서 이러한 주제를 선택하게 되었습니다. 이 상태에서 차별점을 두기 위해 단순하게 타워를 생성하여 몬스터를 공격하는 것이 아닌, 타워 생성 가챠 시스템을 도입하여 생성에 대해서도 조금 더 신중함을 기울이는 기획을 추가하여 재미의 요소를 추가하게 되었습니다.
[새롭게 시도해보고 싶은 점]
-
단순하게 클라이언트에 대해서만 처리하는 것이 아닌, 멀티를 통해 진행해보고 싶다는 생각을 하게 되었습니다.
-
다음 프로젝트가 언리얼 블루프린트 첫 프로젝트인데, 언리얼에서 제공하는 리슨 서버 방식을 사용하여 프로젝트를 진행해보려고 준비하고 있습니다.
No Comment! Be the first one.