고등학교 프로젝트 회고

고등학교 때는 이것저것 정말 많이 만들었다.

게임을 만들기도 했고, 프로그램을 만들기도 했다. 제대로 끝낸 것도 있고 중간에 멈춘 것도 있다. 지금 보면 코드도 엉망이고 디자인도 부족한 프로젝트가 많다.

그래도 이때 여러 가지를 직접 만들어본 경험이 지금까지 게임 개발을 계속하는 데 꽤 큰 영향을 줬다.

당시에는 그냥 만들고 싶어서 만든 경우가 많았다. 어떤 기술을 공부해야겠다는 생각보다는 “이거 한번 만들어볼까?”에서 시작한 프로젝트가 대부분이었다.

Juggling Defense

고등학교 1학년 때 만든 스타크래프트 팬게임이다.

테란 진영에서 계속 전진해 오는 저글링들을 막는 디펜스 게임이었다. 일꾼을 뽑아서 미네랄을 더 캘지, 아군을 만들어서 막을지, 버프를 골라서 강화할지, 스킬을 사용할지 선택하면서 버티는 방식이었다.

마지막에는 해처리를 부수면 이기는 구조였고 5스테이지까지 만들었다.

HTML, CSS, JavaScript로 만들었는데 지금 생각하면 굉장히 단순한 게임이었다. 적도 그냥 일자로 계속 들어오게 만들었다.

그래서 당시에는 물리엔진 같은 것도 필요 없었다. 적의 이동과 충돌도 상당히 단순하게 처리했던 걸로 기억한다.

오히려 만들면서 시간을 많이 쓴 건 레벨 디자인이었다.

처음에는 그냥 적을 많이 나오게 하면 어려워질 거라고 생각했는데 그렇게 하면 재미가 없었다. 적이 너무 빨리 나오면 그냥 막을 수가 없고, 반대로 너무 천천히 나오면 할 게 없었다.

그래서 적이 나오는 양이나 속도, 플레이어가 돈을 모으는 속도 같은 것을 계속 조절했다.

스킬이나 버프도 넣어놓고 보니 너무 강하거나 쓸 이유가 없는 것들이 생겼다. 결국 숫자를 계속 바꾸면서 플레이해보고 다시 수정하는 식으로 맞췄다.

스킬 모션이랑 기본적인 레벨 디자인까지 어느 정도 만든 뒤 여기서 개발을 끝냈다.

그런데 생각보다 주변 친구들이 많이 플레이했다.

이때 처음으로 내가 만든 게임을 다른 사람이 직접 플레이하는 걸 제대로 봤던 것 같다. 내가 재미있다고 생각해서 넣은 기능보다 그냥 적을 막고 돈을 모으는 부분을 더 재미있어하는 친구도 있었고, 반대로 내가 별거 아니라고 생각했던 부분에서 불편하다는 이야기도 나왔다.

지금 생각하면 작은 게임이었지만 레벨 디자인을 직접 해본 첫 경험이라 기억에 많이 남는다.

Unintend

고등학교 1학년부터 2학년까지 만들었던 1인칭 공포게임이다.

2인 개발로 진행했다.

이 프로젝트에서는 모델링부터 맵 제작, 스크립팅, UI, 애니메이션까지 게임 개발에서 할 수 있는 건 거의 다 건드려봤다.

처음에는 그냥 게임을 만들면 되는 줄 알았는데 실제로 해보니까 하나를 수정하면 다른 쪽에서 문제가 생기는 경우가 많았다.

맵을 수정했더니 기존에 만들어놓은 기능이 이상해지기도 했고, 모델이나 애니메이션을 바꾸면서 스크립트 쪽도 같이 수정해야 하는 경우가 있었다.

당시에는 지금처럼 개발 경험이 많지 않아서 문제가 생기면 그냥 하나씩 뜯어보면서 해결했다. 어디서 문제가 생겼는지 찾고, 코드를 바꿔보고, 안 되면 다시 원래대로 돌리고 다른 방법을 찾는 식이었다.

지금 생각하면 상당히 비효율적인 방법이었지만 당시에는 그렇게 하나씩 해결하는 것 자체가 공부였다.

이 프로젝트로 GIGDC 고등부에서 금상을 받았다.

상을 받은 것도 기뻤지만 그걸 계기로 게임과 관련된 여러 프로그램에 참여할 수 있었던 게 더 기억에 남는다. 다른 사람들에게 게임을 보여주고 이야기를 들을 기회도 많아졌다.

모바일 버전도 한번 만들어봤다.

