도시는 왜 중앙에서만 커지면 안 될까

빈 땅보다 도시에서 시작하도록
성장하는 도시의 시작 화면을 빈 지도에서 건물이 채워진 도시로 바꿨습니다. 처음부터 공격할 대상과 도로가 보여야 도시를 관찰하고 폭격하는 기본 흐름을 바로 시험할 수 있기 때문입니다. 시작 시 96칸을 채우되, 초기 건설에는 골드나 파괴 점수를 주지 않도록 했습니다.
독립 시뮬레이션에서는 기본 시드와 조합 규칙으로 건물 82개와 진화 14회가 나왔습니다. 여기서 96은 건물 개수가 아니라 점유한 칸 수입니다. 건물이 합쳐지는 규칙이 있으므로 두 수를 구분해야 합니다.

위 이미지는 별도 공개 빌드의 도시 전경입니다. 이 작업의 초기 배치와 성장 규칙을 검증한 전후 화면은 아닙니다.
중심에서 가까운 순서 대신 여러 가장자리로
성장 주기마다 최대 4칸을 추가합니다. 기존 도시와 연결된 가장자리 중 주변 밀도와 같은 묶음 안의 분산을 고려해 위치를 고릅니다. 중심과 가까운 칸부터 채우는 방식에서 벗어나면서도 도로와 도시가 끊어지지 않도록 한 변경입니다.
기본 지도는 24×24칸으로 제한했습니다. 가득 차면 외곽 확장은 멈추지만, 폭격으로 비운 곳의 지연 재건은 이어집니다. 576칸은 실제 성능 측정으로 확정한 최적값이 아니라 초기 플레이를 위한 설정입니다.
후반에는 재건되는 건물도 달라집니다
시간이 흐르면 높은 단계의 건물이 신축과 재건에 더 자주 등장하도록 했습니다. 300초 이후 일반 건물 추첨은 3레벨 75%, 2레벨 20%, 기본 단계 5%입니다. 특수 건물은 별도 규칙을 유지합니다. 같은 지도를 계속 파괴하고 복구하는 후반에도 건물 구성이 달라지도록 한 부분입니다.
규칙 검증과 실제 화면 확인을 구분했습니다
독립 시나리오 233개에서 초기 보상 0, 가장자리 연결, 중복 배치 방지, 지도 경계, 파괴 후 재건 등을 확인했습니다. Unity 설치 참조를 사용한 컴파일과 씬 참조 검사도 통과했습니다.
다만 이 기록에서는 실제 Unity Play를 실행하지 않았습니다. 초기 카메라가 도시를 잘 담는지, 네 칸이 함께 나타날 때 자연스러운지, 지도 끝과 후반 성장의 성능·밸런스가 적절한지는 별도 확인이 필요합니다. 규칙을 검사한 결과를 플레이 품질 검증으로 넓혀 말하지 않겠습니다.
지도 경계와 건물 수를 따로 보는 이유
점유한 칸 수와 화면에 그리는 건물 수를 분리하면 합쳐진 건물도 같은 지도의 일부로 다룰 수 있습니다. 큰 건물이 여러 칸을 차지하더라도 지도 밖으로 나가지 않아야 하고, 파괴한 뒤에는 비워진 칸을 다시 복구할 수 있어야 합니다. 지도 크기 제한을 카메라 밖이라는 시각적 기준에 맡기지 않고 좌표 조건으로 두는 이유입니다.
편집 시 확인한 공개 소스의 CitySimulation.InsideMap은 다음과 같습니다. 읽기 쉽게 줄바꿈만 정리했으며, 당시 수정본 자체가 아닌 현재 공개 커밋의 구현입니다.
public bool InsideMap(Cell c) =>
MapSize <= 0 ||
(c.X >= -MapSize / 2 && c.X < -MapSize / 2 + MapSize &&
c.Z >= -MapSize / 2 && c.Z < -MapSize / 2 + MapSize);
MapSize가 24이면 X와 Z는 -12 이상 12 미만입니다. 상한을 포함하지 않으므로 한 축에 정확히 24칸이 들어갑니다. 원점 주변에서 도시를 키울 때 음수 좌표와 양수 좌표의 경계가 같은 기준으로 검사됩니다. 실제 건설 가능 여부에는 이 경계뿐 아니라 이미 점유한 칸과 재건 대기 상태도 함께 영향을 줍니다.
미로


댓글
이 글에 대한 생각을 남겨 주세요.