티스토리 뷰
드디어 본 작품의 기반 구상이었던 절차적 생성을 이용한 필드 무한 확장 기능을 작성했다.
사실 절차적 생성이라고는 해도 가장 간단한, 격자에 맞춰서 임의의 방을 채워 넣는 구조였지만.
거기다가 사전 생성도 아니고 플레이어의 이동에 맞춰서 그때 그때 생성하는 방식이라서 알고리즘도 간단했다.
그럼, 정리를 시작해 보자.
기본 로직
- 플레이어의 좌표를 기준으로 가로 혹은 세로가 특정 값의 배율이 될 때 마다 '방 이동 판정'을 시행한다.
- '다녀온 방' 리스트를 확인하여 변경된 좌표가 기록되어 있는 지 판단한다.
[좌표는 인스펙터 상의 좌표가 아닌, 방들의 위치를 지정하는 좌표를 사용한다.]- 기록되어 있다면 플레이어의 현재 좌표 만 갱신한다.
- 기록되어 있지 않다면 방 생성 알고리즘을 적용한다.
- 4면의 '통로'의 개폐 여부를 확인한다. 폐쇄 상태라면 판단을 종료한다.
- 개방 상태라면 해당 좌표에 방을 생성한다. 이 때에는 방 목록 중 랜덤으로 하나를 생성한다.
- 생성한 이후 몬스터와 기타 오브젝트들을 생성한다.
- 추가로, 생성된 방의 4면의 '통료'의 개폐여부를 판정, 그에 맞게끔 '벽'을 생성한다.
- 이 때, 이미 생성된 벽은 판단 기준에서 제외한다.
- '다녀온 방' 리스트를 확인하여 변경된 좌표가 기록되어 있는 지 판단한다.
로직 상으로는 상단과 동일하다.
본 프로젝트에서는 폐쇄 확률은 35%로 설정하였다.
로직 자체는 간단했기 때문에 구현 자체는 그리 오래 걸리지 않았다.
다만, '로직 이외'의 부분에서 문제가 다량 발생했었다.
트러블 슈팅
본작은 벽이나 기타 장해물이 존재하는 구성이다 보니, 당연하게도 직선 이동은 불가능하고, 경로 탐색 알고리즘을 사용해야 한다.
그래서 사용한 알고리즘이 NavMesh+ 였는데, 여기에서 문제가 발생했었다.
발생한 문제는 다음과 같았다.
- 방을 확장했는데, 각 방이 아닌 원점 방에서 몬스터가 등장하고 있었다.
- 이외에도 플레이어의 이동에도 몬스터가 반응을 하지 않았다.
- 위 두 사항을 통해서 'NavMesh가 갱신되지 않았고, 이로 인해서 위치가 초기화 되거나 이동 경로를 산정할 수 없게 되었다'는 결론을 도출했다.
그렇기에 방이 생성될 때 마다 NavMesh를 갱신하는 방식으로 수정하였다.
이렇게 하자 몬스터가 플레이어에게 반응을 했었으나, 아직도 생성 위치가 원점으로 변경되는 문제는 그대로 남아있었다.
그에 따른 추론으로 'NavMesh가 Bake 되는 동안에는 NavMesh가 잠시 동안 비게 된다'고 가정, 다음 작업을 진행하였다.
- 생성한 몬스터의 목록을 Field를 총괄하는 클래스에서 가지고 있도록 구성하였다.
- 이를 이용, NavMesh를 Bake 하는 동안에는 NavMeshAgent 컴포넌트를 모두 비활성화 했다가 Bake 된 이후에 다시 활성화 시키도록 구성하였다.
이렇게 구성하자 원점에서 생성되는 경우는 없어졌다.
다만, 그럼에도 불구하고 간헐적으로 몬스터의 위치가 이상한 위치로 이동하는 변상이 발생했다.
이에 'NavMesh의 Bake 속도가 느려서 그 사이에 NavMeshAgent가 오작동 하는 것이다'라고 가정, 다음 작업을 진행하였다.
- 플레이어의 좌표를 인자로 사용하는 Event를 추가하였다.
- 이 Event를 활용하여 각 방 마다 플레이어와의 좌표 상의 거리 차이에 따라서 방을 활성화 / 비 활성화 하도록 구성하였다.
이렇게 구성은 하였으나, 이번에는 비 활성화 된 방의 NavMesh도 계속 유지되고 있는 문제가 발생하였다.
때문에, 비 활성화 함수에 Navigation Modifier를 disable 시키는 구문을 추가하였다.
이렇게 구성하자, 상기한 문제는 더 이상 발생하지 않게 되었다.
사실 절차적 생성이라고 하기에도 다소 많이 간단한 구성이다.
실제로도 트러블 슈팅 내용도 전부 NavMesh의 실시간 갱신에 의해서 발생한 것이니 말이다.
그래도 내가 직접 만든 생성 알고리즘으로 맵이 실시간으로 생성되는 걸 보니 상당히 신기한 느낌이었다.
이제 프로젝트 마감 기간이 임박해 오고 있다.
그래도 프로젝트가 마무리 되고 있는 중이라, 어찌어찌 기간에 맞출 수는 있을 거 같다.
유저 테스트도 그렇고 할 일이 많이 남긴 했지만... 얼마 남지 않은 기간, 열심히 해 봐야겠다.
'스파르타 내일배움캠프 > 최종 프로젝트 리포트' 카테고리의 다른 글
최종 프로젝트 리포트 - 8 [빌드 - 유저 테스트 시작] (0) | 2025.01.13 |
---|---|
최종 프로젝트 리포트 - 7 [세이브 - 로드 시스템] (0) | 2025.01.09 |
최종 프로젝트 리포트 - 5 [중간 발표] (0) | 2025.01.07 |
최종 프로젝트 리포트 - 4 [컴포넌트 기반 오브젝트 풀] (0) | 2025.01.06 |
최종 프로젝트 리포트 - 3 [인벤토리 시스템] (1) | 2024.12.29 |