어떻게 게임을 만들지?
안녕하세요. 박시용입니다. 기획을 통해 어떤 게임을 만들지 계획을 세웠다면 이제 진짜로 게임을 만들어 볼 차례입니다. 계획을 잘 세우셨다면 구현할 순서를 정해서 차근차근 구현해 나가시면 조금씩 완성 된 게임의 형태를 보실 수 있습니다. 이 과정이 아마 제일 재미있으면서 가장 힘든 기간이 될 수 있는데요, 이번 시간에는 기획한 내용을 바탕으로 프로토타입을 만드는 과정을 영상을 통해서 보여드리고, 프로토타이핑 이후에 게임 개발을 진행하여 마무리 하는 것에 대해 알려드리도록 하겠습니다.
이번 시간에는 기획한 내용을 바탕으로 프로토타입을 만들고 테스트를 거쳐서 완성하는 과정에 대해서 알려드리겠습니다. 먼저 유니티를 실행한 다음 새로운 프로젝트를 만들어 보겠습니다. 2D 게임으로 만들 것이므로 2D에 체크를 하시고, 프로젝트 명은 ColorDash 라고 하겠습니다. 파일 저장 위치는 편하신 위치로 설정을 해주신 다음 Create Project를 눌러 프로젝트를 생성합니다. 프로젝트가 생성되면 가장 먼저 해줘야 할 것은 개발환경을 셋팅하는 것입니다. 이제 프로젝트가 생성되었다면 촤즉 상단의 File로 가셔서 Build Setting으로 들어가셔서 디바이스에 맞는 플랫폼을 선택하고 Switch Platform을 해줍니다. 그런 다음 Game 화면의 카메라 해상도를 설정해준 다음, 파일을 관리할 폴더를 만들도록 하겠습니다. Create -> Folder를 해준 다음 이미지를 저장할 Images 폴더, 스크립트를 저장할 Scripts 폴더, 씬을 저장할 Scenes 폴더, 마지막으로 프리팹과 각종 리소스를 관리할 Resources 폴더를 만들어 줍니다.
그 다음 Images 폴더에 미리 준비해놓은 더미 이미지들을 Import 하겠습니다. -1 Import New Asset을 선택한 후 파일을 선택해서 Import 해줍니다. 그 다음, Scenes 폴더로 이동해서 GameScene 이라는 새로운 씬을 만들어줍니다. 그리고 생성된 씬을 더블클릭 하면 씬이 로드됩니다. 자 아까 Import 한 이미지들을 화면에 배치해보겠습니다. 공 이미지와 장애물 이미지를 화면에 적당히 배치한 후, 이것들을 움직이기 위해 스크립트를 짜보겠습니다.
Scripts 폴더로 이동하셔서 GameEngine이라는 스크립트를 만들어줍니다. 이것을 실행을 하면, Visual Studio가 실행이 됩니다. 자 이제 화면에 배치했던 공과 장애물을 관리하기 편하게 인스펙터에 등록 시키는 게 좋겠죠? public 으로 GameObject 변수를 만들고 Ball 이라고 이름 짓겠습니다. 장애물은 위치가 필요하므로 public으로 Transform 변수를 만들어 주고 Obstacle 이라고 이름을 지어줍니다. 그 다음엔 장애물의 위치 값을 저장할 Vector3 변수를 만들어 주고, Destination 이라고 이름 지어 줍니다.
그 다음엔 공이 이동할 때 속도를 정해주기 위해 float 변수를 만들어 주고 Speed 라고 이름 지어줍니다. 그리고 적당한 값을 임의로 설정해줍니다.스크립트를 저장하고 다시 에디터로 돌아와서 방금 만든 스크립트를 적용시켜주기 위해 GameEngine이라는 빈 오브젝트를 만들어줍니다. Create Empty를 통해서 새로운 오브젝트를 만들고 GameEngine이라고 이름을 바꿔주고 아까 만든 스크립트를 이 오브젝트에 끌어다 놓으면 이렇게 컴포넌트에 스크립트가 추가됩니다. 아까 배치한 공과 장애물을 인스펙터에 끌어다가 넣어줍니다. 자 이제 스크립트에서 공과 장애물을 관리할 수 있겠네요. 저장해주시고 다시 스크립트로 넘어가겠습니다.
공을 움직이기 위해 장애물의 목적지 위치 값을 설정해주는 함수를 만들어보겠습니다. void, SetDestination이라는 함수를 만들어 주시고, 아까 만든 Destination변수를 여기에 넣고 Obstacle.transform.position; 이라고 입력을 하면 장애물의 위치 값을 Destination에 넣어주게 됩니다. 이렇게 하면 장애물이 화면 어디에 있든 위치 값을 받아올 수 있습니다. 자, 그 다음으로 Move 함수를 만들어서 공을 움직여주도록 하겠습니다. Ball.transform.position = Vector3.Movetowards 함수를 써주시고 1번 인자에는 공의 위치, 2번 인자에는 공이 도달할 목적지, 3번 인자에는 공의 이동속도를 넣어줍니다. MoveTowards 함수를 설명하자면 1번 인자 값의 위치가 2번 인자 값의 위치로 3번의 속도만큼 매 프레임 움직이게 해주는 함수입니다. Time.deltatime과 속도를 곱해서 프레임속도에 맞춰 일정하게 움직이게 해줍니다.
이제 아까 만든 함수를 사용해야겠죠 SetDestination 함수는 Start 함수에 넣어서 이 스크립트가 최초에 실행될 때 장애물의 위치 값을 받아오도록 해줍니다. Move 함수는 Update 함수에 넣어서 매 프레임마다 함수를 호출하여 공의 위치를 바꿔주도록 합니다. 저장 후 다시 에디터로 돌아가서 실행을 해보면 공이 장애물로 움직이는 것을 보실 수 있습니다.
이제는 이 공을 조작을 통해 움직이게 해야겠죠? 간단하게 터치를 하면 공이 움직이게 하겠습니다. 다시 스크립트로 돌아가서 클릭을 하면 움직이게 해 줄 함수를 만들어 줍니다. Move 함수 아래 void ScreenTouch라는 이름의 함수를 만들어 준 후, 움직임을 제어할 bTouch 라는 bool 값 변수를 만들어 주고 false라고 초기값을 설정해줍니다. 다시 함수로 돌아와서 if(Input.GetMouseDown(0))을 해주시면 마우스를 눌렸을 때 조건이 충족됩니다. 그리고 그 안에 bTouch를 true로 바꿔주면 마우스를 눌렸을 때 bTouch가 true로 바뀌겠죠. 자 그리고 Move 함수로 이동해서 이 bTouch가 true일 때만 움직이게 조건문을 작성해줍니다. 그리고 공이 장애물의 위치에 도착하면 bTouch 값이 다시 false로 돌아오게 새로운 조건문을 작성해준 후, bTouch를 false로 바꿔줍니다. -그리고 Update 함수에 아까 만든 ScreenTouch 함수를 넣어주면 언제든지 마우스를 눌렀을 때 함수가 호출됩니다. 자 다시 실행을 해볼까요? 이제 공이 움직이지 않고 있다가 마우스를 클릭하면 움직입니다.
여기까지 되었으면 이제 장애물을 여러 개 생성해서 길을 만들어주고, 색깔 버튼을 터치하면 색이 바뀌는 걸 만들어 주는 등, 기획한 내용을 차근차근 구현해주면 됩니다. 중간 중간에 필요한 더미 리소스들을 추가해주고, 더미 UI도 만들어 가면서 부족한 기획도 다듬다 보면 이런 형태의 프로토타입이 완성이 됩니다. 프로토타입이 완성이 되어서 게임 플레이가 가능한 상태가 되면 먼저 본인이 재미를 느끼는지 테스트를 해보신 후, 주변 지인에게 테스트를 부탁해서 피드백을 받는 것이 좋습니다. 다른 시각에서 내가 미처 보지 못한 문제 또는 재미를 느끼지 못한 이유 등을 알려주기 때문이죠.
이때 중요한 건 자존심을 세우시면 안됩니다. 예를 들어 5명에게 게임을 테스트 부탁했고, 그 중 3명 이상이 재미가 없다 라고 했을 때, ‘나는 재미있는데? 네가 잘 몰라서 그래’ 라는 식의 반응은 좋지 않습니다. 다수가 그렇게 느낀다는 것은 다른 사람들도 게임이 재미없다고 느낄 확률이 높기 때문이죠. 이 과정을 통해 좀 더 재미있고 완성도 있게 프로토타이핑을 완성하고 진행하는 것이 추후에 개발 진행이 많이 되어있는 상황에서 게임의 재미를 찾지 못해 전체적으로 수정해야 하는 불상사를 막을 수 있습니다.
프로토타이핑에서 성공적으로 재미를 찾았다면, 이후 기획한 내용대로 계속 살을 붙여 나가면서 수정하는 작업을 진행하면 됩니다. 게임 실력이 다소 떨어지더라도 능력치를 업그레이드 하거나 아이템을 구매해서 실력을 어느 정도 보완할 수 있는 시스템을 추가했고, 사람들끼리 경쟁할 수 있게 랭킹 시스템도 추가했습니다. 플레이 도중 색이 빠르게 바뀔 경우 눈이 금방 피로해지거나 장애물이 잘 안보이는 경우도 생겨 최적의 색을 찾기 위해 계속 수정 하고, 재미있게 느낄 수 있는 레벨을 만들기 위해 계속 플레이 하면서 난이도도 계속 수정했습니다. 이러한 과정에서 무언가를 추가하고 빼는 것을 반복하게 되는데, 이 때 추가되는 시스템들이 게임의 정체성을 해치지 않는지 계속 체크하면서 작업을 해야 합니다.
이 과정에서 그래픽적인 부분은 프로토타입에서 사용된 더미이미지들을 컨셉에 맞게 퀄리티를 올린 이미지로 바꿔주면서 전체적인 분위기가 게임의 컨셉과 잘 맞아떨어지는지 계속 체크 합니다. 그리고 최적화하기 위해서 Packing Tag라고 있는데 같은 이름으로 Packing Tag라고 묶어주시면 하나의 이미지로 Sprite Packing되면서 리소스 최적화에 큰 도움이 됩니다.
어느 정도 시스템이 구현되었고 그래픽 컨셉이 확고해 졌다면 분위기에 맞는 사운드를 찾거나 제작 하셔서 적용하시면 됩니다. 게임의 시스템적인 부분들이 모두 구현되었다면 기획에 따라 각종 SDK(Software Development Kit)와 인앱 모듈, 광고 모듈 등 Third-Party 플러그인을 적용하고, 테스트를 하면서 남은 버그들을 수정하면 됩니다. 이제 마무리가 되었다면 APK파일을 빌드해야 하는데, 유니티 메뉴에서 Build Settings 로 들어가신 후 하단의 Player Settings로 들어가셔서 아이콘을 적용해주고, 상단에 Company Name 에 팀명 또는 개발자 이름을 적으시고, Product Name 에는 게임의 이름을 적어줍니다. 그 다음 Resolution and Presentation 에서 Allowed Orientations for Auto Rotation 항목에서 게임이 세로 게임이라면 Portrait 항목만 체크를 해주시고, 가로 게임이라면 Landscape 항목만 체크해주시면 됩니다. 마지막으로 Other Settings 에서 Identifications 탭에 있는 항목들을 설정 해주신 후 Build And Run 을 누르면 컴퓨터와 연결된 핸드폰에 앱이 설치가 되면서 APK 파일이 생성됩니다. 너무 짧은 시간 안에 게임제작에 대해서 알려드리다 보니 내용이 제대로 전달이 되었는지 모르겠네요. 강의를 끝내기 전에 제가 게임개발을 하면서 느꼈던 제작에 대한 노하우를 몇 가지 알려드리고자 합니다. 먼저 기획을 하실 때는 내가 만들고자 하는 게임의 이미지를 한 장으로 설명 가능하게 먼저 만드는 것이 기획정리에 큰 도움이 됩니다. 또한 벤치마킹을 하실 때 App Annie 같은 앱분석 사이트를 활용하시면 여러 앱들의 각국 순위나 피처드 횟수 등에 대한 데이터를 보다 쉽게 분석이 가능합니다. 프로그래밍을 하실 때에는 초보자라면 코드를 만드실 때 구조적인 완성도 보다는 내가 구현하고자 하는 기능을 만드는 것에만 집중하여 작업을 하시면 보다 재미있고 빠르게 구현이 가능합니다. 구조적인 완성도는 코드에 흥미가 생기고 어느 정도 숙달이 되신다면 자연스럽게 고려하면서 작업하시게 될 겁니다. 아트는 게임의 용량에 가장 큰 부분을 차지하며 최적화에 민감한 부분입니다. 리소스는 최적화를 위해 원본 리소스대비 70% 사이즈로 리사이징해서 사용하시거나 이미지 압축 프로그램을 이용하여 해상도가 크게 깨지지 않는 한도 내에서 용량을 최대한 줄이는 것이 중요합니다. 또한 반복해서 사용할 수 있는 이미지 리소스를 적극적으로 활용하는 습관을 들여서 중복되는 리소스를 줄일 수 있다면 더 좋겠죠? 아트는 예쁘고 멋있게 만드는 것도 중요하지만, 컨셉과 개성이 가장 중요하므로, 내 그림실력이 뛰어나지 않다고 하더라도 나의 색을 찾는 것에 집중한다면 좋은 결과물을 얻으실 수 있을 것입니다.
01. 이 강좌에 대해서
기획한 내용을 바탕으로 실질적으로 프로토타입을 제작하고 게임을 완성하여 빌드해보는 과정에 대해 알아봅니다.
02. 강사 소개
박시용 (로우플 스튜디오 디렉터)
03. 강사 이력
- RawpleStudio 공동창업자, 아트 디렉터 - 모바일 캐주얼 RPG ‘Idle Fantasy' 아트디렉터 - 모바일 감성 퍼즐게임 ‘Stellar Fox' 아트디렉터 및 연출 프로그래밍 -모바일 캐주얼 게임 ‘Color Dash' 아트디렉터 및 메인 프로그래머 - LOL 팬게임 ‘Master Of Grab / BlockBreaker Syndra / Ez Mirror Match' 개발 및 출시
- 경기 콘텐츠 진흥원 / 경기 창조 혁신센터 주관 ‘제 4회 게임창조 오디션’ 2위 수상 - BIC ‘One Store Sponsor Award' 수상 - BIC ‘Google Play Sponsor Award' 수상 - 'Stellar Fox' Google Play 메인 피처드 선정 - ‘Stellar Fox' Google Play 글로벌 메인 피처드 선정