그런데 모바일에서 돌려보니까 생각보다 너무 무거웠다. 당시 모바일 기기 성능을 제대로 고려하지 않고 PC 기준으로 게임을 만들었기 때문에 실제 기기에서는 제대로 돌아가지 않았다.

그때 처음으로 “PC에서 돌아간다”와 “게임으로 실제 사용할 수 있다”가 같은 말이 아니라는 걸 느꼈다.

Ninja of Shadow

고등학교 2학년 때 만들었던 횡스크롤 게임이다.

고군분투를 보고 생각해낸 게임이다.

조작 방식이 조금 특이했다. 오른쪽에서 에임을 조작하고 왼쪽에서는 점프나 로프, 스킬을 사용하는 방식이었다.

기획부터 디자인, 개발까지 혼자 했다.

처음부터 기존 횡스크롤 게임처럼 만들 생각은 없었다. 어떻게 조작하면 재미있을까 생각하다가 지금의 방식을 넣었다.

그런데 막상 만들어보니 조작 방식이 특이한 만큼 익숙해지는 데 시간이 걸렸다. 내가 만들고 있는 입장에서는 조작법을 이미 알고 있으니까 별로 어렵지 않았는데 다른 사람이 해보면 처음에 뭘 눌러야 하는지 헷갈렸다.

그래서 조작 관련 UI를 계속 수정했던 기억이 난다.

결국 플레이어가 알고 있는 것과 처음 보는 사람이 알고 있는 것은 다르다는 걸 이때 좀 느꼈다.

이 게임은 실제로 플레이 스토어에 출시까지 했다.

IAP도 연동했다.

출시하고 나면 사람들이 알아서 플레이할 줄 알았는데 당연히 그렇지는 않았다.

홍보를 거의 하지 않았으니 게임이 있는지도 모르는 사람이 대부분이었다.

결과적으로 잘되지는 않았다.

그래도 개인적으로는 꽤 의미 있는 경험이었다. 내가 만든 게임을 실제 스토어에 올려보고, 결제 시스템까지 연결해봤다는 것 자체가 당시에는 상당히 재미있었다.

Fake Kiosk

고등학교 2학년 때 만들었던 가짜 키오스크 프로그램이다.

햄버거 매장의 메뉴를 주문하고 관리할 수 있는 프로그램이었다.

WPF와 Prism을 사용했고 MVVM 패턴으로 만들었다. 데이터는 SQLite를 사용했다.

2인 프로젝트였는데 한 명이 프로젝트에 제대로 참여하지 못해서 사실상 혼자 만들었던 기억이 있다.

게임만 만들다가 이런 프로그램을 만들어보니까 또 느낌이 달랐다.

특히 MVVM을 처음 적용하면서 처음에는 왜 굳이 이렇게 나눠서 만들어야 하는지 잘 이해하지 못했다. 그냥 버튼 누르면 코드 실행시키면 되는 것 아닌가 싶었다.

그런데 기능이 늘어나니까 화면 코드에 이것저것 다 들어가는 것보다 역할을 나눠놓는 편이 관리하기 편했다.

당시에는 패턴을 제대로 이해하고 쓴 것보다는 직접 만들면서 필요성을 느꼈던 쪽에 가까웠다.

Team Builder

고등학교 2학년 때 만든 팀 빌딩 프로그램이다.

사람 명단을 입력하고 여러 팀으로 나눌 수 있도록 만들었다.

해커톤이나 팀 대회 같은 곳에서 사용할 수 있으면 좋겠다고 생각해서 만들었다.

이것도 WPF와 Prism, MVVM을 사용했고 SQLite로 데이터를 관리했다.

가장 기억에 남는 건 드래그 앤 드롭이다.

사람을 한 팀에서 다른 팀으로 끌어서 옮기게 만들려고 했는데 생각보다 잘 안 됐다.

마우스가 어디에 있는지, 지금 드래그 중인지, 어떤 항목을 잡고 있는지 등을 따로 처리해야 했다.

당시에는 드래그 앤 드롭이라는 기능 자체를 별로 어렵게 생각하지 않았는데 직접 만들어보니까 UI는 그냥 화면에 보이는 것만 처리하면 되는 게 아니었다.

사용자가 어떤 행동을 하고 있는지를 상태로 나눠서 생각해야 했다.

이때 UI 이벤트 처리에 대해서도 조금 더 생각하게 됐다.

Script Finder

고등학교 2학년 때 만든 프로그램이다.

당시 미국 드라마를 재미있게 보고 있었는데 스크립트에서 특정 단어를 찾아서 어느 에피소드에 나오는지 확인하고 싶었다.

