
RogueTower
- ROLE
- 개발, 기획, 디자인
- DURATION
- 2024.10 ~ 2025.08
- TEAM
- 1인 개발
- PLATFORM
- PC
Roguelike Tower Defense
개발 도구
- 엔진 : unity
- 언어 : C#
- 디자인 도구 : Aseprite
- 백엔드 서비스 : PlayFab
프로젝트 목표 및 설계 철학
이 프로젝트는 Unity와 C#에 대한 깊은 이해를 바탕으로, 단순한 기능 구현을 넘어 상용화 수준의 게임 개발 파이프라인 전체를 경험하는 것을 목표로 했습니다. 특히 PlayFab과 같은 외부 BaaS(Backend as a Service)를 연동하여 로그인, 랭킹, 데이터 분석, 원격 오류 수집 등 실시간 서비스에 필요한 핵심 백엔드 기능을 직접 구현하고자 했습니다.
설계 철학의 핵심은 `확장성`, `데이터 기반 디자인`, `코드 중복성 최소화`입니다. `타워`, `적`, `장비` 등 핵심 요소를 모두 모듈화하고,상속(Inheritance) 구조를 적극적으로 활용했습니다. 예를 들어, 모든 타워 무기의 공통 로직을 담은 `TowerWeapon`이라는 기반 클래스를 설계하고, `WeaponArrow`, `WeaponDefault` 등이 이를 상속받아 각 무기 고유의 공격 방식만 구현하도록 하여 코드의 재사용성과 유지보수성을 높였습니다. 또한, 밸런스 데이터는 `ScriptableObject`및 Json 파일로 관리하여 코드 수정 없이 유연한 업데이트가 가능한 시스템을 구축했습니다.
기술 요약
이번 프로젝트는 모듈형 구조와 이벤트 기반 설계를 통해 유지보수성과 확장성을 극대화한 2D 로그라이크 타워 디펜스 게임입니다. 타워와 스킬은 State 패턴을 적용하여 행동(탐색·공격)을 명확히 분리하였고, 주요 UI는 이벤트 기반 갱신으로 처리되어 불필요한 연산을 최소화했습니다.
또한, 절차적 맵 생성 알고리즘을 직접 설계하여 매번 새로운 플레이 경험을 제공하며, 데이터 기반 설계로 리플레이성과 유지보수성을 높였습니다. 특히, `Time.timeScale` 오염으로 인한 게임 멈춤 현상, 다중 오브젝트 환경에서의 사운드 병목 현상 등 복합적인 버그들을 정확한 원인 분석과 메모리 관리, 방어 코드 설계를 통해 해결하여 프로그램의 안정성을 크게 향상시켰습니다.
주요 성과
- 오브젝트 풀링 적용 → 100개 투사체 타워 동시 발사에도 안정적인 프레임 유지
- 난이도/경로 절차적 맵 생성 시스템 구현으로 매 플레이마다 새로운 전략 변수 제공
- 모듈화된 Tower/Enemy/Skill 구조 설계로 신규 콘텐츠 추가 시 코드 변경 최소화
- PlayFab 기반 글로벌 랭킹 연동 및 플레이어 데이터 수집·분석
- 이벤트 기반 UI 구조 설계로 UI와 게임 로직 간 의존성 최소화
- 개발일지를 통해 주요 패치, 버그 수정, 개선사항을 기록하며 품질 관리
기술적 특징
- 모듈형 타워 시스템 (State 패턴) : `IWeaponState` 인터페이스를 기반으로 타워의 행동(탐색, 공격)을 명확하게 분리하여 확장성을 높였습니다.
- 이벤트 기반 UI 업데이트 : `UIEventManager`를 통해 게임 데이터와 UI를 분리, 데이터 변경 시 UI가 실시간으로 반응하도록 설계하여 유지보수성을 강화했습니다.
- 오브젝트 풀링 : 성능 최적화를 위해 적, 발사체 등 반복 생성되는 오브젝트를 재활용하는 시스템을 구현했습니다.

풀링 성능 테스트 1 (148.19 FPS) 
풀링 성능 테스트 2 (175.48 FPS) - 중앙 집중형 사운드 관리 : `SoundManager`를 통해 BGM, SFX를 관리하며, 여러 개의 지속 사운드를 독립적으로 제어하는 기능을 구현했습니다.
- 애니메이션 재사용성 : `Animator Override Controller`를 활용하여 모든 타워가 하나의 로직을 공유하되, 각 타워의 애니메이션 클립만 교체하도록 설계하여 효율성을 높였습니다.
- 데이터 기반 설계 : `ScriptableObject`를 활용하여 타워 밸런스를 코드 수정 없이 쉽게 조절할 수 있도록 설계했습니다.
- 절차적 맵 생성 및 난이도 정량화 시스템
- 경로 생성 : `RandomPathGenerator.cs`를 통해 매 게임 시작 시 새로운 적 이동 경로를 동적으로 생성하며, 생성된 경로의 유효성을 검사하여 항상 완주 가능한 맵을 보장합니다.
- 난이도 계산 : 생성된 맵의 경로 길이, 꺾이는 횟수, 경로 간 간격 등 세 가지 요소를 가중치에 따라 조합하여 난이도를 객관적인 수치로 평가하는 `MapDifficulty.cs`를 설계했습니다.
- 시각화 : 생성된 경로 데이터를 기반으로 `MapGenerator.cs`가 Unity의 `Tilemap`을 이용해 길, 코너, 성 등의 타일을 배치하고, 플레이어의 진행도에 따라 다양한 맵 테마가 무작위로 적용되도록 구현했습니다.



