[팀 프로젝트 포트폴리오] Crazy Squid (우수작 2등)

설치 없이 플레이

 

Crazy Squid by susoooooo

Action

susoooooo.itch.io

 

https://www.youtube.com/watch?v=F3Szixj1mHg

프로젝트 개요

  • 게임 제목 : Carzy Suqid
  • 개발 기간 : 1학년/9/22 ~ 1학년/11/24
  • 플랫폼 : PC
  • 장르 / 플레이 방식 : 액션 / 스페이스바로 헤엄치고, 우클릭으로 대시하며, 좌클릭으로 회전 공격을 합니다. 이 이상의 설명은 필요 없는 타격감 넘치는 액션 게임입니다.
  • 팀 구성 : 같은 반에서 팀장이 원하는 팀원을 한 명 뽑고, 랜덤으로 2명을 뽑아서 총 4명이 한 개의 팀으로 구성되었습니다. 팀원은 전부 개발자입니다.
  • 내 역할 : 플레이어, 폴리싱, 튜토리얼, UI
  • 사용 툴 / 언어  / 기타 도구 : Unity / C#

기획 의도 / 게임 컨셉

  • 게임을 만들게 된 동기 : 실크송이라는 게임을 보고 타격감 넘치는 게임을 만들고 싶었고, 게임의 핵심적인 부분을 공격과 회피를 수행할 수 있는 대시로 하여 본분에 충실한 액션 게임을 만들면 재밌지 않을까 싶어서 이 게임을 구상하게 되었습니다. 대시가 중심이기 때문에 플레이어는 모든 방향으로 움직일 수 있어야 하는데, 그럼 공중과 바다 또는 탑 뷰에서 움직어야 했고, 탑 뷰는 이미 전 프로젝트에서 했으며 액션 게임과는 맞지 않을 거라고 생각하여 비교적 에셋을 찾기 쉬운 바다를 배경으로 게임을 제작하게 되었습니다.
  • 핵심 아이디어 : 액션 게임의 본질인 때리고 피하는 행동에서 즉각적으로 나오는 재미가 핵심 재미이고, 부가적으로는 플레이어가 실력을 키워 나가며 더 높은 난이도의 스테이지를 클리어하거나 돈을 모아 스킨을 샀을 때 나오는 성취감 또한 게임에 쉽게 질리지 않고 지속적인 재미를 느낄 수 있는 재미 요소입니다.
  • 차별점 : 게임의 배경이나 플레이어의 조작에서 나오는 움직임이  액션 게임의 본질을 해치지 않는 게임을 개발해 보고 싶었기 때문에 굳이 장르를 비틀어서 신박한 게임을 만들기보다는 액션 게임에서 나오는 본연의 재미에 집중하여 게임을 개발하였습니다.
  • 타깃 유저 : 게임 마이스터고 학생들, 선생님

