토코야미 토와라는 버튜머 팬게임을 만들고 싶어졌다 (이제부터 토와라 칭함)

토와는 3D FPS를 좋아하는데 25

지금 만들 팬게임 이전에, 3D를 만들려 시도하다 2번 포기를 했다

(2번이나 시도하면서 3D만들 실력이 아니라 느꼈다)

그래서 단순한 2D게임은 괜찮을거같아

2D플랫포머 게임으로 결정했다.


시작 )

막상 시작하려니 게임을 어떻게 만들어야 할지 고민이 컸다. 

그동안 언어와 자료구조를 공부하고, 유튜브나 패트론 튜토리얼을 따라 만들며

나름 공부했다고 생각했지만, 실제로 플랫포머 게임을 만들려 하니 도움이 되지 않았다.

고민하며 시간을 보내다가 정신을 차려보니

3일 동안 관련 영상을 찾아 메모하고 지우기만 반복하고 있었다. 

뭐라도 해야겠다는 생각에 엑셀을 켰다



맵 구상 )

엑셀의 중앙 셀 하나를 색칠하며 맵이라고 생각해보았다.

첫 맵을 태초마을이라 생각하고 셀 양옆으로 다른 색을 칠했다.

각 셀을 맵이라 생각하니 NPC가 필요하고, 카메라 이벤트가 있으면 좋겠다는 생각이 들었다.

이어서 상세하지않은 대략적인 스토리도 만들어졌다.

스토리가 생기니 맵들의 아트 풍경을 중세 유럽 느낌으로 하고 싶었다. 

당장의 아트는 나중에 에셋을 사거나 누군가에게 맡길 예정이었기에

우선 내 허접한 그림으로 타일 형태만 표현했다. (콜라이더를 보고싶어서)



a14334aa0e2eb36792ff5c62ce5ae4f936cdee5aa043a60a31b6a05c2a68ba000b4b8ca4a1c8f5e488163695 


아트를 할줄 모르는 내가 임시로 그려넣은 타일

캐릭터가 걷는 플랫폼의 경우

타일의 중간쯤에서 걷는게 공간감이 있어보여 좋겠다 싶었다.
파란색과 빨간색은 타일의 콜라이더 영역을 표시해둔것.


초록색 동그라미는 우선 NPC라던가 어떤 푯말 안내판의 역할을

임시로 그려넣어 테스트해보고 있었다.

그리고 스토리가 가볍게라도 생기니 , 엑셀에 표시해둔 맵(각 셀)들에

좀 더 자세한 설명을 넣을수있게되었다.

다만 엑셀 화면에 모든걸 떄려박기엔 눈이 아파서

기존에 눈팅만 하던 옵시디언이란 메모프로그램을 같이 쓰기로했따.



엑셀의 맵들에게 옵시디언 폴더경로로 하이퍼링크를 걸어서

엑셀에서 특정 맵을 클릭시

그 맵은 몇개의 npc가 있고, 무슨 이벤트..,  대사등등..

나름 상세하게 적어보았다.

a14505aa0e2eb3529a33206d58c12a3a46082aa253fc1086ebaf6b27


아래는 엑셀화면


a16938ac3d02782a994e5a50f65cddc9ee6d688ac43856126c70290178a80789d429fc


위의 스토리 폴더내에 임시로 작성한 메모장 내용을 엑셀에 연결해주어서
엑셀 화면을 복잡하지 않게 볼수있게되었었다.



이러한 작업을 우선 하면서 재미도 살짝 느꼈고
자연스럽게 맵.cs,퀘스트와 대사등이 필요하단걸 알게되었다.

엑셀을 보면서 유니티에서 만들어가던중,
카메라 이동 + 소리재생 이 2개가 좀 날 힘들게했다.
어떻게 관리해야하고 어느순간에서 
이벤트와 데이터를 교체해주어야할지 문제였다.


카메라)

플랫포머 게임이니 언제나 캐릭터를 중심으로

따라다니는 카메라 이동이 당연하지만

할로우나이트 같은 게임들을 보면

캐릭터의 플랫폼 바로 아래 플랫폼층까지 

카메라 시야를 내려서 같이 볼수있게 해주는 경우가

나에게도 필요하다 생각했다.

a05c1cad1a02b47f9634016558d62d3bfb7e75732791b21515264ec76b

