선택한 블럭을 상하좌우로 드래그하면 드래그한 방향의 블럭과 교환한다.
이를 위해 각 노드들은 터치 입력을 받아야 하고, 조건에 맞을 때 블럭을 교환할지, 말지 결정한다.
코드상에서 어떠한 시점에만 터치입력을 받아 처리하는 함수를 짜면 안된다.
터치입력의 정보는 항상 받고 있어야 한다
최종적으로 이동 처리를 하게 될 Board 스크립트에 드래그가 시작되는 노드와 끝나는 노드의 정보를 저장할 변수를 선언해준뒤, 터치입력을 처리할 Node 스크립트에서 항상 이 변수들을 갱신해준다
Node 스크립트에는 별도로 유효한 드래그인지 최소 거리를 결정하는 변수와,
드래그의 방향을 판단할 때 쓸 변수들을 선언해준다.
우리는 현재 모든 오브젝트가 UI 오브젝트로 이루어져있으므로 일반적으로 마우스입력을 받을 수 없고, IPointer들을 상속받아 처리해줘야 한다.
IPointerDownHandler가 요구하는 OnPointerDown 함수를 선언해준다. 정확히 해당 이름의 함수를 선언하지 않으면 오류나니 주의한다.
클릭 시작이 감지되면 Board에 선언해준 변수에 현재 노드의 point값을 전달하여 시작 노드의 인덱스를 쓸 수 있게 한다.
또한 현재 마우스 좌표를 저장하여 드래그 방향 판독에 사용한다.
클릭을 풀었을때 동작이다
클릭이 끝난 시점의 마우스 좌표를 저장하여 x축과 y축의 이동거리를 각각 구해준다
둘다 기준치 미만이면 클릭을 취소한것이라 판단하고 board에 동일 노드를 전달해준다.
Board는 dragStartNode와 dragEndNode가 같은 값이 되면 Swap이 동작하지 않는다.
수평과 수직중 어느방향으로 더 많이 드래그됐나 판단한 후, 좌우 혹은 상하 방향을 부호로 판단하여 최종적으로 하나의 방향을 결정한다.
NeighborNodes 배열에는 상하좌우 인접 노드의 정보가 들어있고, 범위 밖은 null이 들어있으므로 알아서 인접노드가 들어가 Swap이 시작되거나 동일 노드가 전달되 Swap이 동작하지 않을것이다.
Board 스크립트의 SwapBlock 함수가 Swap을 컨트롤한다.
Board에 전달된 시작노드의 값과 끝노드의 값이 같거나, null이면 실행하지 않는다.
또한 우리는 8x8화면을 사용하지만 자연스러운 이동을 위해 구현은 8x16으로 되어있으므로
아래쪽 절반에만 swap이 작동하도록 범위를 제한해준다.
Swap을 실행해준 후 시작, 끝노드를 null로 초기화한 후 moving을 false로 바꿔준다
참고로 moving은 블럭들이 움직일때 중복입력이 되는것을 방지하도록 모든 움직임에 moving이 true로 되고
끝날때 false가 되도록 해주고 있다.
Swap함수는 실질적으로 두 노드에 위치한 Block 데이터를 교환한다.
MoveToNode로 각각의 노드의 목적지를 서로를 향하게 설정해주고
Node의 placedBlock를 바꿔줌으로써 실질적인 block 데이터를 교환한다.
그리고 StartMove를 실행함으로서 화면에 표시되는 게임오브젝트가 서로 교환된다.
Board의 SwapBlock 함수가 추가되었다.
moving 함수가 false인 상태일때만 swap을 시작하도록 했다.
물론 입력은 node에서 항상 받아 board에 전달하고 있는 상태이므로 먼저 드래그를 했다 해도, 모든 움직임이 끝난 후 바로 Swap이 시작될 것이다. 의도하진 않았지만 이쪽이 조작감이 더 좋을 것 같다..
깔끔하게 잘 구현된 것 같다. 이동 코루틴을 한번 짜두니 얼마나 편리한지..
원래 클릭이나 드래그는 어려움이 없으리라 생각했는데 UI 오브젝트들은 마우스 입력 받는방식이 달라서 방법찾는데 엄청나게 고생했다. 또한 곂쳐있는 UI들은 렌더링상 맨 앞에 있는 오브젝트만 클릭으로 인식하므로 렌더링 순서를 결정하는 방법을 찾아다니느라 시간을 많이 썼다. 하이라이어키상에서 오브젝트 순서만 바꿔주면 끝나는 문제인걸 깨닫고 허탈했다..
이제 매 루프마다 블록들을 검사해서 족보에 맞는 이동이면 블럭을 삭제해주고, 이동해도 족보에 맞지 않으면 원래대로 swap해주는 처리를 해줄 것이다.
'Unity 게임개발' 카테고리의 다른 글
3. 블럭 스왑과 상태 검사 (0) | 2025.02.01 |
---|---|
1. 게임화면 구성 (0) | 2025.01.11 |
0. 유니티 밍글맹글 만들기 (0) | 2025.01.11 |
기획 - 1. 장르 정하기 (0) | 2023.08.04 |
팀프로젝트 진행 - 1 (0) | 2023.08.04 |