- 이벤트 기반 UI 갱신 : 장비 장착, 보상 선택 등 주요 이벤트를 이벤트 리스너 기반으로 처리하여, 불필요한 Update 호출을 줄이고 퍼포먼스를 개선했습니다.
- 웨이브 랜덤 보상 / 첫 웨이브 특성 시스템 : 선택형 보상 패널과 첫 웨이브 특성 선택 시스템을 통합하여, 게임 초반 전략성을 강화하고 플레이 전체에 즉각 반영되도록 설계했습니다.
- 타워 및 장비 스킬 고도화
- - 타워 데이터와 스킬 데이터를 한쌍으로 TowerArchetype로 통합
- - 장비 특수 스킬을 SpecialSkillBase를 기반으로 상속받아 기능 구현
- - 타워 데이터와 스킬 데이터를 한쌍으로 TowerArchetype로 통합
- 맵/적 랜덤성 추가 : 맵과 적 스폰 정보를 데이터 랜덤성 추가 설계로 리플레이성과 유지보수성을 크게 강화했습니다.
- 사운드 및 해상도 대응 : 사운드 볼륨 정규화 및 1280~1600 해상도 대응 UI를 구현하고, 사운드매니저를 통해 관리 편의성과 확장성을 높였습니다.
- 데이터 관리 시스템 (암호화 및 마이그레이션)
`GameDataManager.cs`를 통해 플레이어의 저장 데이터를 XOR 암호화하여 로컬 파일 변조를 방지했습니다. 또한, 과거 버전(암호화 미적용)의 세이브 파일을 불러올 경우, 자동으로 최신 암호화 버전으로 변환 후 저장하는 데이터 마이그레이션 기능을 구현하여 안정성을 높였습니다.
- 툴팁 시스템 : 툴팁을 통한 유저 편의적인 UI 제공
툴팁이 필요한 객체에 `TooltipTrigger.cs` 컴포넌트를 이용하여 정보제공

툴팁 예시1 (타워 정보) 
툴팁 예시2 (특수 장비 인게임 정보 실시간 표기) 
툴팁 예시3 (장비 옵션) 
툴팁 예시4 (도감에서 장비 옵션) - 툴팁 시스템 통합 : TooltipManager와 TooltipTrigger를 기반으로 장비, 타워, 스킬에 마우스 오버 시 실시간 툴팁을 표시하여 UI 일관성과 직관성을 강화했습니다.
- PlayFab을 통한 데이터 수집 : 전투 데이터 및 에러 데이터 수집

PlayFab을 통한 전투 데이터 수집 
PlayFab 을 통한 에러 데이터 수집 쿼리
게임 개요
핵심 컨셉
- 로그라이크 요소와 타워 디펜스의 결합
- 웨이브별 전략적 선택과 성장
- 장비 파밍과 난이도 강화
타겟 플레이어
- 전략 게임을 선호하는 게이머
- 로그라이크 장르 팬층
- 낮은 난이도를 추구하는 유저
게임 흐름
대기실 흐름
전략 준비 및 성장 단계
- 획득한 장비를 확인하고 캐릭터에 장착
- 보유한 RCoin을 사용하여 상점에서 새로운 장비 뽑기
- 도전할 난이도 선택
- 준비 완료 후 게임 시작
인게임 흐름
전투와 랜덤성을 통한 성장 경험
- 첫 웨이브 특성 선택 (플레이 컨셉 결정)
- [ 타워 건설 → 적 처치 → 재화 획득 ] 전투 루프 반복
- 웨이브 클리어 시 제시되는 랜덤 보상 중 택 1 (전략 강화)
- 최종 웨이브 클리어 또는 패배
- 결과 확인 및 보상(장비) 획득 후 대기실 복귀


