본문 바로가기

카테고리 없음

UNITY 게임개발트랙 - 내일배움캠프 55일차 TIL

내일배움캠프 55일차 TIL

오늘도 오전에 기술면접 예상질문을 풀어보고 팀 프로젝트 개발을 진행했다.

가비지 컬렉션

C#은 개발자가 메모리를 직접 관리할 필요가 없도록 메모리 관리를 자동화하기 위해 가비지 컬렉션 기능을 제공한다. 객체를 생성할 때 자동으로 메모리가 할당되는데, 해당 객체가 필요하지 않을 때, 가비지 컬렉터가 개발자 대신 할당된 메모리를 해제하는 작업을 수행한다. 더 이상 참조되지 않는 객체를 찾아서 자동으로 메모리를 해제하는 방식이다. 가비지 컬렉션이란 해당 작업을 의미하며, 이 작업을 수행하는 주체가 가비지 컬렉터이다.

팀 프로젝트 개발 - 절차적 맵 생성 : 맵 구조 다양화, 버그 수정

맵을 생성할 때, 한쪽 방향으로만 생성되는 버그가 있었다. 방 하나를 생성하면, 이전 방과 연결된 문을 제외하고 나머지 문들을 기준으로 방을 생성하는 메서드를 재귀호출하는데, 하나의 문에서 시작된 호출스택이 꼬리에 꼬리를 물어 최대 방 개수에 도달하여 나머지 문들로부터는 방을 생성하지 않는 현상이었다. 그래서 하나의 문으로부터 생성될 수 있는 최대 방 개수를 제한하고, 또한 문들의 배열을 반복문을 호출하기 전에 무작위로 섞어서 설령 일부 문으로부터 방이 생성되지 않더라도 그 전에 방을 생성하는 방향은 다양하게 뻗어나갈 수 있도록 했다. 하지만 이 방법으로 맵이 이전보다 다양항 구조로 생성되긴 했으나, 근본적인 해결책은 아니었다.

방 프리팹들은 대부분 상하좌우로 뻗어나갈 수 있는 통로가 있다. 때문에 최대 방 개수에 도달하여 맵 생성이 종료되면, 플레이어 및 몬스터가 맵 밖으로 이탈하는 것을 막기 위해 일부 뚫려있는 방들의 통로를 막아줄 필요가 있었다. 이를 구현하기 위해 현재 맵에 존재하는 연결되지 않은 문들의 배열을 GameObject.FindGameObjectsWithTag("Door")메서드를 통해 구하고, 배열 내의 모든 문들에 foreach문을 통해 검사하며 알맞은 방향의 막다른 방을 연결해서 막아주는 방식으로 구현하려고 했다. 하지만 오른쪽 방향의 구명은 잘 메워진 반면, 나머지 방향의 구멍들은 전혀 메워지지 않는 현상이 발생했다. 디버깅을 해보니 해당 방향의 문들이 연결되지 않은 상태임에도 불구하고 연결 여부를 나타내는 변수가 참값이 되어 있었다. 몇시간의 디버깅을 거쳐 결국 참조의 문제임을 알아냈다. 방을 연결하고, 이때 사용된 문들의 IsConnected값을 true로 변경해주는데, 생성된 방 오브젝트에 있는 문이 아니라 방 프리팹에 있는 문을 참조한 상태에서 변수값을 변경해버려서 일어난 현상이었다. 오늘 안에 해결해서 다행이다...

어제 만든 절차적 맵 생성 알고리즘

  • 플레이어의 동선이 굉장히 선형적이고, 일부 방이 뚫려있는 모습을 확인할 수 있다.

오늘 수정 후

  • 어제 만든 버전보다 맵 구조가 복잡하고, 방들이 모두 잘 닫혀있다.