개발 내용 및 구현

  • 게임 흐름 설명 : 게임을 시작하면 메인 화면에 상점, 인벤토리, 스테이지 창이 나오는데, 상점에서 스킨을 사서 장착하거나 스테이지에 진입하여 적들을 잡아 골드를 얻을 수 있습니다. 플레이어는 스테이지의 가장 아랫부분에 스폰하여 위로 올라가는 것이 목표이며, 스페이스바를 눌러 헤엄치거나 대시하여 빠르게 움직일 수 있습니다. 하지만 헤엄치는 것은 산소, 즉 스테미나를 사용합니다. 대시는 산소보다 많은 양의 산소를 소비하기 때문에 산소를 신경 쓰지 않고 계속 올라가다간 산소가 다 떨어져 위로만 움직이는 카메라 아래로 내려가 게임 오버가 됩니다. 플레이어 주변에는 산소를 공급하는 에너미가 지속적으로 나오지만, 가끔 공격적인 에너미도 나와 적에게 공격당해 산소를 잃는 것을 조심해야 합니다. 플레이어가 적들을 죽여 산소를 공급받으며 위로 올라가다 보면, 에너미 웨이브가 나옵니다. 에너미 웨이브에 진입하면 카메라가 움직이지 않으며 설정된 에너미들을 전부 처치해야 기본 상태로 돌아와 위로 올라갈 수 있습니다. 산소가 0이 되지 않는 것을 유지하며 에너미 웨이브를 버티고 위로 올라가 목표 높이까지 올라가면 스테이지 클리어입니다. 적을 잡을 때마다 나오는 골드로 스킨을 사서 게임을 플레이할 수도 있습니다.
  • 문제 해결 사례: 튜토리얼을 만들 때, 플레이어가 정확히 무엇이 무엇을 뜻하는 것인지 알려주고 싶었기 때문에 특정 부분을 제외하고는 검게 칠하여  스포트라이트 같은 효과를 주고 싶었는데, UI의 마스크는 '부모의 구역만 보이게 해준다'라는 기능만을 제공합니다. 하지만 전 검게 칠한 자식 스프라이트에서 '부모의 구역만 안 보이게 해준다'라는 기능이 필요했기 때문에(물론 부모가 밝은 부분이 아닌 어두운 부분이라면 마스크를 사용할 수 있겠지만, 그건 직관적이지 못하고 수정이 어려울 것 같다고 판단했습니다.) 검색하여 유튜브에서 영상을 찾았습니다. 그 영상을 보고 Image에 Mask 효과를 씌울 때, 원래 보낼 메테리얼은 CompareFunction 이넘 값이 Equal이지만, Image를 상속하는 새 클래스에서 메테리얼을 보내는 프로퍼티를 오버라이드하고 원래 보낼 메테리얼을 base. 으로 불러와서 그 반대의 값을 반환하면 된다는 것을 알았습니다. 값을 반환하는 메서드의 인수를 NotEqual로 바꾼 다음 반환하도록 하여 이 컴포넌트를 낀 스프라이트는 부모가 마스크 효과를 썼을 때 부모의 구역만 보이는 것이 아닌 부모의 구역만 안 보이도록 만들 수 있었습니다.
  • 협업 방식: 깃허브를 이용하여 포크나 깃 데스크탑을 쓰며 서로의 작업물을 올리고 머지하는 방식으로 프로젝트를 완성해 나갔고, 폴더링 방식은 게임잼에서 기능별로 나눈 것과 다르게 멤버별로 이름을 나눠서 작업했습니다. 작업이 끝날 때마다 디스코드에 말하고, 버그 제보와 주기적으로 작업이 어디까지 됐는지 물어보는 과정을 통해 멈추지 않고 안정적으로 작업을 할 수 있었습니다.
  • 직접 구현한 기능 목록 : FSM을 활용한 플레이어, 남은 거리 표시/스킬 범위 UI(인게임에선 표시X), 튜토리얼, 에너미 자동 생성, 사운드/게임 매니저, 배경 패럴렉스, PP 만들고 적용, 이펙트/클리어/세팅/콤보/씬 등 대부분 작업물 연결, 배경 패럴렉스, 카메라 쉐이킹
    플레이어는 FSM을 활용하여 상태마다 적용할 애니메이션과 중력, 회전 속도를 다르게 만들어 Movement와 Animation에 적용했습니다. 자연스러운 움직임을 위해 애니메이션의 클립을 잘라 바로 이동하기도 하고 건너뛰기도 하는 등 완성도를 위해 애니메이션에 시간을 많이 투자했습니다. 클래스에 필드 2개를 선언하여 하나는 키로, 나머지 하나는 값으로 활용해 클래스 배열로 딕셔너리를 만드는 방법을 사용해 상태별 정보와 Enum을 키로 하고 Clip을 값으로 한 사운드 매니저를 만들었습니다.
플레이어
에너미 자동 생성 (테스트 화면)
튜토리얼
PP
사운드 매니저
남은 거리 표시 UI

스킬 범위 UI
 배경 패럴렉스

