티스토리 뷰
게임 플레이 영상 : https://youtu.be/vLpTmFmNDuw
GitHub 링크 : https://github.com/bokiee99/Just-Move
졸업 작품 보고서 : https://naver.me/GgBtY0Gn
게임 공유 링크
2. https://drive.google.com/file/d/1v9fAzoU5jtBRCj5OTHshReLMiqK5VTlW/view?usp=sharing
기획서 PDF
2. https://drive.google.com/file/d/1SbH5OZPQwVSeskYDr0QwbG8_Zs9R3q9T/view?usp=drive_link
개발 및 구현 PDF
2. https://drive.google.com/file/d/1K_ZjdUhc5BbDy2v3Hr_1xwmZrk0TZr8m/view?usp=drive_link
졸업 프로젝트 1인 개발로 만들었던 게임이다.
졸업 프로젝트이기에 4학년 1학기에 기획하고 이후 4학년 2학기에 구현을 하여 개발을 진행했다.
어떤 게임을 만들까 고민이 깊었는데, 스스로 개발 실력이 그렇게 뛰어난 편은 아니라고 생각했기에 스토리 및 아이디어를 중점으로 게임을 개발하고자 하였다.
그럼 어떠한 것을 스토리로 삼을 것이냐가 문제였는데, 이를 고민하면서 시간만 보내다가 문뜩 3학년을 마치고 휴학하면서 진로를 제대로 잡지 못하고 방황하던 시기가 떠올랐다.
이어서 이 시기에 고민하며 했던 생각을 게임에 담아 하나의 스토리로서 표현해보자는 생각을 가지게 되었다.
휴학하던 시기에 대해
휴학을 하던 시기에는 처음에는 컴퓨터 게임을 하며 놀다가, 언리얼에 관심이 있었기에 조금 알아보기 시작했다.
이때 처음 시작했던 것이 Yotube의 시작해요 언리얼 2023 강의였고, 이를 통해 언리얼의 기본 조작 방법을 배우게 되었다.
진행을 하다보니 기본 컴퓨터의 사양이 그리 높지는 않아서 시간이 오래 걸려 지장이 생겼고, 강의 자체는 다 듣고 블로그에도 정리는 했지만 이후에도 언리얼을 계속해서 다루지는 않았던 것 같다.
이외에는 하루에 1문제 알고리즘 사이트 백준에서 문제를 푼 것 말고는 컴퓨터 게임을 주로 하며 지냈던 것 같다.
중간에 정보처리기사도 공부하고 합격까지 하긴 했지만, 이룬게 너무 적다는 생각이 많이 들었고 뭐라도 다시 해봐야 겠다는 생각을 가졌다.
이에 언리얼에 관심도 있고, 게임하는 것도 좋아하기에 언리얼로 게임 개발해보는 것에 도전해보기로 마음 먹었다.
이 시기에 시작한다는 것에 늦었다는 생각도 들기는 했지만, 그렇다고 아무것도 하지 않고 그대로 있을 것이냐고 스스로에게 물어보며 모아놓았던 돈으로 컴퓨터를 새로 맞추고 Udemy 강의를 통해 게임 개발 강의를 듣기 시작했다.
이때가 거의 10월 경에 가까웠던 것 같다.
게임 구현
스토리 라인을 잡고 다음으로 생각한 것이 게임 진행 방식이다.
스토리를 중점으로 생각하였기에 워킹 시뮬레이션 장르도 생각했지만, 게임으로서의 재미가 너무 떨어진다 생각하여 특정 무기를 활용한 이동 방식을 생각하였다.
평소 FPS 게임을 즐겨했기에 사용 무기는 총기로 하되, 일반적인 총알이 아니라 충격을 부여하는 쇠구슬과 시간 재생 부여 기능을 가진 레이저 2가지를 다루는 무기를 생각하였다.
그리고 맵에 배치된 특정 사물(플랫폼)에 쇠구슬로 충격을 주고, 그 충격량 만큼 이동하는 방식을 생각했다.
다만 충격량이 과하면 너무 멀리 날아가기에 일정 충격량 이상을 부여하면 플랫폼이 파괴되도록 제한을 걸었다.
또한 기본적으로 플랫폼은 날아가서 일정 시간 이후 파괴되며, 이렇게 파괴된 플랫폼은 2초후 재생성되지만 앞서 말한 충격량 이상을 부여해 파괴된 플랫폼은 돌아오지 않게 하였다.
아무래도 처음에 컴퓨터 게임을 하면서 시간을 보내다가 반년 이상이 지나서야 제대로 공부를 시작했기에 기본적인 게임의 분위기도 어두운 편이다.
이를 나타내기 위해 처음 시작화면도 어두운 배경에 다소 공허한 바람 소리 BGM을 넣었다.
또한 평소 반복되는 게임 생활을 표현하기 위해 Endless Runner 타입의 2D 단순 방해물 피하기 점프 게임을 게임 시작하자마자 실행되도록 하였다.
이때 게임에 맞게 경쾌한 BGM과 캐릭터 점프 소리가 액션마다 실행된다.
해당 게임은 끝없이 반복되며, 날아오는 돌맹이에 맞아 게임 오버가 되어야만 다음 화면으로 넘어가게 된다.
이때 줌아웃 연출을 통해 실제 게임하다가 나온 듯한 느낌을 받도록 하였다.
이후에 방을 둘러보면 게임을 하던 삶에서 벗어나 변화를 주기 위해 필요한 물건 3가지를 알 수 있게 된다.
이후 집을 돌아다니다 보면, 기본적으로 BGM이 없으며 캐릭터가 움직이거나 캐릭터와 상호작용하는 순간만 사운드가 존재하는 것을 알 수 있다.
내가 직접 움직여야만 변화가 생긴다는 것을 연출하기 위해 기본적인 사운드를 할당하지 않고, 실제 움직임을 가진 캐릭터및 캐릭터가 영향을 끼칠 수 있는 사물에 대해서만 사운드가 발생하도록 하였다.
이어서 집을 돌아다니다 보면 잠긴 문을 발견할 수 있다.
문을 열기 위해 앞서 설명했던 무기가 필요하며, 이는 천장을 통해 얻으러 갈 수 있다.
총기를 습득했을 때 좌측에 현재 무기가 사용중인 타입이 무엇인지 알 수 있는 UI와, 조준점을 위한 크로스 헤어가 생긴다.
이제 밖으로 나가는 문에 레이저를 쏘면 문이 활성화되며, 밖으로 나올 수 있게 된다.
하지만 문을 나가는 순간 밖의 필드는 색채가 전부 없어지도록 해놓았다.
집의 경우 내가 편안함을 느끼는 장소이기에 색채가 전부 살아있지만, 밖으로 나가는 순간 더 이상 편안한 장소가 아닌 것을 나타내기 위해 색채가 전부 사라지도록 하였다.
다만 상호작용이 가능한 플랫폼이나 목표 물체의 경우에만 색채 및 강조 표시를 통해 알 수 있도록 하였다.
이러한 연출은 포스트 프로세스 볼륨 기능을 활용하여 구역마다 stencil value 값에 따라 색채만 갖거나, 색채가 사라지거나, 특정 사물에만 색채를 입히고 강조하도록 설정하였다.
게임 진행의 경우 무기를 사용하지 않아도 충분히 깰 수 있도록 하였다.
무기를 사용하면 플랫폼을 통해 더욱 빠르게 날라가서 플레이 타임을 단축할 수 있지만, 단순히 걷기만 해도 깰 수 있도록 설정하였다.
이는 변화를 위해서는 우선 집 밖으로 나온 것만으로도 어느정도의 의미가 있다고 생각하여, 굳이 무기가 없더라도 엔딩을 볼 수 있도록 한 것이다.
이는 게임 제목인 Just Move와도 연관되는 부분이다. (일단 움직여 보라는 의미)
가장 먼저 만나보게 되는 스테이지는 전등을 얻는 스테이지다.
게임이 본격적으로 진행되는 맵은 하나의 거대한 메가 레벨이기에 스테이지가 바뀔 때 레벨이 전환되지는 않는다.
다만 자연스러운 연출을 위해 순간이동 기능을 섞어 사용하였다.
첫 스테이지 컨셉의 경우 등잔 밑이 어둡다라는 속담에서 아이디어를 얻었다.
위에서 아래로 내려가 전등을 얻고, 다시 올라오게 되며 이때 다른 전등을 플랫폼으로 사용해 아래에서 위로 빠르게 이동이 가능하다.
전등을 얻고 이동하면 다음 스테이지로 도서관이 존재한다.
도서관은 누구나 쉽게 유추 가능하듯이 공부를 위한 책이 존재하며, 수많은 책 중 나에게 의미있는 한 권의 책을 찾게 된다.
도서관을 나와서 주변을 보면 아래로 떨어지는 구간이 있다.
여기서 돌무더기를 건너서 섬같은 지형으로 이동이 가능하다.
플랫폼을 이용하면 빠른 이동이 가능하지만, 실수하여 물가로 떨어지면 특정 지점에서 다시 시작하게 된다.
섬에 도달하면 해변가에 종이들이 널부러져 있는 것을 확인할 수 있으며, 여기에서 달력을 얻을 수 있다.
이는 필요없어 보이는 것들 사이에서도 나에게 필요한 것이 있을 수 있다는 의미를 위해 종이 더미들 사이에 달력을 배치하였다.
이제 다시 내 방으로 돌아가야 한다.
섬으로 오기 위해 위에서 떨어졌으므로 통상적인 방법으로 다시 올라가는 것은 불가능하다.
이때 섬 구석에 특정 위치로 워프하는 문을 설치하여 바로 도서관 스테이지 입구쪽으로 이동할 수 있도록 하였다.
이후에 다시 방으로 돌아가면 얻었던 사물들을 배치할 수 있다.
이제 컴퓨터를 실행시켜보면, 배치한 사물들의 갯수에 따라 해피엔딩 또는 배드엔딩을 맞이하게 된다.
먼저 해피엔딩의 경우 초기의 Endless Runner 2D 게임이 실행되나, 돌이 날아오지 않고 캐릭터도 가만히 서있는 모습을 볼 수 있다.
여기서 이제 캐릭터를 직접 움직일 수 있으며. 특정 위치에 도달하면 줌아웃 되며 2D 게임의 캐릭터가 현재 세상이 만들어진 세상임을 알 수 있게 된다.
여기서는 이제 좌우 이동 뿐만 아니라, 앞뒤로도 이동이 가능해지며 앞으로 쭉 걸어와 모니터 밖으로 나오는 듯한 느낌과 함께 해피 엔딩의 월드로 전환된다.
이렇게 전환된 월드는 모든 세상이 색채를 갖게 되어 환해진 것을 볼 수 있다.
무사히 변화를 맞이 했기에 더이상 무기도 필요없고, 플랫폼도 전부 사라져있는 것을 볼 수 있다.
또한 방문을 자유롭게 여닫으며,
방에 갔을 때 전보다 훨씬 환해진 모습과 얻었던 사물들도 모두 배치되어있는 것을 볼 수 있다.
배드 엔딩의 경우 엔딩 조건이었던 사물들을 1개 이하로 가져오거나 변화를 위해 아무것도 하지 않고 바로 컴퓨터를 실행시켰을 때 발생한다.
마찬가지로 Endless Runner 2D 게임이 다시 실행되나, 돌이 날아오지 않고 캐릭터는 끊임 없이 움직이기만 하며 세상도 점점 어두워지는 것을 볼 수 있다.
이대로 변한 것 없이 Game Over가 뜨며,
이는 예전과 똑같이 반복적인 삶을 살게 되는 것을 의미한다.
참고 자료
사운드
- https://www.zapsplat.com/sound-effect-category/
- https://samplefocus.com/samples/electric-zap
- https://pixabay.com/sound-effects/search/wind/
- https://pixabay.com/music/search/retro%20game/?pagi=2
2D 게임 에셋
- https://mattwalkden.itch.io/free-space-runner-pack
타이틀 이미지
- https://wroef.tumblr.com/post/164408566703/post-3-this-will-be-posted-in-a-series-and
캐릭터 및 총기
- 언리얼 1인칭 템플릿 기본 자료 사용
캐릭터 애니메이션 (앉기, 일어서기)
- https://www.mixamo.com/#/
맵 에셋
- Edith Finch: Classrooms and Bedrooms (언리얼 마켓 플레이스)
- Edith Finch: Molloy Room (언리얼 마켓 플레이스)
- Edith Finch: Edie Room (언리얼 마켓 플레이스)
- Edith Finch: House and Common Areas (언리얼 마켓 플레이스)
- Edith Finch: House Grounds (언리얼 마켓 플레이스)
- Edith Finch: Barbara Room (언리얼 마켓 플레이스)
- Edith Finch: Sam Room (언리얼 마켓 플레이스)
- Edith Finch: Beach Wedding (언리얼 마켓 플레이스)
- Edith Finch: Cannert and LowPoly Kingdom (언리얼 마켓 플레이스)
참고 영상
ESC 메뉴 : https://www.youtube.com/watch?v=VuugJM5F_SgO
캐릭터 재생성 : https://www.youtube.com/watch?v=kwgaF1CD_Ps&t=193s
메인 메뉴 : https://www.youtube.com/watch?v=kumZj_mov58&t=1s
옵션 메뉴 : https://www.youtube.com/watch?v=Ff67XtqgSxc
2D 게임 : https://www.youtube.com/watch?v=S-EQcr9eYMs
스프라이트 : https://www.youtube.com/watch?v=YOF0NSxhKk4
스프라이트 무빙 : https://www.youtube.com/watch?v=DoNw8T2G7s0&t=1717s
포스트 프로세스 : https://www.youtube.com/watch?v=PiQ_JLJKi0M
하이라이트 : https://www.youtube.com/watch?v=rGqlReFObYQ
문 상호작용 : https://www.youtube.com/watch?v=xH2Wlr2RNhw&t=198s
에이펙스 로드아웃 : https://www.youtube.com/watch?v=laRVpXAU5oc
레이저빔 : https://www.youtube.com/watch?v=_KT6I8ffphs&t=2s
애니메이션 리타겟팅 : https://www.youtube.com/watch?v=_sLnCqBaElI&ab_channel=DruidMechanics -> His Video
참고 강의
Udemy : Unreal Engine 4 C++ The Ultimate Shooter Course
마치며
게임 제목인 Just Move는 플랫폼 게임으로서 단순한 이동을 의미하기도 하지만,
이 게임의 주요 메시지인 변화를 위해 일단 움직이라는 것을 의미한다.
내가 변화를 겪기 위해서는 스스로 움직여야만 하며, 아무것도 하지 않는 다면 여전히 같은 삶을 반복해 나갈 뿐이다.
아무리 사소한 것일지라도 일단 움직여본다면 어떠한 형태로든 긍정적인 영향을 끼칠 수 있다는 것이 해당 게임의 메시지이자 휴학 시기에 느꼈던 생각이다.
휴학 시기의 내가 이런 고민을 하지 않고 허송세월 보냈다면 지금의 졸업 프로젝트를 만들 수 있었다는 생각은 하지 못했을 것이다.
이렇게 말은 했으나, 4학년 1학기와 방학에 걸쳐서도 계속 고민했던 것은 사실이다.
1학기에 주요 기획은 다했지만 개발을 시작해야할 방학에 공부가 부족하다고 생각하여 Udemy 사이트를 통해 언리얼 강의 공부와 이를 블로그에 정리하면서 시간을 보냈다.
따라서 실질 개발은 2학기 시작인 9월 초중순 쯤에 시작했으며 시간에 꽤나 쫓기면서 진행할 수밖에 없었다.
사실 초기부터 약간 꺾일 뻔 했는데, 캐릭터 단순 앉기 애니메이션 구현에도 상당히 애를 먹었기 때문이다.
지금와서 생각해보면 어떤 것 때문에 애를 먹었는지도 잘 기억이 나지 않지만, 오히려 간단했던 걸로 기억했기에 이런 것도 못하면 앞으로는 어떻게 하나 하는 생각에 스스로에게 실망했던 것 같다.
초기에 캐릭터 앉기 애니메이션을 구해서 리타켓팅을 해주고, 총기 관련 애니메이션도 할당을 해줬었는데 지금 와서 생각해보니 불필요한 부분이었던 것 같다.
어차피 1인칭 캐릭터이기에 앉기 동작은 보일 필요가 없기에 굳이 앉기 애니메이션을 구현할 필요가 없고 카메라 이동만 자연스럽게 보여주면 그만이었다.
에셋 배치도 지금와서 생각해보면 너무 과하게 힘을 들였던 것 같다.
아무래도 에셋이 전부 모듈러식이라 조립을 해야하는데, 맨 처음 지역인 집을 만드는데 일주일 가까이 썼던 것 같다.
집 내부 배치를 전부 하나하나 클릭해가며 배치를 해줬었는데 어차피 몇몇 부분들은 굳이 들어갈 필요도 없었던 방었기에 과감하게 배제할 부분은 배제해서 시간과 게임 용량을 세이브하는 것이 훨씬 좋았을 것 같다.
특히 에셋의 경우 다운한 에셋의 Map 레벨에서 조립되거나 모듈로 펼쳐져 있는 걸 그대로 복사해서 메인 레벨에 붙여놓고 이후에 또 복사해서 사용했는데, 복사해올 당시 따로 폴더로 묶어두지 않아 삭제할 때도 하나하나 클릭해야 하는 경우가 생겨 상당히 시간을 소모했다.
코드 같은 경우도 일단 시간이 부족하다보니 구현이 되는가에만 집착을 많이 했던 것 같다.
어느정도 기능들을 함수로 묶어서 가독성이 좋게 했어야 했는데, 하나의 함수에서 살만 붙이다 보니 갈수록 스스로 알아보기가 힘들어졌다.
이것도 처음부터 나누고 시작했어야 했는데 일단 구현하는 것에 급급하다보니 막상 나눌 필요성을 느끼고 나서는 혹시나 코드가 망가질까봐 섣불리 건들지 못하는 상태가 되었던 것 같다.
제일 심했던 것이 Fire() 함수이며, 쇠구슬 발사, 레이저빔 활성화, 무기 타입 체크, 라인트레이스, 히트액터 판별, 애니메이션 까지 죄다 들어있다.
아래는 코드 Fire() 함수의 전체 코드이다.
물론 위의 코드는 극단적인 예시이기는 하다.
대부분의 함수는 사진 1개 정도의 분량에만 미친다.
다만 실제로 코딩하면서 제일 고생한 부분이기도 하기에 지금 와서 보면 많이 아쉬울 따름이다.
언리얼 엔진이기에 블루프린트로도 구현 작업을 많이 했는데, 이또한 효율을 생각하지 않고 구현에만 집중한 탓에 보기에 그리 좋지가 못하다.
어느정도 묶어서 보기에라도 좋게 했어야 했는데, 마찬가지로 일단 작동만 되면 그대로 냅뒀었다.
이러한 문제들을 확실히 느꼈던 것은 패키징을 할 때이다.
처음 패키징 할 때 개발 환경에서는 플레이가 잘 되던 것이 바로 패키징 실패가 떴었는데 당시에 얼마나 놀랬는지 모른다.
원인은 문제의 Fire() 함수 부분이었고, 위의 Fire() 함수 코드는 고쳐서 이상은 없지만, 당시에는 구조상으로 꼬여있는 부분이 있어 제대로 개발 환경에서는 괜찮지만 조건이 더 엄격한 게임 플레이 환경에서는 패키징이 불가했던 것이다.
이후에 패키징 하고 플레이하면서도 느꼈는데 본인의 컴퓨터 사양이 굉장히 높아 타 AAA 게임 할때도 컴퓨터가 조용한 반면에 내가 만든 게임을 플레이 할 때는 소음이 상당했기 때문이다.
소음 뿐만 아니라 용량이 많이 컸는데, 사용하지 않는 에셋을 전부 삭제하니 3gb에서 1.5gb까지 절반이나 줄어드는 모습을 확인할 수 있었다.
이 에셋 또한 처음에 제대로 폴더로 구별하지 않아서 실제 참조하고 있는 에셋인지 아닌지 긴가민가에 제대로 삭제하지 못한 부분들도 존재한다.
처음엔 안쓰는 줄 알고 폴더 하나를 통째로 삭제했다가 알고보니 참조된 에셋이라 배치된 에셋이 사라져 복구하느라 애를 먹은 적도 있다.
이렇듯 최적화 면에서는 좋지 못했기에 학교 시연 컴퓨터로 안될까봐 노심초사했었다.
실제로 처음에 실행이 되지 않아서 마음을 졸였다가 그래픽 드라이버를 업데이트 시켰더니 되서 겨우 안심을 하기도 하였다.
한가지 의아했던 것은 학교 컴퓨터는 막상 소음이 조용했던 것인데.. 언리얼 5관련 기능들(Nanite, Lumen 등)이 본인 컴퓨터 환경에서는 풀로 돌아가는데 학교 컴퓨터에서는 작동하지 않아 그랬을까 하는 막연한 생각만 가지고 있다.
어차피 개발한 게임 특성상 그런 기능들이 영향을 크게 미치지 않아 인게임적인 차이는 크지 않았지만 말이다.
어찌보면 앉기 애니메이션의 경우와 비슷하게 필요없는 부분은 처음부터 잘 체크해서 아에 활성화되지 않도록 했으면 훨씬 좋았을 것 같다.
이외에도 생각해보니 만들다보니 워킹 시뮬레이션 류의 게임이 되어버렸는데, 사실 나는 이러한 장르를 선호하지 않는다.
아무래도 근본적인 게임의 재미보다는 주제적 깊이나, 감성적 경험을 중심적으로 설계된 경우가 많다보니 그런 것 같다.
따지고 보면 이번에 내가 개발을 진행한 게임 또한 이런 류에 가깝게 만들었다보니 아이러니할 따름이다.
결국 만들면서도 다시 한번 깨달은 거지만 게임의 가장 중요한 것은 재미인 것 같다.
영화같은 연출, 깊은 스토리, 환상적인 그래픽과 사운드 등이 있어도 게임에 재미가 없다면 한 순간의 환상적인 경험일 수 는 있어도, 그 이상으로 나아가기는 어렵지 않나 싶다.
이렇듯 지금와서 생각할수록 여러모로 아쉬웠던 점이 많았지만, 다행히도 졸업 프로젝트 시연 당시에는 평가를 다들 상당히 좋게 봐주셔서 감사했다.
특히 의도했던 스토리 라인이 비록 내가 직접 설명을 하긴 했지만 다들 반응이 좋았고, 연출 부분에서도 호평을 받았다.
2학기 부터 평가해주신 교수님 또한 졸업 프로젝트 중간 중간 진행 상황 제출했을 때부터 계속해서 좋게 평가해주셔서 정말 감사했다.
스스로는 모자라다 생각했는데 워낙 좋게 말씀해주신 덕분에 중간 중간 자신감도 생기고 무사히 개발을 끝마칠 수 있었다.
교수님 두 분에게 졸업 시연을 마쳤을 때도 호평으로 말씀해주셔서 기분 좋게 마무리 할 수 있었다.
시작부터 여러모로 탈도 많고 중간 중간에 힘도 많이 들었지만, 그만큼 여러모로 많은 것을 배웠던 졸업 프로젝트였다.