유니티 재귀함수의 예(헥사, 캔디팡) -Recursive Methods

|

관련 스크립트



헥사게임같은경우

3개의 각 다른 블록이 떨어지므로 각각의 블록에 해당되는 블록마다 재귀함수를 적용해서 호출해줘야됨


1. 3개의 블록 떨어트리고 고정

2. 아래에서부터 차례대로  고정된 블록 주위로 같은 블록이 있는지 검사

3. 같은 블록은 List 에 저장

4. 같은 블록이 3개 이상이면 없애주기



- List 사용시 각각 다른 List 사용

- 중복 제거


CheckMatchHexa 에서 아래에서부터 차례대로 체크를해줌

CheckBlockMatch 함수에서 매치되는 블록 삭제 처리

CheckBlock은 재귀호출로 같은 타입이 있으면 계속해서 호출되고  List 에 저장됨,


Block 스크립트의

SelfDestroy 코루틴 함수에서는 타입을 empty로 변경한후

껏다켰다를 반복 (enabled로()후 마지막으로 _blocks의 이차원 배열에 해당되는값 null로 변경, 

그리고 Block 스크립트를 할당하는 게임오브젝트 삭제













동영상 - 재귀함수에 대한 설명

http://youtu.be/p4yJ_JgAPgQ





출처 : http://www.devkorea.co.kr/bbs/board.php?bo_table=m03_qna&wr_id=21651





여러가지 방법이 있는데요 일단 Tag를 이용하는방법을 설명해 보겠습니다 
게임 블럭의 종류대로 TAG를 추가 합니다  태그명은 뭐 알아서 ^^;  
저는 편의상 Block0~Block3로 할께요 

Grid[x,z] = GameObject.Instantiate(Blocks[index1], new Vector3(x,0,z), Quaternion.identity)as GameObject; 
Grid[x,z].tag = "Block" + index1; //이렇게 코드에 추가하신후에 

터치된 블록주위를 검사해서 자신의 TAG와 같은 애들이 3개 이상이면 삭제 하시면 되겠습니다 

블록을 검사하는 방법에 대해 물으신 거라면 
잠깐 생각해보니 리커시브 함수를 써야 될것 같습니다 

특정 블럭 즉, 자신을 중심으로 상하좌우 블럭을 조사하는 함수를 만드시고 함수내 상하좌우 블럭 조사할때 다시 해당 함수를 리커시브하게 불러서 또다시 상하좌우를 조사하시면 되겠네요 
이때 이미 조사한 블럭은 중복될 수 있기때문에 이미 조사한 블럭은 어딘가에 기록으로 남겨놓아야 중복 조사를 방지 할수 있을겁니다 


재귀 함수를 한번도 사용해 보지 않으셨으면 로직을 이해하는데 약간 어려움을 느끼실 것 같은데요 
곰곰히 잘 생각해보면 그리 어렵지도 않습니다 

일단 작성하신 CheckBlock 함수가 특정 좌표(x,z)를 받고 상하좌우를 검사하는 함수잖아요 
일단 return에서 부르는 CheckBlock(x,z)는 주석처리 하시고 (왜냐하면 현재 위치를 또 검사하면 무한으로 계속 부르게 되니까요) 
지금 gameObject자체를 비교하고 계신데 tag비교로 바꿔주시고 

if(x > 0 && Grid[x,z].gameObject == Grid[x-1,z].gameObject){ 

// 전역변수 List에 해당 좌표쌍을 저장하는 코드 삽입 

CheckBlock(x-1, z); 


위 처럼 다른 사방에도 해주시면 됩니다 
로직을 설명드리자면 특정 블럭 위치(x,z)의 상하좌우를 검사해서 
동일한 Tag가 있는 블럭위치(a,b)를  저장할 수 있는 전역변수 C라는 List 변수에 해당 위치를 저장해 주고 

또 다시 (x-1, z)블럭위치로 위 함수를 호출 하는것이죠 

결과적으로 전역 C변수에는 블럭 주변에 동일한 Tag가 있는 모든 블럭위치를 저장하게 될 겁니다. 
그리고 먼저 말씀 드렸다 시피 해당 블럭위치가 이미 저장되어 있는지 검사해서 함수를 호출해야 무한루프에 
빠지지 않을 겁니다. 






Trackback 0 And Comment 0