이번 개인 프로젝트 주제는 자유롭게 게임 만들기였으나 ,,
심오한 게임 스토리를 짜고 싶다! 에 사로잡혀서 이도저도 아니게 되어버렸다
그래서 선택한 건 궁금했던 게임의 로직을 분석해보고 만들어보는 것~,,
그 게임은 바로바로 "Monument Valley"
개인 프로젝트
개요
Monument Valley란?
- 착시현상을 이용한 퍼즐을 해결하면서 주인공인 '아이다'를 목적지에 데려다주면 되는 게임이다.
- 착시현상의 원리 중 하나로 "펜로즈 삼각형"이 사용되었다.
- 펜로즈 삼각형 : 현실 세계에서 불가능한 물체의 일종
삼각형의 각 변을 이루는 막대는 모두 서로 직각을 이루지만 그럼에도 불구하고 삼각형을 만든다.
2차원 그림으로만 가능한 구조
출처 위키백과 펜로즈 삼각형
구조 살펴보기
- How to Make a Game Like Monument Valley를 참고해서 튜토리얼 만들기를 진행하였다.
- 제공되는 Scene에서 구조를 살펴보자.
- 플레이어의 캐릭터인 Player
- 마우스 클릭을 보여주는 마커인 Cursor
- 플레이어가 지나다닐 수 있는 Horizontal Platform, Vertical Platform, U Platform, Support Platform, Stairs Platform
- Spinner를 통해 회전시킬 수 있는 구조물인 Bridge
- 플레이어의 최종 목적지인 Goal
- Horizontal Platform처럼 회전하지 않는 구조물의 경우 각 Box 하나당 Node가 하나씩 달려있다.
- Clickable 컴포넌트를 갖는 Box들은 클릭해서 Player를 이동시킬 수 있게 된다.
노드는 아래와 같은 모습
- 회전하는 Bridge 구조물은 하나의 Box가 여러 개의 Node를 갖는다.
아래와 같은 모습
- Spinner는 Spinner 오브젝트와 Controller로 이루어진다.
- Spinner Controller는 3개의 컴포넌트를 가진다.
Drag Spinner : 스피너 회전
Highlighter : 스피너 활성화 시 불이 들어오도록 하이라이팅 역할
Linker : 스피너가 회전했을 때 각도에 따라 활성화 할 노드 연결을 설정
주요 로직
- PlayerController는 처음에 Player의 위치와 가장 가까운 Node를 탐색해서 위치를 가져온다.
그 후 PathFinder에게 위치를 전달하고 시작 Node를 설정하도록 한다.
- 클릭을 하면 PlayerController는 PathFinder에게 클릭한 Node까지 이동하기 위한 최적의 경로를 탐색할 것을 요청한다.
Cursor에게는 마우스를 클릭한 곳에 마커를 보여줄 것을 요청한다.
- Spinner Controller에 달려있는 컴포넌트 3가지는 아래와 같다.
- Drag Spinner에서는 회전시킬 대상을 받아오고 회전축을 설정한다.
드래그 시 각도를 계산하기 위한 pivot을 설정하고, 드래그 시 발생할 이벤트를 연결해준다.
여기서는 Linker에게 노드 연결의 활성화를 업데이트 할 것을 요청한다.
- Highlighter 컴포넌트는 Spinner 오브젝트의 Mesh Renderer를 받아와서 스피너가 활성화 되었을 때 마우스 포인터를 올리면 붉게 빛나도록 설정한다.
스피너가 활성화 되었을 경우 마우스를 올리면 Highlighter 컴포넌트에 의해 아래와 같이 표현된다.
- Linker에서는 회전 각도를 체크할 오브젝트의 Transform을 받아온다.
여기서는 Bridge 오브젝트의 Transform을 받아온다.
해당 오브젝트의 회전 각도에 따라 두 개의 노드 사이 연결을 활성화하도록 설정한다.
예를 들어, Element5에서는 Bridge의 각도가 0도일 때, Node21A와 Node22의 연결을 활성화한다.
확장
- 주어진 컴포넌트들과 구조물을 이용하여 맵을 아래와 같이 확장시켰다.
두 개의 Bridge를 추가하여 총 3개의 Bridge를 갖도록 하였다.
- 따라서 각 Bridge의 Spinner는 서로 다른 Spinner Controller들이 관리하도록 하였다.
- 루트를 구성하면서 Bridge와 Bridge 사이를 지나가도록 만들었는데, 이때 Bridge 하나의 조건만 체크해주어서 Bridge가 연결되지 않아도 Player가 Node를 타고 지나가는 현상이 발생했다.
- 이를 해결하기 위해 Linker에서 두 가지의 Bridge 조건을 모두 체크할 수 있도록 조건 element를 추가했다.
회고
궁금했던 게임 로직에 대해서 공부할 수 있었고, 로직이 너무 재미있어서 좋은 경험이었다!
나만의 게임을 만들어내지 못한 것은 아쉽지만 기회는 많으니까!
그리고 재미있는 로직을 공부해볼 수 있어서 오히려 좋았다 ㅎㅅㅎ
오늘은 요기까지
끗~