그래서 그냥 프로그램을 하나 만들었다.

드라마 스크립트 데이터를 쭉 읽고 특정 단어를 검색해서 해당 단어가 들어간 에피소드를 찾아주는 프로그램이었다.

굉장히 단순한 프로그램이었지만 개인적으로 필요한 일이 있어서 만든 프로그램이라 기억에 남는다.

사람이 직접 찾으면 귀찮은 일을 프로그램으로 넘겨버리면 된다는 걸 체감한 프로젝트이기도 했다.

지금도 개인적으로 뭔가 반복해서 해야 하는 일이 있으면 프로그램으로 해결할 수 있는지 먼저 생각하는 편인데, 이런 습관이 이때부터 있었던 것 같다.

Inabit

고등학교 2학년 때 해커톤에서 만들었던 SNS 프로그램이다.

4인 팀이었는데 실제 개발은 2명이 했던 것으로 기억한다.

WPF로 SNS 형태의 프로그램을 만들었고 당시에는 프론트엔드를 담당했다.

백엔드는 제대로 따로 만들지는 않았고 클라이언트에서 처리하는 식으로 마무리했던 것 같다.

지금 보면 구조적으로 좋은 방법은 아니었지만 당시에는 WPF로 웹 페이지 같은 화면을 만들 수 있다는 것 자체가 재미있었다.

게임만 만들다가 이런 형태의 프로그램을 만들어보면서 UI를 만드는 것에도 관심이 생겼다.

JSP SNS

고등학교 2학년 때 과제로 만든 SNS다.

JSP로 만들었고 기능은 거의 다 구현했다.

결과적으로 과제에서는 만점을 받았다.

다만 디자인은 지금 봐도 별로다.

당시에는 기능 구현만 제대로 되면 된다고 생각했고 UI 디자인에는 별로 관심이 없었다. 그래서 기능은 멀쩡하게 돌아가는데 화면은 상당히 이상했다.

친구들이 녹조라떼 페이지라고 놀렸던 기억도 난다.

그런데 이게 오히려 디자인에 관심을 가지게 된 계기가 됐다.

다른 사람들에게 보여주면서 디자인에 대한 피드백을 받고 나니까 “기능만 잘 만들면 되는 게 아니구나”라는 생각이 들었다.

그 뒤로는 UI 디자인도 잘하고 싶다는 욕심이 생겼고 실제로 디자인을 따로 공부하기도 했다.

지금 내가 게임을 만들 때 디자인까지 직접 신경 쓰는 데에는 이런 경험도 영향을 줬다고 생각한다.

Beat Shooter

고등학교 2학년 때 강의를 보고 따라 만들었던 리듬게임이다.

Java와 Swing을 사용했다.

처음에는 그냥 강의를 따라 만들었는데 어느 정도 만들어지고 나니까 그대로 두기가 아쉬웠다.

그래서 내가 당시 즐겨 듣던 노래를 기준으로 노트를 직접 찍기도 하고, 자동으로 노트가 나오도록 만드는 기능도 넣었다.

강의를 따라가는 것과 내가 원하는 기능을 추가하는 것은 꽤 달랐다.

강의에서는 이미 답이 정해져 있었는데 내가 바꾸려고 하니까 기존 코드가 왜 그렇게 작성되어 있는지부터 봐야 했다.

이때부터 튜토리얼을 그대로 따라 만드는 것보다 일단 돌아가는 걸 만들어놓고 이것저것 뜯어고치는 게 재미있었다.

Dota Void

고등학교 2학년 때 만들었던 게임이다.

우주선을 타고 날아가면서 운석을 피하는 게임이었다.

화면을 터치하면 시간이 느려지고 그 사이에 빠르게 내려오는 운석을 피하는 방식이었다.

지금 보면 상당히 단순한 게임이다.

그래도 당시에는 게임의 속도를 직접 조절하는 부분을 만들어보는 게 재미있었다.

평소에는 정상적으로 움직이다가 특정 입력이 들어오면 전체적인 시간이 느려지는 것처럼 보이게 만들어야 했다.

작은 프로젝트였지만 게임에서 시간이라는 것을 어떻게 처리할지 생각해볼 수 있었던 프로젝트였다.

Dotunit

고등학교 2학년 때 만들었던 퍼즐 게임이다.

직접 도트를 찍어서 게임에 들어갈 오브젝트를 만들었다.

오브젝트를 잡아서 옮길 수 있게 만들고, 테트리스처럼 오브젝트를 조합해서 퍼즐을 해결하는 게임을 생각했다.

기본적인 게임 시스템은 어느 정도 만들었다.