문제는 어느 상황에 맞추어서
이런 카메라 이동 이벤트를 변경해주어야 하느냐 였다


맵 프리팹 제작)



a67a05666826dc2da8735b59cf91aee83965dcffbd9243ec7cf9498539c0ec4fd58f30

맵 프리팹을 만들기 시작했다. 초록영역은 타일맵+타일렌더러+타일콜라이더+이벤트스크립트 등등..

게임내 타일집단을 의미하고 


아래 붉은 영역은 입구개념인데,
맵 전환을 할떄 어느맵으로가고, 그 입구를 통해 입장시 실행할 이벤트를
찾아서 실행시키는 개념으로 설정했다
실행할 이벤트는 사실  별것없고, 컷씬 있을시 재생시키고
캐릭터를 따라다니는 카메라의 바운딩 영역 변경등등이 있다.


맵이 모든 타일맵들을 관리하면서 ( 맵의 내부 타일맵들을 이제 MpaTiles라고 부르겠다)

이전에 말한 카메라뷰 로직 변경 시점을 결정했다.
먼저 모든 MapTiles에게 카메라뷰 이동 로직과 데이터를 가진 스크립터블오브젝트를 넣어두고


어차피 캐릭터의 이동이 언제나
CompositeCollider2D  를 사용하는 MapTiles 위에서 이루어지니

캐릭터가 현재 어느 MapTiles위에 있는지 확인하고

해당 MapTiles의 내부 스크립터블 오브젝트 내용을 실행 -> SOBJ는 현재 유저의 입력에 따라 실행하는 카메라 뷰 이동 로직들을 전부 변경
이런 방식으로 했다.
동시에 타일에서 걸을떄마다 재생시킬 소리파일도 같이 교체 시켜주기로 했다.


이렇게하니 스크립터블 오브젝트 2개정도로

당장 필요한 카메라 이동등을
모두 묶어서 처리할수있게됬다.

이제 점차 늘려가면 되겠지란 생각이다


MapTiles 찾기 ) 

이제 캐릭터가 어느 MapTIles위에 있는지만 알면

알아서 카메라이동과 소리를 재생시키는걸 할수있지만

새로운 문제가 2개나 생겼다.

그래서 MapTiles가 변하는 순간을 어떻게 포착하고 실행할건가?

타일(충돌체) 모형이 제각기인 상황에서 내 위치값으로 과연 올바르게 MapTils를 찾을수 있는가?


먼저 내 캐릭터가 서있는 아래 MapTiles를 찾는건 

아래 방식으로 찾을수가 있었다.

a16720ad231fb542be350655565dc2d07c127d98b5338afa0523da47a853b8a3370f958376968a51c258984ac229e43d37d8d5a0

맵 프리팹은 Grid컴포넌트를 지녔고, 

자신이 내부 MapTiles를 관리중이라
반복문을 순회하면서 찾으면 되었지만.
이걸 매 프레임 실행할 필요없다 생각이 들었다.

그래서 캐릭터가 이걸 찾아야하는 순간을 생각해보았는데.
1. 캐릭터가 해당 MapTiles를 벗어날떄

2. 캐릭터가 점프하고 착지할떄 (다른 MapTiles위에 착지할경우 떄문에 )
3. 맵전환으로 새로운 맵으로 입장시

총 3가지 경우에서만 자신이 어느 맵타일 위에 있는지 
확인하면 되겠다 싶었다.

1. 캐릭터가 해당 MapTiles를 벗어날떄 =>

MapTiles에게 OnTriggetExit2D를 추가하였다.
해당 트리거 엑시트시, 위 FindColliderEVT()를 실행시켰다

2. 캐릭터가 점프하고 착지할떄 =>

현재 캐릭터는 StateMachine을 사용중인데 

점프후 추락이 시작될떄 Fall상태로 전환시키고
Fall상태도중 에서 Ground 착지 확인시

위 FindColliderEVT()를 실행시켰다

3. 맵전환으로 새로운 맵으로 입장시 =>
맵 프리팹의 Transition오브젝트들에게 연결해둔 이벤트함수에서 실행시키니 쉽게 되었다.

아무튼 우선 이 방식으로 매프레임이 아닌 필요한 순간에만 얼추
실행시킬수 있게 된거같다