핵심 시스템
타워 시스템
기본 설계 방향
보스 몬스터 특화형
단일 타겟, 높은 데미지
일반 몬스터 특화형
다중 타겟, 낮은 데미지
근거리형 타워
낮은 사거리, 높은 데미지
원거리형 타워
높은 사거리, 낮은 데미지
타워 종류
- 타워 생산 비용 : TC(TowerCost) 단위 / 인게임에서는 이미지로 표기
- 타워 공격 타입 : 물리형, 마법형, 복합형
- 타워의 업그레이드는 타워의 공격 타입에 따라 영향을 받음 (복합형은 두 종류의 업그레이드를 합계로 받음)
기본 타워
50TC / 복합형
기본적인 단일 공격 타워
검사 타워
70TC / 물리형
높은 공격 속도와 단일 데미지
창술사 타워
200TC / 물리형
최대 4개 대상 동시 공격
궁수 타워
130TC / 물리형
넓은 범위의 다중 공격
레이저 타워
120TC / 마법형
높은 DPS의 단일 타겟 공격
사제 타워
100TC / 마법형
적 방어력 감소 효과

스킬 시스템
- 타워별 특수능력을 스킬패널에서 제공
- SP 초기값 : 0, 최대값 : 200
- 웨이브 클리어 시 20 SP 자동 지급
- 모든 스킬 20 SP 소모
- 웨이브당 스킬별 1회 사용 제한

웨이브 시스템
일반 웨이브
30마리 몬스터 출현
네임드
특정 웨이브 등장, 강화된 능력치
보스
최종웨이브 클리어 목표
보상 시스템
기본 보상
웨이브 클리어 시 20 SP
웨이브 처치 보상
개별 적 1개체당 골드 보상, 웨이브 진행도에 따라 증가
첫 웨이브 특성
- 게임 시작 시 첫 웨이브에서 10가지 특성 중 2개 제시
- 1개 선택 시 게임 플레이 전반에 큰 영향
- 기존 웨이브 랜덤 보상과 연계

선택형 추가 보상
매 웨이브 종료 시 2개의 보상 중 1개 선택
2개의 보상은 중복 가능하다
개별 보상은 선택지, 수치 2개의 랜덤을 통해 확정된다
- HP 회복 (최대 체력 상태에서는 등장 X)
- SP 추가 20~60 포인트
- 골드 보상
- 랜덤 타워 자동 설치 (경로 주위 우선으로 설치)
- 무료 물리/마법 업그레이드

난이도 & 장비 시스템
난이도 시스템
- 대기실에서 난이도 선택 가능
- 적 체력, 골드, 웨이브 배율에 직접 영향
- 난이도 곡선 설계로 고난이도 플레이 지원
- 난이도에 비례한 장비등급 확률 조정
장비 시스템
- 장비 획득 및 장착 시스템
- 도감을 통한 장비 수집의 재미 제공
- 장신구 장착 시 특수 스킬 발동
- 웨이브 보상 및 난이도와 연계된 파밍
- 장비 파밍을 통한 높은 난이도를 도전
- 보스급 적 처치, 클리어 보상, 랜덤 보상 패널을 통한 획득처


상점 시스템
- 장비 수집의 완화제
- 슬롯머신 애니메이션을 통한 뽑기효과
- 중복 장비 획득시 재화로 전환 (등급별 상이)
- 중복획득의 불쾌감 감소 및 뽑기의 재미 요소




무한모드 시스템
- 개방 조건 : 일반 모드 100 난이도 클리어 시 개방
- 규칙 :
- 최종 웨이브가 없으며, 웨이브마다 2분의 제한 시간이 주어집니다.
- 적이 최종 지점에 도달해도 죽지 않고 출발 지점으로 순환합니다.
- 제한 시간 내에 모든 적을 처치하면 웨이브 클리어입니다.
- 시간 내에 적을 모두 처치하지 못하면 남은 적 하나당 HP가 1씩 감소합니다.
- HP가 0이 되면 게임이 종료되고 최종 점수가 정산됩니다.
- 점수 및 순위표 :
- 클리어 점수, 맵 난이도 배율, 남은 시간을 합산하여 최종 점수가 결정됩니다.
- 최종 점수를 기준으로 상위 10명의 순위표(리더보드)에 등록할 수 있습니다.
- 특수 기능 : 데미지 분석 기능을 통해 타워별 데미지 기여도를 확인할 수 있습니다.




디자인
캐릭터
- 타워 및 몬스터 캐릭터 픽셀 아트 제작
- 타워 애니메이션 : 모든 타워의 대기(Idle) 및 공격(Attack) 애니메이션을 구현















아이콘
- 타워의 특수능력에 부합하는 스킬 아이콘 제작
- 동적인 상황의 경우 필요에따라 애니메이션으로 제작하거나 Unity에서 구현






맵(타일셋)
- 타워디펜스에 최적화된 경로를 가진 타일셋 제작
- 웨이브 시작 및 종료지점 제작
- 시각적인 요소를 추가해줄 꾸밈타일 제작




오브젝트
- 맵에 필요한 오브젝트
- 투사체와 같은 추가 디자인 요소


장비
- 수집용 장비 이미지 (일부)






















게임 음악
- 타이틀
- 초원 맵
- 눈 맵
- 사막 맵
- 마그마 맵
- 클리어