문제는 그 다음이었다.

게임 시스템을 만들고 나니까 이제 레벨을 만들어야 했는데 당시 다른 일들이 너무 많아서 거기까지 진행하지 못했다.

결국 시스템만 있고 제대로 플레이할 콘텐츠는 없는 상태로 끝났다.

지금 생각하면 게임은 시스템만 만든다고 끝나는 게 아니었다.

그때는 새로운 기능을 하나 더 만드는 게 게임을 발전시키는 것처럼 느껴졌는데, 실제로는 만들어놓은 시스템을 가지고 플레이할 수 있는 콘텐츠를 만드는 것도 똑같이 중요했다.

Memory Card

고등학교 3학년 때 만든 카드 짝 맞추기 게임이다.

짧은 기간 안에 만들어야 하는 과제 프로젝트라서 다른 프로젝트보다 집중해서 만들었던 기억이 난다.

시간이 많지 않았기 때문에 일단 필요한 기능부터 만들고 남은 시간에 정리하는 방식으로 진행했다.

결과적으로 정해진 시간 안에 완성할 수 있었다.

이때는 프로젝트를 크게 만드는 것보다 주어진 시간 안에서 어디까지 만들 수 있는지를 판단하는 게 중요하다는 것을 조금씩 알게 됐다.

Space Shooter / Street Fighter

고등학교 3학년 때 기능반에서 DirectX 9로 만들었던 슈팅 게임과 액션 게임이다.

이때가 게임 엔진을 직접 만들어보는 재미를 알게 된 시기였다.

기능반에서 제공해준 리소스를 이용해서 연습작 형태로 만들었고, 직접 2D 게임엔진을 만든 다음 그 위에서 게임을 구현했다.

렌더링부터 게임 오브젝트 처리, 입력 처리 같은 것들을 직접 구성했다.

당시에는 엔진을 만든다고 해도 제대로 된 엔진을 만든 것은 아니었다. 필요한 기능이 생기면 그때그때 추가하는 식이었다.

물리도 마찬가지였다.

완벽한 2D Physics Engine을 만든 것은 아니고 필요한 부분에 공식을 넣어서 움직임이나 충돌을 처리했다.

지금 다시 만들라고 하면 구조부터 완전히 다르게 만들 것 같다.

그래도 당시에는 직접 만든 엔진에서 게임이 돌아가는 것 자체가 굉장히 재미있었다.

게임을 만드는 것뿐만 아니라 게임이 돌아가기 위한 기반 자체를 만들어보면서 엔진이 제공하는 기능들이 내부적으로 어떤 역할을 하는지 조금씩 관심을 가지게 됐다.

이때 만들었던 연습작이 몇 개 더 있었는데 지금은 자료를 찾지 못하고 있다.

마무리

지금 다시 보면 고등학교 때 만든 프로젝트들은 대부분 부족하다.

완성하지 못한 것도 있고, 지금 기준으로 보면 구조가 별로인 것도 많다. 디자인이 부족했던 프로젝트도 있었고, 성능을 제대로 생각하지 않고 만든 것도 있었다.

그런데 그게 오히려 좋았던 것 같다.

처음부터 잘 만들지는 못했지만 계속 만들면서 하나씩 문제가 생겼고, 그때마다 해결하는 과정을 반복했다.

게임이 재미없으면 수치를 바꿔봤고, UI가 이상하면 직접 다시 만들었다. 프로그램 구조가 복잡해지면 코드를 나눠봤고, 기능이 제대로 동작하지 않으면 원인을 찾아가면서 수정했다.

당시에는 이것을 개발 공부라고 생각하지 않았다.

그냥 만들고 싶어서 만들었다.

지금 와서 돌아보니 그 과정에서 게임 개발에 필요한 것들을 하나씩 배운 셈이다.

무엇보다 여러 프로젝트를 만들면서 내가 뭘 좋아하는지도 알게 됐다.

게임 자체를 만드는 것도 좋아했지만 게임 시스템을 설계하는 것도 재미있었고, 직접 엔진을 만드는 것도 재미있었다. UI를 만드는 것도 재미있었고, 디자인을 직접 해보는 것도 재미있었다.

그래서 지금까지도 게임 개발에서 프로그래밍만 하고 끝내기보다는 기획이나 디자인, 아트까지 직접 만져보는 것을 좋아하는 것 같다.

고등학교 때는 그냥 재미있어서 만들었다.

지금은 개발자가 되어 다시 만들고 있다.

돌아보면 이때 했던 수많은 작은 프로젝트들이 지금의 개발 방식을 만든 기반에 가까웠던 것 같다.