타일(충돌체) 모형이 제각기인 상황에서 내 위치값으로 과연 올바르게 MapTils를 찾을수 있는가?
처음엔 캐릭터 위치값 + Offset을 주면서 찾을까 란 생각으로
하드코딩을 하다가..머리가 너무 아팠다.

그래서 야매가 없을까 생각했는데

결국 캐릭터 오브젝트에 빈 트랜스폼을 하나 추가하고
캐릭터보다 살짝 아래로 위치시켜서 이 트랜스폼을 기준으로 타일을 찾기로했다

a05e30aa180eb549a2333c7158c12a3af454e5be8f13c451394935


위 이미지속 핑크색 표시가 해당 트랜스폼 위치이다.


a05e30aa180eb45a8a3321459a35d873db562c7ca329283cd7d60a3b3db2


위처럼
꽉찬 정사각형 타일위에서도, 파인 타일위에서도
이제 올바르게 MapTiles를 찾을수 있게된거같다


맵 이동)

그다음 맵에서 맵으로 캐릭터가 이동을 할떄
한가지 문제가 있었다.

맵들간 입구의 갯수 자체가 다를 뿐더러
이동시 정확히 어디로 캐릭터를 위치시킬지다.

먼저 입구 오브젝트들이

방향 데이타 스크립터블 오브젝트를 지니게했다.
그냥 dir이라 부를게 이제
dir은 자신의 현재 방향과
자신의 pair방향을 변수로 지녔다.

a14335ac301eb45eaa340e599a11d9b03fed95e97100eb415fc1275e309a977d940e


a66d28ad0932782a905a5c60da91a8ed4f5d3b0f6f3fcc81e4322f514284833ec33ef7


방향 (상하좌우)  + 높이(위,가운데,아래)를 더하여 연산하는 방식으로
자신의 반대편과 동일한 dir을 찾아 캐릭터를 그 위치로 이동시키게했다.
위에서 찾게된 방향을 이용해 카메라에 트랜지션 효과방향도 맞추어 실행했다. (아래)

a17d34ab1c2a76a167b9f68b12d21a1d40efebdb95bc3c

입구방향을 스크립터블 오브젝트로 대략
방향4개 높이3개로 만들었고 이걸 계속 중복으로 적용시켜 맵들간 연결을 계속 할 생각



캐릭터 )
먼저 난 3d를 만들려다가 내 수준을 파악하고
이번에 2d를 처음 시작했다.

3d를 만들려할떄 언제나 캐릭터 충돌모형을
떠다니는 캡슐모형으로해서 이번에도 그렇게했다.

왜냐면 계단이나 곡선등의 지형에 그게 좋다 생각해서였다.

a0493cad242eb54a8bed98b21fd70403aa61b8da1778e78fd348fd


a0493cad242eb54a8bf1d1bc10f11a39eafb09ff951db31b302d



근데 지금 와서 생각해보니
2d에서는 그냥 보이는 이미지 따로 충돌체 모형을 따로 해버리면
그냥 캐릭터 전체를 감싸는 콜라이더로 해도 된거 아니었나??란 생각이 지금 들고있다...


2eaf9e36ebd518986abce8954485746a26


연한 초록색의 콜라이더 2개가 캐릭터에 붙어있다.
하나는 캡슐모양의 캐릭터 충돌체
다른 하나는 캐릭터 중심으로 시작해
바닥을 감지하는 렉트모양의 그라운드체크이다.

그라운드체크가 바닥을 감지하고 hitpoint값을 잠시 저장하고
캐릭터에서는 언제나 저 비어있는 영역길이만큼을 포함해
캐릭터를 띄어놓는 식으로 처리했다.

다만 점프를 하고 착지시에
그 순간에만 콜라이더를 전체크기 비율로 변경해주어야할지 고민이다.
뭔가 아직 어색해보이는 부분이 좀 있어서
떠 다니는 모형의 충돌체 방식을 내가 잘 못쓰는건지
그냥 2d 랑 안어울리는건지를 계속 고민중이다.

이외 스테이트머신으로 캐릭터 상태변화를 나누고
그에 맞춰 스테이트 입장시 애니메이션,속도비율 등을 변경시키고 있다.




처음써보는거라 어색하다
이야기 하고픈게 많은데
뭔가 다 구절구절 적는건 나도 힘들고 보는 사람도 힘들거같아 여기까지만함.

다음번엔 더 완성시켜서 올게