테스트 및 결과

  • 플레이 테스트 방식 : 게임 플레이는 에너미를 만드는 친구가 계속 싸워보며 타격감이나 난이도를 조정하여 게임의 QA 역할을 일부분 맡았습니다. 그 이후로는 친구들에게 플레이를 시켜보며 완성도를 높였습니다.
  • 게임의 완성도 / 구현율 : 처음에 게임을 만들 때 게임의 볼륨이 좀 작더라도 완성도를 좀 높여서 버그 없고 게임에 몰입할 수 있는 디테일을 많이 넣는 것을 목표로 제작했고, 실제로도 버그가 많이 없고 기본적인 기능들은 다 구현되었기 때문에 완성도는 전에 만들었던 게임보다 훨씬 높은 편이라고 생각해 90% 정도인 것 같습니다. 구현율을 목표로 하다 보니 처음에 생각한 기획의 35%는 하지 못해 구현율은 65% 정도이긴 하지만 게임을 만드는 목적이 판매가 아닌 플레이어에게 좋은 경험을 주는 것과 경험, 공부를 위해서였기 때문에 좋은 선택이였다고 생각합니다.
  • 플레이 시간 : 게임의 후반까지 가면 난이도가 높아지기 때문에 20분 정도의 시간을 소요하면 엔딩까지 볼 수 있습니다.
  • 개선하고 싶은 점 : 원래 계획은 일주일 전에 돌아가는 게임을 만들어서 그 이후로는 버그 잡고 게임의 완성도를 올리는 방식으로 개발하여 완성도 100%인 게임을 만들려고 했는데, 그 정도의 시간은 벌지 못했습니다. 개발이 생각보다 늦어진 이유가 개발하는 도중에 게임에 버그가 생각보다 많이 나와서 그런 것도 있지만 병합을 담당하는 역할을 빠르게 정하지 못해 기본적인 UI들의 병합이 늦어진 것이 주된 요인이었기에 역할 분배를 정확히 하지 못한 것도 아쉬웠습니다. 아무리 액션 게임의 본분에 충실했다고 하더라도 게임에 능력치가 올라가거나 이벤트가 없어서 풍부한 플레이 경험을 주지 못하는 것에 아쉬움을 느끼고 있기 때문에 랜덤성을 추가하거나 아이템 상자가 떨어지는 등 플레이어가 게임을 플레이 할 때 적 말고도 신경 써야 하는 부분을 추가하고, 메인 화면에서 할 수 있는 일을 추가하면 좋을 것 같습니다.

다운로드 및 영상 링크

