타워 디펜스 게임 만들기 2편은 데브로그에 남겨놨지만 이것저것 삘 받아서 작업하다가 작업기간이 늘어나긴 했지만 좋은 경험치가 쌓였던것 같습니다. gpt, claude, gemini 다양하게 써보면서 자동화라던가 llm의 장담점을 익히는데 주점을 두다보니 오래걸렸네요.


[Unity 2D] 디펜스 게임 전장 확장 및 스크롤 카메라 구현기
💡 개발 환경 노트
- 문서 및 블로그 기획/작성:
Gemini 3.1 Pro- 핵심 로직 및 코딩 구현:
GPT-5.3-Codex,Claude Opus 4.6
현재 개발 중인 Kingdom Rush 스타일의 전략 디펜스 게임에서 중요한 결정을 내렸습니다. 기존에는 화면 크기(종횡비)에 맞춰 배경 이미지를 억지로 늘리고 줄여 고정된 하나의 뷰(화면) 안에서 모든 전투가 벌어지도록 설계했었는데요, 이번에 전장을 크게 키우고 자유롭게 카메라를 스크롤할 수 있도록 완전히 전환하는 작업을 진행했습니다.
📸 카메라 스크롤을 도입한 이유?
고정 뷰 방식은 아기자기한 모바일 게임에는 좋지만, 스테이지가 거듭될수록 맵의 크기나 타워 배치 구성이 단조로워지는 한계가 있었습니다. 넓은 전장을 구현하여 사용자가 직접 카메라를 이동시키며 전략적인 전황을 살피게 만드는 것이 훨씬 스케일이 큰 몰입감을 줄 수 있다고 판단했습니다.
따라서 다음과 같은 조작이 가능한 하이브리드 카메라를 구현하기로 했습니다:
- 마우스 드래그 (Mouse Drag): 우클릭 또는 휠 클릭으로 직관적인 패닝 이동
- 키보드 이동 (WASD): 클래식한 PC 방식의 쾌적한 이동
- 에지 스크롤 (Edge Scroll): 화면 끝으로 마우스를 가져가면 자동으로 밀려가는 방식
🛠️ 핵심 구현 요소
1. 부드러운 감속 (관성, Inertia)
카메라 조작 시 딱딱하게 끊기지 않고 부드러운 조작감을 주기 위해 Vector3.SmoothDamp와 커스텀 감속 로직을 활용했습니다. 마우스 드래그를 놓는 순간 입력 속력을 저장한 뒤 점차 0으로 줄여나가(Lerp) 빙판을 미끄러지듯 기분 좋은 이동(Juicy Feedback)을 적용했습니다.
2. 구역 이탈 방지 클램프 (Bounds Clamping)
전장이 아무리 넓다 해도, 배경 이미지 밖의 텅 빈 검은 화면은 몰입을 깹니다.
카메라의 뷰포트 크기를 계산하고 배경 스프라이트의 실제 크기(SpriteRenderer.bounds)와 정합하여 렌더링 영역 안에서만 카메라가 이동하도록 클램핑(Clamp) 했습니다.
💡 개발 팁:
처음엔 고정된Rect값을 수동으로 넣었는데, 이후 맵이 변경될 때마다 관리하기가 어려웠습니다.GameBattlefield오브젝트가 초기화될 때 배경 스프라이트의 Bounds 영역을 자동으로 계산해 반환하도록 속성(GameplayBounds)을 구성하여 자동화했습니다.
3. UI 조작 간섭 방지 (EventSystem)
마우스 클릭으로 타워를 업그레이드할 때 카메라가 스크롤되면 안 되겠죠?EventSystem.current.IsPointerOverGameObject()를 통해 UI 위에서 클릭이 시작되었을 때는 카메라 드래그 이벤트를 차단했습니다. (물론 WASD 이동은 전투 중에도 언제든 조작할 수 있도록 예외처리했습니다.)
🐞 트러블슈팅: 영웅만 소인국 사람이 되다? (Scale Mismatch)
이번 작업에서 가장 골치 아팠던(그리고 재밌었던) 버그입니다. 전장이 넓어지니 기존 영웅 캐릭터가 상대적으로 너무 작게 출력되는 문제가 발생했습니다. 배경은 장대한데, 디펜스의 꽃인 영웅이 개미처럼 작아 보였죠.
원인 분석:GameBattlefield 프리팹 자체가 전체 스케일업을 위해 루트 Transform의 localScale 값으로 (2, 2, 1)을 가지고 있었습니다. 타워나 적 몬스터들은 모두 ఈ 프리팹 하위(Child)에 스폰되니 자연스럽게 2배 스케일을 상속받았지만...
영웅 컨트롤러는 GameScene에서 World Root 레벨(최상위)에 둥그러니 스폰되고 있었기 때문에 원래 크기인 (1, 1, 1)로 표시되었던 것입니다. 화면과 적들은 2배인데, 영웅 혼자 정사이즈니 작아 보일 수밖에 없었죠.
해결 방안:
- Hierarchical Parenting (계층 구조 정합): 영웅도 전장의 환경 요소를 따르도록 구조를 개선했습니다.
GameBattlefield에heroRoot라는 컨테이너를 하나 파두고, 영웅이 맵에 생성될 때 해당 Root 하위로SetParent시켰습니다. - 즉석에서
Vector3사이즈를 수동으로 1.5배, 2배 곱해주는 코딩은 나중에 큰 기술 부채가 될 수 있어 피하고, 가상공간(부모 객체)의 스케일을 자연스럽게 상속받도록 설계했습니다.
// GameScene.cs - Hero 스폰 로직 중
_heroController = new GameObject("HeroController").AddComponent<HeroController>();
// 핵심: 영웅을 생성한 후, 2배 스케일을 가진 HeroRoot의 자식으로 배치!
_heroController.transform.SetParent(_battlefield.HeroRoot, false);
개발 과정에서 궁금하신 점이 있다면 언제든 댓글 남겨주세요!
'AI > Unity' 카테고리의 다른 글
| [Unity] 타워디펜스 맵 & 웨이브 에디터 (0) | 2026.03.02 |
|---|---|
| 타워 디펜스 만들기 - 맵 이미지 프롬프트 (1) | 2026.03.01 |
| Codex/Antigravity 타워 디펜스 만들기 - 애니메이션 툴(스프라이트시트/타워) (0) | 2026.02.23 |
| Codex/Antigravity 타워 디펜스 만들기 - 애니메이션 툴(스프라이트시트) (0) | 2026.02.22 |
| Antigravity를 사용하여 타워 디펜스 게임 만들기 - 1 (1) | 2026.02.13 |