avatar
Brocolling's Blog

퍼즐 게임 제작 - 2

퍼즐 버블 스타일 게임 제작 - 2
PuzzlePuzzleBubbleBFS
4 months ago
·
8 min read

안녕하세요!
오늘은 이전 아티클에 이어서 작업 포스팅을 남겨보려합니다!

이번 포스팅엔, 아래 두 개만 완성하고 최종 결과물까지 올려보겠습니다!
1. 인접 구슬 파괴 로직 구현
2. 위에 연결된 구슬이 없을 경우, 이하 아래 모든 구슬 파괴로직 구현 ( 중력 )

인접 구슬 파괴 로직 구현

사실 탐색 로직으로는 여러가지 방법으로 구현할 수 있다고 생각하고 있습니다.
이런 게임의 경우는 주변 탐색을 먼저 하는게 효율적이라고 생각해서 저는 BFS 를 선택하여 구현했고, 당연하지만 DFS도 가능할 거에요.
이런 구슬을 레일 태우는 형식이 아니라, 미리 게임보드를 만들어서 베이스를 만들어둔 구조라면, 아래로 뻗어나가는 구조로 부모를 찾아가는 탐색 방식인 BST 등이 가능할 것으로 보입니다.

사실 제일 먼저 생각난 부분은 모두 부모와 2개의 자식을 연결하는 BST 형식으로 생각했는데, 구현하려는 내용이 트리로 매핑하면 너무 컨트롤하기 어려워서 게임보드 안만들고 BFS 형식으로 진행했어요.

먼저 BFS 의 개념은 이전에 포스팅한 내용이 있는데, 링크를 들어가보시면 간단하게 설명해두었습니다.

플로우는 다음과 같습니다.
1. 각 구슬의 타입을 RED, YELLOW, BLUE 로 설정
2. 내가 선택한 구슬의 GameObject 값을 기준으로 탐색할 버블의 리스트를 가져온다.
3. 내 주변의 버블을 큐에 담아두고, 내 기준 Position 에서 지름(r = 0.55f) + 오차(0.2f)내에 있는 버블들 중 내가 선택한 컬러 타입과 같은 버블은 파괴 예정 리스트에 넣는다.
4. 이렇게 파괴 예정 리스트가 최소 폭발 갯수 (3개) 이상이라면 파괴를 확정하고 파괴 시킨다.

until-1239

여기서 1,2,3 기준으로 파괴 예정 리스트에 넣을 거에요.
1,2,3 으로 해도 상관없고 1,3,2 로 터져도 상관은 없습니다.
어차피 지름 내 같은 컬러는 다터져야해서 다 탐색을 하긴 해야해요.
결과는 아래와 같습니다.

until-1240

의도한대로, 3개를 클릭 했을 때 잘 터지고 있네요.

위에 연결된 구슬이 없을 경우, 이하 아래 모든 구슬 파괴로직 구현 ( 중력 )

사실 이 부분을 만들면서 엄청 많이 고민했습니다.
이 부분 때문에 게임 보드판을 만들어서 트리처럼 만들어서 확인을 해야하나 싶기도했고,
터진 기준으로 윗 부분에 가로형 레이를 쏴서 없다면 중력 적용을 해서 파괴를 할까 싶기도 했습니다.

여러가지 방법들이 있을 것이지만, 제가 만드는 스테이지는 일반적인 퍼즐버블의 스테이지랑은 조금 거리가 있어서 스폰을 담당하는 스포너 기준으로 상위부터 쭉 탐색을 진행하고, 탐색한 리스트에 없으면 연결된 버블이 없는 것으로 판단, 즉 떨어져 있는 부분으로 판단하여 파괴하는 로직을 작성하여 중력을 적용하였습니다.

구상도는 아래와 같습니다.

until-1241

그림판이라 이해가 어려울 수도 있는데, 설명해보면, 아래 주황색 그룹이 버블이 3개가 탐색되어 터집니다. 이 버블은 중력 탐색 이전에 파괴하고 넘어가야 이상한 연산이 진행되지 않아, 확실히 파괴하고 없는 상태에서 스포너의 우측 기준 Start 버블로부터 시작하여 탐색을 시작합니다.
왼쪽은 똑같아서 생략했는데, 왼쪽도 같이 시작해줍니다.

계속 탐색하게되면 결국 Pop Group이 비어있는 관계로 BFS Group 만 탐색이 됩니다.
이후에, 탐색된 버블에 존재하지 않을 시, 중력을 적용하여 파괴하도록 합니다.

터진 부분을 기준으로 탐색하는 이런 방법도 가능은 한것 같다고는 생각해요.

until-1243

설명을 해보자면, 터진 기준으로 큰 원을 만들어서 주변에 내부에 들어오는 버블을 가져와서 있는지 탐색하는 것 입니다.
당연하게도 아래는 중력을 같이 받는 입장이니까 UP 벡터와 방향벡터의 각도를 구하면 굳이 ArcCos 의 0 ~ 180 각도로도 좌측으로 가던, 우측으로 가던, 90도 이상(정확히는 우상단 좌상단 체크이기 때문에 50도 정도면 된다고 생각) 은 모두 필터링 해버리면 되니까 내적으로만해서 구하면 쉽게 필터링 될것 같네요.
단, 이렇게 탈락한 친구들은 파괴 예정 리스트에 넣어서 파괴할 준비를 해야합니다.

이게 전체의 버블을 탐색하여 리스트를 만들고 O(N^2) 의 시간복잡도를 갖는것보다는 훨씬 합리적이라고 생각합니다.

현재 게임에 적용된건 1번이긴 하지만 차차 다듬어가면 되겠네요.

핵심 로직 끝, 결과는?

퍼즐 버블 스타일의 게임을 간단하게 3일도 안되는 시간으로 타이트하게 구현을 해보았습니다.
이펙트도 달고, 배경도 바꿨는데, 나름 부족한 부분도 있지만, 시간대비 게임의 형태는 나온것 같아 만족스럽습니다.

until-1244until-1245

이렇게 이번엔 퍼즐게임 만들어 보았고, 긴 글 읽어주셔서 감사합니다!


- 컬렉션 아티클






Dotorings,