회고 및 느낀 점

  • 개발하면서 느낀 교훈 : 팀플을 할 때 한번 빼고 계속 UI 작업만 맡았기 때문에 플레이어를 잘할 수 있을지 몰라 조금 불안했지만, 수업 시간에 배운 것과 평소에 공부한 것들을 토대로 코드를 짜니 플레이어와 그 외의 PP 적용, 에너미 생성, 사운드 매니저, 작업물 연결 등 다양한 부분을 제대로 작동하고 코드도 너무 길어지지 않게 구현할 수 있었고, 만들다 보니 UI를 만들 때의 코드나 플레이어를 만들 때 코드나 별 차이가 없다는 것을 알았습니다. 물론 UI는 디자인을 많이 생각하고, 플레이어는 그 시간에 다양한 기능을 구현해야 한다는 차이점이 있지만 같은 언어로 같은 엔진에서 하는 프로그래밍이기 때문에 논리적인 사고를 통해 구조를 짜고 하나씩 구현해 나간다는 점이 같았기 때문에 ‘UI만 해서 그런지 다른 기능은 어렵네라는 생각은 한 번도 하지 않았습니다. 플레이어를 생각보다 빠르게 완성하면서 자신감이 붙어 씬, UI를 적용하고 에너미를 생성하는 등의 병합과 추가적인 작업도 하게 되었고, 처음으로 팀에서 다양한 작업을 하고 큰 영향을 주는 역할을 맡게 되어 좋았고, 잘했다고 생각합니다. 평소에 UI를 했기 때문에 UI 추상화와 매니저를 만들어 예시로 남은 거리 UI를 만든 것으로 다른 친구가 쉽게 UI 작업을 할 수 있었고 완성도 있는 튜토리얼을 만들 수 있었습니다. 또한 팀원들이 만든 UI를 적용, 연결, 디버깅까지 할 수 있었기 때문에 팀 프로젝트를 하기 전까지는 너무 UI 작업만 해서 후회했지만 지금은 오히려 더욱 범용성 있게 작업을 할 수 있게 된 것 같아 게임 개발을 할 때, 어떤 작업을 하던 열심히 생각한다면 그 작업에 너무 고립되지 않고 다른 일도 잘할 수 있다는 것을 알게 되었습니다. 그 외에도 저번에 느낀 완성도 문제와 팀원 간의 소통의 부재로 인해 게임이 개발 기간이 끝나기 전까지 거의 완성되지 않았던 것을 반복하지 않고, 디스코드에서 주기적으로 상황을 확인하고 역할을 주는 등 서로가 서로를 이끌어주며 개발하며 저번 동아리 프로젝트의 멤버와 유사한 팀에서 저번 동아리 팀 프로젝트에서 한 실수를 다시 하지 않고 더욱 완성도 있는 게임을 만들 수 있어 성장한 느낌이 확실히 들어 좋았습니다.
  • 팀 프로젝트로서 배운 점 : 다양한 작업을 하다 보니 다양한 곳에서 버그가 터졌는데, 한가지 기능에 많은 주의를 기울이지 못했기 때문에 디버깅하는데 평소보다 많은 시간을 할애하게 되었습니다. 특히 람다식을 너무 많이 사용하여 이벤트의 구독 해제를 제대로 하지 못해 씬을 처음 실행했을 땐 괜찮았지만 다시 로드 했을 때 문제가 너무 많이 생겨 골치를 썩였습니다. 그리고 팀 내에서 하는 일이 많았기 때문에 시간도 정신도 없기도 하고, 전체적인 기획의 아이디어를 제가 냈기 때문에 사소한 부분은 굳이 모두의 의견까지 들을 필요는 없다고 생각하여 다른 친구들의 의견을 제대로 수용하지 못하고 기능을 수정했습니다. 한 친구가 그것에 대해 말했을 때 정신을 차려 그 이후엔 꼭 물어보고 작업을 진행했지만, 그전까지 모두의 의견을 들어보지 못하고 전체 작업방에 말한 후, 그 작업을 하는 친구의 의견만 듣고 작업하는 방식으로 작업하여 미안하다는 생각이 들었습니다. 작업을 할, 한 사람의 의견만 들으면 된다는 안일한 생각으로 작업하면 안 된다는 당연한 마음가짐을 계속 인지하고 있어야겠다는 생각을 하게 되었습니다.
  • 지금 다시 만들면 바꾸고 싶은 부분 : 완성도를 높이자는 계획을 계속 인지를 하고 있더라고 지키기 힘들다는 것을 알았기 때문에 이런 목표가 있을 때는 일정을 직접 써서 관리하는 등 일의 배분과 역할을 정확하게 짜서 자신이 무엇을 해야 하는지, 그것을 기간 내에 할 수 있을지에 대한 생각을 할 수 있게 그것을 관리하는 기획자의 역할을 할 사람을 정해서 게임을 더욱 완성도 있게 바꾸고 싶습니다. 그리고 제가 예전에 기능만 구현하는 코드를 짰고, 그로 인해 확장성이나 유연성, 재사용성 등 여러 가지 중요한 부분을 놓쳐 이번엔 구조를 생각하며 짰지만, 여러 가지 기능을 개발하며 그런 구조를 많이 생각할 필요 없는 코드나 구조가 필요하더라도 코드 한 줄 한 줄을 의심하며 에러가 나진 않을지에 대해 생각하며 코드를 짜진 않았기 때문에 기능과 구조뿐만이 아닌 안전하고 정확한 코드를 짜는 것에 대한 중요함을 인지하며 개발할 것입니다.
  • 앞으로 만들고 싶은 게임 방향 : 이번엔 완성도를 목표로 개발했기 때문에 다음 프로젝트는 완성도와 함께 게임의 풍부함도 챙겨보고 싶습니다. 지금까지는 계속 픽셀 아트를 통한 액션 게임을 주로 만들었는데, 팀에 픽셀 아트가 아닌 2D 아트가 있다면 깔끔하고 소소하게 즐길 수 있는 캐주얼 게임을 만들어보고 싶습니다. 그리고 이번엔 팀장을 하지 못했지만, 지금 새로 짠 동아리 팀에서는 제가 팀장이기 때문에 제가 팀원들을 잘 이끌어 지금까지 만든 게임보다 더욱 좋은 게임을 만들어보고 싶습니다.