운빨 디펜스
완료유닛을 무작위로 뽑아 배치하는 타워 디펜스. 스타크래프트 유즈맵을 레퍼런스로 삼되, 원작의 우회 구현을 그대로 베끼지 않고 재설계했습니다.
2026.05
BACKGROUND
스타크래프트 유즈맵 "개인운빨디펜스"를 재미있게 했던 기억으로 시작했습니다. Unity로 먼저 붙잡았다가 2D 프로토타입에는 Godot이 더 빠르겠다고 판단해 엔진을 옮겼고, 이틀 만에 계획한 마일스톤을 전부 끝냈습니다.
WHAT I BUILT
이중 사각형 맵으로 사거리에 의미 부여
안쪽 사각형은 유닛 배치 영역, 바깥 띠는 적의 순환 경로로 나눴습니다. 사거리가 짧은 유닛은 경계에 붙여야만 적에 닿고, 긴 유닛은 안쪽 깊숙이 둘 수 있습니다. "사거리"라는 수치가 배치 판단으로 이어지게 만든 핵심 설계입니다.
경로를 웨이포인트 4개로 단순화
적이 사각형을 도는 움직임에 길찾기를 붙일 이유가 없다고 봤습니다. 코너 4개만 두고 다음 코너로 직선 이동하게 했더니 로직이 짧아지고 성능 여유도 생겼습니다.
뽑기 확률을 코드 밖으로 분리
등급별 가중치와 유닛 풀을 Godot Resource(.tres)로 뺐습니다. 밸런스를 만질 때 스크립트를 열 필요가 없어져서, 수치 조정과 로직 수정이 완전히 분리됐습니다.
레퍼런스를 그대로 베끼지 않기
원작은 확률 분포를 위해 Switch 11개로 2048분기를 만드는데, 이건 스타크래프트 트리거 시스템의 제약을 피하려는 우회책이었습니다. 제약이 없는 환경에서 그대로 옮기면 이유 없이 복잡한 코드가 됩니다. 가중치 테이블 한 장으로 대체했습니다.
선택 시스템을 독립 모듈로
드래그 박스와 Shift+클릭으로 만든 선택 목록을 SelectionManager로 분리했습니다. 합성·재배치·판매 같은 그룹 동작이 전부 같은 목록을 공유해서, 새 그룹 기능을 붙일 때 선택 로직을 다시 짜지 않았습니다.
WHAT I LEARNED
엔진을 바꾸는 결정이 늘 손해는 아니었습니다. 만들려는 것의 성격과 도구가 맞으면 진행 속도가 눈에 띄게 달라집니다.
레퍼런스의 구현에는 그 환경에서만 유효한 제약이 섞여 있습니다. 무엇이 설계이고 무엇이 우회인지 구분하는 게 모방보다 중요했습니다.
데이터를 코드에서 떼어내자 밸런싱이 "개발"이 아니라 "조정"이 됐습니다. 반복 주기가 짧아진 게 가장 큰 수확이었습니다.