[Unity3D] 헥사게임 만들기 세 번째 - 블럭 처리.
※ 소스 출처 : 네이버 카페 - 유니티 허브 - 햐얀바람님.
0. 리소스 준비하기.
1). 배경 이미지.
2). 블럭보드의 배경 이미지.
3). UI테두리 이미지.
4). 블럭 이미지.
1. 캔버스 크기 설정하기.
- 게임뷰어 및 캔버스 크기 설정.
2. 블럭보드 만들기.
1). 블럭 프리팹 만들기.
이번 글에서 하고자하는 내용은 체크 및 삭제 입니다.
3개이상의 연속된 블럭이 있는지 체크하고 그 블럭을 삭제하는 것입니다.
이번에 짤 스크립트는 그에 관한 내용입니다.
1,2) 블럭체크 및 블럭매치 함수 코딩.
3). 블럭삭제 함수 코딩.
1. 블럭보드 전체를 체크하면서 3개 이상의 연속된 블럭이 있는지 찾고, 연속된 블럭이면 체크(삭제해야할 블럭이라고 마킹(bDead))한다.
=> BlockCheck() 코루틴.
블럭체크 코루틴에서는 가로체크와 세로체크의 기능을 따로 분리해서 체크했습니다.
그 편이 가독성이 좋기 때문이죠.
우선 가로체크부터 보도록 합시다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | // 가로체크. for (int y = 0; y < iBlockY; y++) { for (int x = 0; x < iBlockX - 2; x++) { // 기준칸과 기준칸 + 1칸을 비교 검사. if (BlockBoard[x][y] == BlockBoard[x + 1][y]) { // 기준칸과 기준칸 + 2칸을 비교 검사. if (BlockBoard[x][y] == BlockBoard[x + 2][y]) { GameObject[] blocks = GameObject.FindGameObjectsWithTag("BLOCK"); foreach (GameObject block in blocks) { Block sBlock = block.GetComponent<Block>(); if (sBlock.iY != y) continue; if (sBlock.iX == x && sBlock.iY == y) { sBlock.bDead = true; continue; } if (sBlock.iX == x + 1 && sBlock.iY == y) { sBlock.bDead = true; continue; } if (sBlock.iX == x + 2 && sBlock.iY == y) sBlock.bDead = true; } } } } } | cs |
x는 열, y는 행으로 으로 보시면 되겠습니다.
0번째 행 0번째 열에는 2라는 값이 있습니다.
이 2라는 값이 연속되는지 확인하기 위해 위치(0,0) 기준으로 +1칸 +2칸째를 검사하도록 하겠습니다.
이런식으로 한칸 한칸을 기준칸으로 해서 +1칸 +2칸째를 검사하고
같다면 3개가 연속되므로 3개의 블럭의 스크립트의 bool변수인 bDead 변수를 true로 변환 합니다.
이렇게 모든 칸들의 블럭들을 체크 해주고, 체크가 끝나면 모든 블럭을 가져와 블럭의 bDead변수를 검사해 true인 블럭들을 삭제해주면 됩니다.
P.S
연속된 칸이 3칸이 아닌 4칸 이상 이여도 문제 없습니다.
왜냐하면 기준칸이 게속 달라지기 때문입니다.
한 번 체크가 끝난 칸이라고 해서 체크를 안하는게 아닙니다.
세로체크도 가로체크와 크게 다르지 않기 때문에 설명을 생략하겠습니다.
2. 전체 블럭을 가져와 체크(마킹)된 블럭이 있는지 찾는다.
=> NoMatch() 함수.
3. 마킹된 블럭 있다면 블럭을 삭제한다.
=> DeleteBlock() 함수.
'Unity3D > Project' 카테고리의 다른 글
[Unity3D] 헥사게임 만들기 네 번째 - 마우스 처리. (2) | 2018.03.09 |
---|---|
[Unity3D] 헥사게임 만들기 세 번째 - 블럭처리2. (2) | 2018.02.24 |
[Unity3D] 헥사게임 만들기 두 번째- 블럭보드 만들기2 (0) | 2018.02.13 |
[Unity3D] 헥사게임 만들기 두 번째 - 블럭보드 만들기. (0) | 2018.02.13 |
[Unity3D] 헥사게임 만들기 첫 번째 - 리소스 준비하기 및 캔버스 크기 설정. (0) | 2018.02.11 |
[Unity3D] 헥사게임 만들기 두 번째- 블럭보드 만들기2
※ 소스 출처 : 네이버 카페 - 유니티 허브 - 햐얀바람님.
0. 리소스 준비하기.
1). 배경 이미지.
2). 블럭보드의 배경 이미지.
3). UI테두리 이미지.
4). 블럭 이미지.
1. 캔버스 크기 설정하기.
- 게임뷰어 및 캔버스 크기 설정.
2. 블럭보드 만들기.
1). 블럭 프리팹 만들기.
아무래도 배경이 없는건 심심하니
기본적인 배경부터 넣고 블럭보드를 스크립트를 통해 만들어 봅시다.
(7).
하이러키 창에 빈 오브젝트를 하나 만들어 주고,
빈 오브젝트의 이름을 Map으로 하고 Transform컴포넌트를 Reset해 기본값으로 셋팅합니다.
이 오브젝트에는 배경 이미지 및 블럭보드의 배경 이미지 등이 자식으로 들어갈 겁니다.
(8).
프로젝트창 > 마테리얼 폴더 > 마테리얼을 하나 만들어 줍니다.
이름은 'BackGround'가 좋겠군요.
(9).
마테리얼의 셰이더를 Unlit > Texture로 바꿔 줍니다.
(10).
BackGround 이미지를 마테리얼에 드래그 하여 넣습니다.
(11.)
만들어 놓은 마테리얼을 클릭 한 뒤 Ctrl + D를 눌러 복사한 후.
복사된 마테리얼의 이름을 BlcokBoad_Bg로 바꾸고
ui_BackGround 이미지를 드래그하여 넣습니다.
(12).
마테리얼 작업이 완료되면 하이러키창에 Quad객체를 만듭니다.
이 객체안에 열심히 작업한 마테리얼을 넣어 배경을 만듭시다.
그리고 배경의 크기는 적당히 조절해 줍시다.
(13).
테두리는 월드상에 있는 오브젝트들이 이동해도 영향을 받지않게 캔버스(UI)에 작업해줍시다.
(14).
이제 위와같이 블럭이 만들어지도록 스크립트를 짜봅시다.
동영상을 따라해 봅시다.
동영상에서는 실수로 코드 한 줄을 빼먹었네요.
GameManager스크립트에 CreateBlock()함수에서 밑의 구문을 추가해주세요.
1 | BlockBoard[x][y] = iType; | cs |
1 2 | public int iBlockX, iBlockY; // 블럭보드의 가로 세로 크기. public int[][] BlockBoard; // 블럭보드. | cs |
블럭보드는 가로 세로의 크기를 받아 2차원 배열로 만들어 졌습니다.
그림으로 보자면 밑과 같은 그림이 되겠군요.
그렇다면 2차원 배열에는 어떤 정보가 들어갔을까요?
바로 블럭의 종류값이 들어갔습니다. 그림으로 보자면 밑과 같습니다.
이러한 값들이 들어간 이유는 같은 블럭이 3개이상 연속됐을 때 삭제해 주기 위함입니다.
실제 삭제를 위해서는 2차원 배열에 들어있는 값들을 비교하고 연속된 숫자가 나왔을 때
해당 위치에 있는 블럭을 삭제해야 합니다. 그러면 그 위치 값은 어디에 있을까요?
바로 블럭 자신이 가지고 있습니다.
블럭 스크립트의 일부분을 보면
1 2 | public int iX, iY; // 블럭의 위치. public int iType; // 블럭의 종류. | cs |
위와 같은 정보를 가지고 있습니다.
위치 뿐만 아니라 종류까지도 비교해서 검사하면 됩니다.
이 부분은 후에 '블럭삭제'부분에서 다룰려고 합니다.
블럭의 위치를 그림으로 보자면 밑과 같이 되어있습니다.
이렇게 된 이유는 2중 for문으로 블럭을 생성해줄 때 블럭보드의 가로 및 세로의 크기가
그대로 위치 정보로 들어갔기 때문입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | for (int y = 0; y < iBlockY; y++) { for (int x = 0; x < iBlockX; x++) { GameObject block = Instantiate(OriginBlock, new Vector3(x, y, 0), Quaternion.identity); block.transform.SetParent(transform); int iType = Random.Range(0, BlockType.Length); Block sBlock = block.GetComponent<Block>(); sBlock.iX = x; sBlock.iY = y; sBlock.iType = iType; sBlock.SetBlockImg(BlockType[iType]); BlockBoard[x][y] = iType; } } | cs |
그림으로 보자면 위의 2중 for문은 밑의 그림과 같은 순서로 생성시킵니다.
즉, 월드상의 블럭의 위치 값도 ( x , y, z )일 때 (0,0,0), (1,0,0), (2,0,0) ... 와 같이 셋팅 됩니다.
위의 정보를 봤을 때 블럭과 블럭의 사이에 거리가 1이 된다는 뜻인데, 블럭 이미지의 크기가 다를 경우에
밑과 같이 딱 나뉘어 떨어지지 않습니다.
그러한 사태를 방지하기 위해 리소스 준비단계에서 블럭의 크기를 100픽셀로 맞춰 만든 것입니다.
100픽셀 == 1 Scale == 1 Position 이라고 생각하면 헷갈림이 조금 덜 할듯 합니다.
다음은 블럭의 가로 세로 체크를 해보도록 하겠습니다.
'Unity3D > Project' 카테고리의 다른 글
[Unity3D] 헥사게임 만들기 세 번째 - 블럭처리2. (2) | 2018.02.24 |
---|---|
[Unity3D] 헥사게임 만들기 세 번째 - 블럭 처리. (0) | 2018.02.18 |
[Unity3D] 헥사게임 만들기 두 번째 - 블럭보드 만들기. (0) | 2018.02.13 |
[Unity3D] 헥사게임 만들기 첫 번째 - 리소스 준비하기 및 캔버스 크기 설정. (0) | 2018.02.11 |
[Unity3D] 인벤토리 [Part 4] - Load (3) | 2017.04.24 |
[Unity3D] 헥사게임 만들기 두 번째 - 블럭보드 만들기.
※ 소스 출처 : 네이버 카페 - 유니티 허브 - 햐얀바람님.
0. 리소스 준비하기.
1). 배경 이미지.
2). 블럭보드의 배경 이미지.
3). UI테두리 이미지.
4). 블럭 이미지.
1. 캔버스 크기 설정하기.
- 게임뷰어 및 캔버스 크기 설정.
2. 블럭보드 만들기.
1). 블럭 프리팹 만들기.
아래의 이미지까지 만들어 봅시다.
블럭 이미지를 모두 블랙설정한 뒤
Texture Type : Sprite (2D and UI)
Packing Tag : BLOCK
Pixels Per Unit : 100픽셀
위와같이 셋팅 후 Apply를 눌러준다.
(2).
실제로 블럭 하나를 만들기 위해
하이러키 창에서 마우스 오른쪽 클릭 후 Sprite를 만듭니다.
(3).
만들어진 Sprite의 Transform컴포넌트에 마우스를 갖다댄뒤 오른쪽 버튼을 클릭해 Reset을 눌러
Position,
Rotation,
Scale
위의 세 값을 기본값으로 만듭니다.
그리고 Sprite의 이름을 Block으로 바꿔줍니다.
(4).
다음은 블럭의 첫 번째 이미지를 Sprite Renderer컴포넌트의 Sprite에 드래그 해줌으로써 블럭을 하나 완성 시킵니다.
(5).
다음은 블럭의 태그를 정해줘야 합니다.
상단 메뉴중 Tag옆 'Untagged'라 써져있는 박스를 눌러
Add Tag를 누른뒤 'BLOCK'이라는 태그명을 추가해 줍니다.
※ 이렇게 태그를 정해주는 이유는 스크립트 상에서 특정 태그명을 가지고있는 객체를 모두 가져올 때 사용하기 위함입니다.
(6). 이렇게 하나의 블럭이 완성되었습니다.
이제 하이러키 창에 있는 블럭을 프로젝트창에 있는 Prefeb폴더에 드래그하여 넣어주시면 프리팹으로 만들어집니다.
그뒤 하이러키 창에있는 Block객체를 지워줍니다.
이제 이 블럭의 프리팹을 이용하여 블럭보드를 만들어 봅시다.
'Unity3D > Project' 카테고리의 다른 글
[Unity3D] 헥사게임 만들기 세 번째 - 블럭 처리. (0) | 2018.02.18 |
---|---|
[Unity3D] 헥사게임 만들기 두 번째- 블럭보드 만들기2 (0) | 2018.02.13 |
[Unity3D] 헥사게임 만들기 첫 번째 - 리소스 준비하기 및 캔버스 크기 설정. (0) | 2018.02.11 |
[Unity3D] 인벤토리 [Part 4] - Load (3) | 2017.04.24 |
[Unity3D] 인벤토리 [Part 4] - Save (3) | 2017.04.23 |