NGUI 연습 겸 2주 안에 만들어볼 게임을 고르다가 조카의 두뇌에 도움이 될까 싶어 다운로드를 했었던 게임이 떠올랐다. 나름 재밌게 했었고 500만 이상 다운로드된 게임이므로 이 게임을 만들어보기로 했었다.

 

Fill One Line Puzzle게임을 한 사람들은 규칙을 알 것이다. 

각 타일마다 시작점이 있다. 시작점에서부터 상하좌우에 가까이 있는 타일을 터치하면 색이 변해야 한다.

이외의 타일을 터치하면 반응하지 말아야 하며 이전에 터치했던 타일을 터치하면 그 시점부터 다시 시작하게 해야 한다.

 

나는 어떻게 만들지 생각해보다가 생각보다 쉽게 이런 기능을 구현할 수 있는 방법을 찾아냈다.

하나의 Tile에 Box Collider를 아주 작게 만들어 상하좌우로 붙여놓았다. 

이렇게 하면 시작 시 각 타일마다  OnColliderEnter 함수에서 서로 충돌한 Tile들의 정보를 얻게 된다. 

코딩없이 주변에 있는 타일 정보를 가져올 수 있다.

타일을 터치하게 되면 타일이 터치되었다는 flag가 true로 바뀌게 된다. TileControl클래스에 Update() 함수에다가 로드된 스테이지의 모든 타일들을 검사하는 방식으로 확인을 하여 스택에 푸시하는 방법으로 했다.

TileControl class다. Update() 안에 구현 하였다.

지금 보니까 꽤나 무식한 방법으로 한 것 같은데 이 방법 말고 각 Tile이 눌려졌을 때 해당 타일이 눌러졌다는 이벤트를 보내는 방식으로 만드는 게 좋다. (내가 만든 코드를 보니... 리팩토링 각이다.) 눌러야 반응하는 부류의 게임은 웬만하면 Update()에 쓰지 말고 이벤트 처리 방식으로 만들자. 

 

----------

스테이지 추가

 

각 타일들의 정보가 저장되어있는 바이너리 파일이나 텍스트 파일에서 불러오거나 scriptableObject 같은 걸로 타일들을 초기화할 수도 있었지만 색다른 방법으로 스테이지나 타일들 추가가 용이하게 만들어 보려고 했다.

 

LS1_3 (왼쪽 숫자 1은 레벨이고 오른쪽 숫자 3은 스테이지)으로 이름을 바꾸고 타일들을 원하는 대로 배치한다. 

그 후에 처음 시작할 타일을 선택하여 isTouch만 체크해주면 스테이지 생성 완료.

가 아니라... 다 완성한 게 아니어서 완전 자동화로 만들지는 못했다. 때문에 한 가지 더 건드려줘야 할 게 있다. 레벨을 선택하면 스테이지를 선택할 수 있는 화면이 나오는데 스테이지를 복붙 하여 새롭게 만든 스테이지에 MyLevel과 MyStage에 새롭게 만든 스테이지 정보를 적어줘야 한다. 

나름 색다른 방법으로 간단하게 유니티 안에서 스테이지를 추가하는 방법을 적용해봤다.

 

 

프로젝트를 하면서 오브젝트 이름을 이용하여 레벨과 스테이지 저장할 수 있게 만들었다. (안 해도 되는데 문자열 연습 겸 해봤다) 이 정보를 이용하여 게임상에서 스테이지를 선택할 때 해당 스테이지의 정보를 찾아 SetActive(true)로 바꿔준다.

위와 같은 방법으로 레벨마다 스테이지의 개수를 원하는 만큼 추가를 할 수 있게 되었다.

 

-------------

보완해야 될 부분

 

게임 시작 시 각 타일마다 OnCollisionEnter로 주변 타일의 정보를 가져온 후 setActive(false)로 처리하는 방식으로 하였다.

이로 인해 레벨에 있는 모든 스테이지의 타일들의 OnCollisionEnter함수가 실행되어 프레임이 드랍되는 현상이 일어난다. 

메모리에 올라갈 스테이지들

컴퓨터보다 성능이 안 좋은 핸드폰에서 실행을 하게 되면 프레임이 드랍되는 시간이 늘어난다.

1초정도 프레임이 급격히 하락(컴퓨터)

 

또한 모든 스테이지를 메모리에 올리기 때문에 스테이지의 개수가 많아질수록 메모리 사용량도 늘어난다.

 

임시방편으로 Loading화면을 추가하고 코루틴에  WaitForSecondsReatime을 이용하여 모든 타일들의 CollisionEnter함수가 실행될 수 있도록 했다.

성능이 엄청 좋지 않으면 각 Tile들이  충돌된 Tile들의 정보를 Stack에 넣기도 전에 SetActive(false)가 되어 제대로 동작하지 않을 수도 있다. 

 

뗌빵용으로 이런 방법을 썼지만 제대로 된 해결방법은 스테이지들을 프리펩화하여 시작할 때 외부에서 Resources.Load를 이용하여 불러오면 된다.(나중에 리펙토링)

 

 

+ Recent posts