2022. 4. 22. 00:17ㆍDIY/[ RnD중][Unity] Project J
이번에는 저번 A* 알고리즘을 구현했던 것에 이어서
캐릭터에게 행동력을 부여하고 그에 따라 달라지는
이동 가능 범위를 구현해보겠다.
캐릭터에게 주어진 행동력이 10이고,
직선이동은 1의 비용, 대각선 이동은 1.4의 비용이라 했을 때,
갈 수 있는 범위는 다음과 같다.
원과 비슷하지만,
1 미만의 행동력으로는 이동할 수 없기 때문에
원과는 살짝 다르다.
위 그림은 행동력이 얼마나 남았는지에 따라
달라지는 이동 가능 범위의 패턴을 그린 것이다.
이제 코드를 통해 이 범위를 구현해보자.
행동력에 따라 이동 가능한 타일인지 판별하기
- 범위 탐색 시작하면 모든 타일들이 0의 값을 가지게 한다.
- 캐릭터가 현재 위치한 타일에 현재 행동력만큼의 수치를 부여함.
- 캐릭터 주변 8칸의 타일을 탐색해
(자신의 수치 - 해당 타일까지 가는데 소모되는 행동력)의 값이
해당 타일의 값보다 크면 그 값을 부여함. - 3의 과정을 마친 타일에서 다시 그 주변의 타일을 탐색해 범위를 넓혀나간다.
- 4를 반복하다가 행동력이 모자라 더 이상 갈 수 있는 타일이 없는 지경이 되었을 때
0이 아닌 타일들은 어떻게든 접근할 수 있는 이동 가능 타일임.
range 배열은 1의 과정을 위한 것이다.
AddNodeThenSortBy~()메서드는 A* 알고리즘을 위한 메서드지만
타일마다 특정 값을 부여하고 우선순위큐에 추가하는 기능이라
재활용하였다.
while문에서 우선순위 큐에 남아있는 타일이 없을 때까지 반복함으로써
캐릭터 주변 타일에서부터 행동력이 허락하는 한도까지
서서히 범위를 넓혀나가게 된다.
(행동력이 모자라 갈 수 없는 타일은 우선순위큐에 추가되지 않기 때문!)
위 그림처럼 이동 가능 타일이 계산되었다.
원래 5의 행동력으로는 녹색 테두리까지 이동이 가능하지만
벽에 가로막혀서 파란색 점 타일까지만 계산된 것까지도 정상적이다.
콘솔창에 나타나는 range[x, y] = n 은
해당 타일까지 이동 후 남은 행동력을 나타낸다.
이동 가능 범위를 UI스럽게 표현하기
https://www.youtube.com/watch?v=waEsGu--9P8&t=33s
5분 45초쯤부터 소개되는 그리드 타일에 텍스트 표시 법 참고하기
그 후 그리드 타일마다 값을 부여하는 법을 알려준다.
임의의 값을 주어 임의의 용도로 활용이 가능하다.
내 경우에는 테두리를 그릴 때 유용하게 사용될 듯 하다.
이 값으로 룰 타일 그리기?
+
이동 가능 범위만 쉐이더 뚜렷하게 만들고
이외의 지역은 흐릿하게 함으로써 자연스레 구분 가능해질 수도 있음.
XCOM2 방식 :
타일에 마우스를 올려놓으면,
이동 불가능은 표시 안함.
이동 가능은 경로와 타일 표시
-> 이를 위해 각 타일의 이동 가능 여부를 알려주는 2차원 배열 필요함.
배열에 접근해 값 확인 후, 표시해주기.
또한 그 배열로 이동 가능 범위도 표시 가능.
->
1. 이동가능타일 주변 탐색 후 이동가능 위치에 따라 프리팹 생성
2. 룰 타일 생성 후 비활성화/활성화 (타일맵 렌더러) (스프라이트 렌더러) (스프라이트 마스크)
룰 타일 항상 가지고 있다가 범위를 표시해야 할 때 스프라이트 마스크 ON or OFF
보드를 항상 0 이상의 포지션에 배치하고
마우스의 월드 포지션에 따라 타일의 값에 접근하기.
tile[1, 2] <- 이런 식으로.
타일 클릭을 못하게 가로막는 물체가 있으면 특정 키 눌러서
특정 타입의 오브젝트 표시 / 비표시
'DIY > [ RnD중][Unity] Project J' 카테고리의 다른 글
[Project J] 프로토타입 개발 플로우 (0) | 2022.04.12 |
---|---|
[Project J][R&D] 이동의 기본, A* 알고리즘 구현하기. (0) | 2022.04.09 |