이번 학기 수업에서 한달이 조금 넘는 시간 동안 간단한 게임을 만들고 발표해보는 시간을 가졌다. 따라서 나는 내가 만들고자 하는 게임의 가장 축약된 버전, 이른바 버전 0을 제작하고 발표하였다. 이번 글에서는 이에 대해 자세히 설명해보고자 한다.
1. 시작 화면
게임의 시작 화면은 다음과 같다.
제목을 아직 정하지 못해서 Unnamed Defense라 하였다. 제목과 함께 이전의 하이 스코어가 기록되게 하였고, 시작 버튼을 누르면 시작할 수 있다.
2. 웨이브 이전: 방어진형 설계
시작 버튼을 누르면 다음과 같은 화면이 나타난다.
저 황토색 땅에 아래 카테고리의 아이템들을 설치하여 방어진형을 설계할 수 있다.
아래 카테고리는 다음과 같이 구성되어 있다.
1) Towers
순서대로 석궁, 대포, 박격포, 마법사 타워이다. 클래시 오브 클랜을 레퍼런스로 공격 범위나 데미지 등에 차이를 두었다.
2) Walls
벽의 배치를 통해 타워를 방어하거나 적들을 원하는 곳으로 유도할 수 있어 전략에 가장 핵심적인 수단이라고 할 수 있다.
3) Traps
뿔 함정, 덫, 폭탄 함정이다. 뿔 함정은 적이 지나갈 때마다 데미지를 주며, 3번 작동하면 파괴된다. 덫은 적이 지나가면 적에게 데미지를 주고 일정 시간 붙잡는다. 폭탄 함정은 적이 지나가면 터지며 범위 공격을 한다.
4) Units
유닛을 선택하고 자리를 지정하면 해당 자리에 머무른다. 유닛으로부터 일정 범위 안에 적이 들어오면 적과 싸우고, 싸움이 끝나면 다시 처음 지정된 자리로 돌아간다. 체력, 공격 범위, 공격 속도, 데미지에 차이를 두어 두 유닛을 만들어보았다.
5) Repair
코인을 소모하여 성벽의 HP를 회복할 수 있다. 일정 코인을 내고 5%를 회복할 수 있고, 이에 맞게 계산된 코인으로 HP를 최대로 회복할 수 있다.
아이템을 설치하거나 설치된 아이템을 클릭할 경우 HP, 공격 범위가 표시되며, 남은 HP에 비례하여 제 값을 돌려받고 지울 수 있다.
적은 기본적으로 위에서 나타나 구조물을 피해가며 성벽에 도달하기 때문에, 이를 고려하여 다음과 같은 배치를 해볼 수 있을 것이다.
위와 같이 배치한다면 적이 하나의 좁고 긴 길을 지나게 되어 효과적으로 공격할 수 있고, 적이 성벽에 도달하는 시간도 늦출 수 있을 것이다.
3. 웨이브 중
웨이브 중에는 적들이 위에서 나타나 아래로 움직여 성벽을 공격하고, 플레이어는 유닛만을 출동시킬 수 있다. 유닛의 자리를 지정하면 성벽 가운데에서 나타나 해당 자리로 이동하며, 이동 중에도 적이 범위 안에 들어오면 적과 싸운다.
적의 종류는 위 플레이 화면에서 볼 수 있듯 다음의 두 가지 타입을 만들어봤다.
Type 1)
위에서 볼 수 있는 초록색의 작은 몹이다. 타워를 포함한 구조물을 피해가며 성벽에 도달한다.
Type 2)
위에서 볼 수 있는 청록색의 큰 몹이다. 클래시오브클랜의 자이언트처럼 타워를 우선 공격하고, 타워가 없으면 성벽으로 향한다.
4. 플레이 영상
모바일 게임이지만 빠른 녹화를 위해 컴퓨터로 빌드해서 플레이한 영상이다.
https://www.youtube.com/watch?v=zlTVKay16I0
5. 느낀 점
1) 프로그래밍은 감각적이다.
객체 지향에 대해 깊은 공부를 하기 전에는 프로그래밍이 막연한 감이 있었다. 내가 어느 지점에 와있는지, 어디로 어떻게 가야 하는 지에 대한 확신이 없었다.
SOLID와 디자인 패턴은 나에게 가려져 있던 여러 길을 보이게 했다. 여러 옵션이 자연스레 생각나고, 그 중 하나를 골라가며 프로그래밍을 진행하면 프로그램이 완성되어 간다. 재밌는 것은 프로그래밍을 할 수록 그 길을 따라가면 어떻게 될지 어느 정도 그려진다는 것이다. 그렇게 선택한 길을 따라가다가, 이 길이 잘못된 길임을 느낄 때면 다시 되돌아가곤 했다.
이러한 감각이 키워지는 것이 직접적으로 느껴졌고, 이것이 프로그래밍이 마치 게임을 하는 것처럼 재밌어진 계기가 되었다.
2) 디자인 패턴을 적극 활용하자.
디자인 패턴은 정말.. 클린 코딩의 끝판왕이다.
나는 프로젝트에서 적과 유닛의 행동을 제어하는 데 스테이트 패턴을, 투사체, 적 및 유닛의 생성과 파괴를 다루는 데 오브젝트 풀 패턴을, 구조물, 적 및 유닛, 성벽의 hp를 다루는 데 MVP 패턴을 사용하였고, 이들은 클린 코딩에 굉장히 큰 도움이 되었다. 특히 그 중 스테이트 패턴을 정말 잘 써먹었는데, 패턴에 따라 각 스테이트 별로 코드를 분리하여 유지 보수성과 가독성을 높일 수 있었고, 스테이트 다이어그램과도 직관적으로 상통하여 코드를 짜기도 수월했다.
가령 다음은 Type 2 적의 행동에 해당하는 스테이트 다이어그램과 실제 사용한 코드들이다.
이렇듯 천재들이 정립해놓은 디자인 패턴을 도입하여 클린 코딩에 많은 도움을 받을 수 있다. 하지만 디자인 패턴을 도입하는 것이 항상 이점을 가져오는 것은 아니다. 가령 프로젝트에서 코인은 hp처럼 여러 곳에 쓰이는 것이 아니라 한 곳에 쓰이는데, 이에 MVP 패턴을 적용하였다가 불필요한 구조를 도입했다고 느껴 다시 철회하였다.
여기서 위 1)을 조금 구체화해보면, SOLID나 이러한 디자인 패턴을 적용할 지 말지, 어떤 것을 적용할 지가 여러 옵션들이 될 수 있겠다. 어떤 옵션을 선택할 지에는 융통성을 포함한 감각적인 무언가가 필요한 듯 하다.
3) 클래스를 추가하는 것을 망설이지 말자.
이전에는 올인원이 좋은 코딩이라 생각해 한 클래스에 많은 기능을 추가하곤 했지만, 이는 유지 보수성과 가독성을 낮춘다는 것을 몸소 경험하였다. 이번 프로젝트에서는 클래스를 추가하는 것을 망설이지 않았는데, 이것이 클린 코딩의 밑바탕이 되어 준 것 같다.
어떤 기능이나 로직을 추가할 때 클래스를 추가하는 것은 SOLID의 단일 책임 원칙을 따르는 것이며, 이러한 방향으로 코딩하는 것은 곧 확장성을 추구하는 것이라는 점에서 개방-폐쇄 원칙을 간접적으로 따르는 것이라고 생각된다.
4) 상속(인터페이스 포함)은 클린 코딩의 핵심이다!
인터페이스를 포함한 상속은 클린 코딩의 핵심 요소이다. 코딩이 지저분해질 때 상속을 도입하면 웬만한 문제는 해결되었다. 실제로 상속은 SOLID의 대부분의 원칙에 크게 기여하는 요소이다.
5) 미리 클래스를 설계하는 것이 큰 의미가 있을까?
이전에 VR 게임을 만드는 팀 프로젝트를 하면서 프로그래밍의 분업에 어려움을 느꼈고, 클래스 설계를 잘 해놓았다면 분업이 쉽지 않았을까라는 회고를 하였다. 따라서 이번 프로젝트에선 코딩을 하기 전 클래스 다이어그램을 그려 클래스를 어느 정도 설계해보았다. 하지만 이후 실제 프로그래밍을 하면서 클래스 구조가 처음 설계한 구조에서 계속 달라졌고, 클래스 다이어그램은 복잡해 그리기 어려워져 어느 순간부터 따로 설계 없이 프로그래밍을 하고 있었다. 그럼에도 나름 클린 코딩에 신경써서인지 유지 보수와 확장에 어려움을 느끼진 못했으나, 이런 식의 프로그래밍이 나중에 팀으로 작업을 할 때 문제가 생기진 않을까싶은 생각을 한다.
6. TO DO LIST
6.1 small
1) 타워가 적의 중심을 향해 공격하도록 고치기
적의 좌표가 적의 발 기준이라 타워가 적의 발을 향해 공격해 이상하다. 적의 중심을 향하도록 고치는 것이 자연스러울 것 이다.
2) 밸런싱
이 게임의 핵심은 단순히 타워나 유닛의 강화보다 벽을 활용하여 적의 이동을 설계하는 전략을 세우는 것이라고 생각되어, 이를 유도하기 위해 벽이나 함정의 가격을 비교적 싼 가격으로 설정해놓았는데, 생각보다 벽의 배치에 따라 양상이 크게 달라져 밸런싱이 필요할 것 같다.
6.2 BIG
1) 업그레이드 기능 추가
설치된 아이템을 업그레이드할 수 있는 기능을 간단하게라도 구현하려고 한다.
2) 스테이지 방식으로 변경
기존에 스코어를 기록하는 방식을 생각하고 만들었으나 스테이지 방식이 더 적합할 것이란 생각이 들었다. 매번 같은 웨이브 구성으로 진행되는 스코어 방식보단 스테이지 방식에서 각 스테이지에 맞는 전략을 구사하는 재미가 있을 것이다. 스코어 방식도 다른 모드로써 남겨두면 좋을 것 같다.
'Unity > 개발일지' 카테고리의 다른 글
[모바일 디펜스 게임] #0. 시작과 기획 (1) | 2024.06.09 |
---|