6월부터 복직을 하고, 팀스파르타에서 운영하는 로켓단 2기에 참여하게 되었다.
하이퍼 캐쥬얼 게임을 기획하고 unity를 통해 개발한 후 구글 플레이스토어에 출시하여 운영하는 6주간의 과정이었다.
지방에서 강남까지 매주 2회씩 왕복하고, 퇴근후 게임을 개발한다는 것이 쉽지만은 않았다.
사실 6주가 지나고, 8주차가 돼서야 게임 개발을 완료하였다.
개발 기간을 맞추지 못해서 cpi 테스트를 못 해본 것은 참 아쉽지만, 처음 나만의 프로덕트를 기획부터 개발까지 모두 해봤다는 과정에 의의를 둔다.
개발을 마치고 나서 보니, 그렇게 어렵지만은 않은 개발 작업이었는데, 막상 그걸 할 때는 정말 어려웠고, 하루 평균 3시간씩 직장을 병행하면서 개발한다는 것 또한 쉽지만은 않았다.
그래도, 직접 프로덕트를 만들면서, 또 함께 로켓단에 참여했던 현직 개발자 분들을 보면서 개발자의 자세에 대해 배울 수 있었다.
개발자에게는 문제가 풀릴때까지, 그리고 더 나은 코드를 만들 때까지 "왜?"라는 질문과 구글링을 할 수 있는 맷집이 필요하다는 사실을 체감했다.
게임을 만들면서 여러가지 문제에 부딪혔고, 정말 많은 삽질을 했고, 유니티 강좌를 보며 여러 카드게임을 클론코딩 하며 정말 하나하나씩 익혀나갔다.
처음부터 좋은 코드를 쓰고 싶다는 욕심에 속도가 매우 느렸고, 기능을 하나씩 추가할 때마다 삽질의 연속이어서 절망했다.
하지만, 천천히, 성급한 마음을 접어 두고, 구글링과 질문을 계속해서 던지며 문제를 해결할 때의 쾌감을 잊지 못한다.
아직, 게임 개발이 마무리 되지 않았고, 페이스북 연동과 플레이스토어 출시도 남아 있지만, 그래도 감회가 새롭다.
게임 출시가 완료되면 나는 다시 프런트엔드 개발 공부에 박차를 가할 생각이다.
아래는 개발하며 삽질했던 경험담이다...
0. 게임 로직
cocktail sort puz는 정리게임이다.
sort puz라는 플레이스토어 5천만 다운로드 게임에서 모티브를 따서 만들었다.
마구잡이로 섞여 있는 칵테일을 분류에 맞춰 정리하는 게임이다.
카드가 섞인 만큼 move 수가 주어지고, move 수 안에 정리를 완료해야 승리하는 게임이다.
1. 카드 셔플 시 의도한 n값만큼 셔플이 되지 않음
처음 보드를 생성하면, 7가지 캐릭터 카드가 행을 맞춰 차례대로 생성된다.
입력하는 n 값 (= move 값)만큼 퍼즐을 섞는다.
퍼즐을 섞는 로직을 짜는 것도 삽질을 좀 했는데, 임의의 랜덤카드를 선택하고, 그 카드 사방위에 존재하는 카드를 셔플카드 리스트에 담는다. 그 후 리스트에서 랜덤으로 하나의 셔플카드를 뽑아 랜덤카드와 sprite 및 좌표값을 교환한다.
그런데, 여기서 문제는, 랜덤카드와 셔플카드가 똑같은 sprite를 가졌을 때, sprite 교환을 하지 않도록 조건을 붙였는데, 그때에도 n 값이 카운트가 된다는 것이었다.
즉, 셔플이 되지 않았는데, n값이 올라가는 것이었다. 이것이 나중에 내가 원하는 만큼 셔플이 되지 않게 하는 주요 원인이었다.
처음에는 if문만을 활용해서 코들 짰는데, 너무 길어지고, 변수도 많이 만들어야 해서 while 문을 이용하여 바꿔 주었다.
int i 값을 만들어서 while (i !=n)이라는 조건을 걸고, 랜덤카드와 셔플카드의 sprite가 서로 다를 때만 두 카드를 바꿔주는 방식으로 로직을 짜니 원하는 대로 셔플이 되었다!! 성공!!
2. 게임 플레이 시 선택한 카드와 인접한 카드가 서로 바뀌는 것이 아닌 멀리 떨어진 카드와 바뀌는 현상
이 현상의 원인을 몰라 삽질을 진짜 오래 했는데...
알고 보니, 선택한 카드의 포지션 값을 temp 값으로 저장하지 않아서였다.
sprite를 교환할 때는, switchCard의 sprite 값을 미리 tempSprite로 받아 온 뒤 adjCard와 교환을 했는데,
좌표의 경우, switchCard의 좌표값을 따로 받아오지 않은 상태에서 adjCard의 좌표값을 할당해주고, 이미 바뀐 switchCard의 좌표값을 계속 adjCard의 좌표값으로 할당해 주고 있었던 것이다....
이 간단한 것을 놓쳐 계속 input 시스템에서 문제를 찾고 있다가, 코드를 찬찬히 보니, temp 값이 보였다...
그때 깨달았다...ㅋㅋㅋㅋㅋ 멍청한 나...ㅋㅋㅋㅋㅋ
3. Instanciate을 통해 생성한 수많은 카드 중 화면에서 터치한 카드값 받아오기
여기서 제일 애를 많이 먹였다.
처음 게임을 개발할 때, OnMouseDown()이라는 이벤트 함수를 사용하였는데, 나중에 알고 보니, 이게 화근이었다.
게임 오브젝트가 인접해서 있는 경우에는 랜덤으로 null이 뜨는 것이었다...
이것도 알고 보니 상당히 간단하게 IPointerDownHandler를 이용하면 해결이 되는 것이었는데... 그때는 잘 몰랐다.
검색해도 쉽게 나오지 않아서 한참 헤매다가.. 갈아엎고 새로 개발을 하면서 시도해보니 잘 되었다.
휴.. 우여곡절 끝에, 문제를 차근히 해결해 온 것 같다..ㅋㅋ
4. 애니메이션 적용
카드를 선택하고 인접 카드와 자리를 바꿀 때, 스으윽 하고 선택한 카드가 이동하는 애니메이션을 추가하려고 했다.
그런데, 난관에 부딪힌 게, 바로, position 값을 0에서 움직이는 방향 값으로 바꿔주니, 게임 플레이 화면에서는 선택한 카드의 position 값에서 움직이는 것이 아니라, 0 값으로 움직인 뒤 애니메이션이 실행되는 것이었다!
그래서, 해결책으로, 게임오프젝트에 빈 오브젝트를 부모로 달아 주었다!
부모 오브젝트는 월드 포지션을, 자식 오브젝트는 로컬 포지션을 받아, 자식 오브젝트의 포지션은 무조건 (0,0,0)으로 시작한다는 것이었다.
그러나, 이것만으로 해결되지 않았던 것이...
바로, 스크립트 상에서, 자식 오브젝트 속에 달린 애니메이션을 불러와야 했다는 것!
여하튼 많은 우여곡절 끝에, 움직임 애니메이션까지 완성!!
클릭을 빠르게 해 버리면 애니메이션이 튕기는 오류가 나긴 하지만, 그래도 완성했다!!! 짜잔ㅎㅎ
'TIL(today i learned)' 카테고리의 다른 글
[230329] Docker로 nodeJS 서버 띄우기 (feat. npm code 127, bcrypt 에러) (0) | 2023.03.29 |
---|---|
[JS] map, ternary (0) | 2022.08.29 |
[project] 지니음악 실시간 인기 차트 스크래핑 (0) | 2022.05.29 |
[project] 자바스크립트에서 Ajax와 jQuery 이용해보 (0) | 2022.05.29 |
[project] 상품판매 페이지 만들기 (html/css) (0) | 2022.05.28 |