본 강의는 제가 개인적으로 NGUI를 공부하기 위해서
작성하는 이력같은 겁니다.
일단 제가 백수이다보니 (잠시만 눈물좀 닦고...) 첫번째 목적은
이것을 볼 인사담당자가 이 놈은 게임을 이렇게 만드는군
을 알 수 있게 올리는데 첫번째 목적이 있습니다.
그래도 일단은 최대한 알아보기 쉽게 적고자 합니다.
(하지만 여전히 부외자에겐 외계어로 보일 겁니다.@_@; )
개인적으로 알려주는걸 좋아하는 성격이기도 해서
궁금한게 생기시면 성심성의것 답변드립니다.
하지만 뭐 게임만드는게 그렇듯 어렵게만 적어지는 군요 :<
또, 만들면서 바로 적는 강좌이기 때문에 교육용으로 따로 준비하지 않는 내용들입니다.
이점 참고하시고 보시면 감사하겠습니다. (__)
step1 . 드롭제거에 관한 이슈
이제 드롭을 없애보자 단순 무식하게 드롭을 없애는 방법은 다음과 같다.
물론 저런 처리는 board에 메서드를 만들어서 처리하는 편이 더 낫지만
일단 임시코드라서 이렇게 적었다.
이제 드롭을 움직이면 가로세로 3이상 연속된 Element 들은 없어질 것이다.
이 상태에서 다음과 같은 것을 생각할 수 있다.
1. 어떻게 제거하는가?
2. 이후 어떻게 떨어지게 할 것인가?
3. 빈공간에 어떻게 채워 넣을 것인가?
일단 첫번째
대부분의 예제에서는 실행도중 Instantiate() 함수로 프리팹을 객체로 생성하고
다쓴 객체를 Destroy()함수로 제거 하기도 한다.
하지만 로딩이 끝난 상황에서는 Instantiate()로 객체를 생성하는 일은
최대한 지양해야 하는데 메모리의 빈공간을 찾고 적재하는 데에
베터리 소모가 심하고 CPU사용량을 늘리기 때문이다.
특히나 모바일에선 이런 것 생각하는게 중요하다.
실제로 유저에게는 드롭이 터진것 처럼 보이게만 하고 실제로는
터지는 이팩트-> 숨김 -> 재위치 시키면 30개의 Element만을 가지고
게임을 진행할 수 있다. 실제로 화면상에 보이는 Element은 최대
30개이니 특수한 상황이 아닌이상 따로 여분의 Element는 필요 없을 것이다.
두번째로 Element들이 빈공간을 감지하고 떨어져야 한다.
다 터트리고 모든 Element가 밑에 공간있는지 확인을 하는방법이
가장 먼저 떠오르지만 이렇게 하면 떨어질 Element를 찾아내야 한다.
지금 생각나는 가장 좋은 방법은 없어질 Element들이 없어지기전 위에 위치한
Element들에게 떨어지라고 메세지를 보내는 것이다. 그림으로 표현하면 다음과 같다.
이렇게하면 따로 떨어지는 드롭을 '찾을' 필요가 없다.
*배열안에서 특정 조건을 만족하는 맴버을 찾는건 오래걸린다는 것을 기억하자.
마지막으로 제거된(제거된것처럼 보이는) Element 들의 처리인데 간단하게 제거된
열의 위쪽으로 이동해서 내려오면 된다. 문뜩 파괴할 Element들도 내려갈 위치를
정해주는 것이 필요하다는 것을 깨달았다. 그림을 다시 그리면 다음과 같다.
이제 파괴가 된 다음 상태와 그 다음상태를 그림으로 보자 대충 이해가 갈 것이다.
그다음 위에 있는 블록이 내려오기만 하면 끝난다. 이후에 좌표설정이 남았지만
일단 방향은 잡았으니 작동이 되도록 코딩부터 해보자.
일단 Element 클래스에 맴버 변수를 추가해 주자.
이제 Element에 다음 세 함수를 추가해 주자
SendDropMessage()
GetDropMessage()
moveToDeleteLine()
코드는 다음과 같다. 매우 간단한 코드이다.
이제 이 코드들을 Board에서 실행시켜 보자.
이제 실행하면 드롭들이 없어지진 않고 위로 이동하.. 지 않는다.
이 현상을 살펴보기 위해선 한가지 집고 넘어가야할게 있다.
맨위에 드롭을 Board 밖으로 놨다가 놓으면 제자리로 돌아가는 것을 알 수 있다.
이것은 NGUI가 UIDragDropItem을 집은 마우스를 놓을 때
Rep-osition(이하 재배열)을 하기 때문인데 이것을 막아야 이후 드롭을 마음대로 변경할 수 있다.
NGUI는 총 두곳에서 재배열을 한다.
마우스로 UIDragDropItem을 집을때 그리고 놓을 때 이것을 막기 위해서는 다음과 같이 하면 된다.
기왕 하는김에 이동함수도 만들자.
이전 직선으로 이동하는 코루틴 함수를 조금 고쳐서 내 Coord 좌표로 이동하게 만들면 될 것 같다.
정말로 마지막으로 이제까지 만든걸 조합해서 파괴하는 시퀀스를 선언하자 이런 절차적인
프로그래밍을 하려면 코루틴이 정말 도움이 된다.
이제 실행시키면 완성!
Unity3D 와 NGUI를 활용하여 3일만에 퍼즈도라 프로토타입을 만들어냈다.
쓰다가 이곳저곳 언급안하고 손본곳이 꽤 된다.
- Element를 이동시키지 않고 놓으면 Rep-osition을 하는 대신 돌아가게 만듬
- bRep-osition은 새로 추가시킨 접근자임
- 기타 등등
이런 세부사항은 github를 참고하면 될 것이다.
https://github.com/geniikw/copy-of-puzzleD/
아직 완벽한 버젼은 아니다. 다음과 같은 요소가 빠져 있다.
콤보
보드 밖으로 나갈때 처리
파괴 - 생성을 좀 자연스럽게
파괴 시퀀드 동안 입력막기
일단은 여기까지 하고
이후 콤보 시스템, 커스터마이징, 꾸미기 등을 주말동안 하는 것이 예정사항이다.
종종 들려야겠네요~ 좋은글 감사합니다!!ㅎㅎ