2024년 7월 08일 월요일 개발일지 / NevMeshAgent 충돌 무시하는 방법

2024. 7. 8. 21:22나의 개발자 기록/본 캠프 개발 일지

2024년 7월 08일 월요일


What I did today : NevMeshAgent 충돌 무시하는 방법

 

 

오늘은 기술 면접 대비 꾸준 실습 시간이 끝나고, 팀원분들이랑 아침 회의를 진행했습니다. 이번 주에 해야 될 것들 중에 생각나는 거 위주로 적어서 노선과 피그마에 정리를 해두었고, 각자 지난번에 했던 역할의 연장선으로 분담했기 때문에 저는 웨이브 진행 시 몬스터가 플레이어를 만났을 때 통과하지 않고 공격하는 로직을 만들어야 했습니다.

 

저는 이 로직에 필요한 요소가 무엇인지 제일 먼저 생각을 해보았습니다. 저희 게임이 명일방주의 게임 시스템을 가져왔기 때문에 캐릭터의 저지수(BlockCount)몬스터의 크기(Size)를 비교해서 몬스터의 크기가 더 크다면, 캐릭터를 지나가고 그렇지 않다면 멈춰서 공격하는 상황이 필요하다고 생각했습니다. 그래서 공격 여부를 통해서 상태 전환을 하는 것몬스터의 움직임을 멈춰야 하는 것, 그리고 저지수와 크기의 비교를 통해서 시스템 로직이 완성될 거라고 생각했습니다.

 

 

일단 먼저 다양한 함수를 매니저를 통해 참조할 수 있도록 몬스터를 캐릭터 매니저에 등록하고 작업을 이어나갔습니다. 그리고 움직임의 여부를 알기 위해, MonsterMovement 스크립트에 Bool 값 함수를 만들었습니다. 다른 팀원이 작업하셨던 내용이기도 하고 몬스터의 움직임이 AI 네비게이션으로 운영되는지라  agent의 velocity에 접근해서 sqrMagnitude를 통해서 움직임을 판단했습니다.

 

private bool isAttacking;

public void StartAttacking()
{
    isAttacking = true;
}

public void StopAttacking()
{
    isAttacking = false;
}

public bool IsAttacking()
{
    return isAttacking;
}

 

그다음 작업으로는 몬스터의 공격 여부를 판단하고 상태 머신에서 사용하기 위해 Monster 클래스에 Bool과 관련된 함수들을 만들었습니다. 그러고 나서 AttackState에 적용을 시킨 후, MonsterMovement의 Update 부분에 공격하는 중이라면 return 하도록 만들었습니다. 또한 agent.isStopped와 관련된 함수를 만들어서 공격 상태 머신의 EnterExit에 적용하였습니다. 그런데 Update 문을 return 해도 몬스터들이 움직이는 문제가 생겼습니다. 이 문제는 Update 문에서 return 하는 게 아니라 경로를 설정하던 함수에서 움직이는 것이었기 때문에 저는 그쪽에다가 몬스터가 공격하는 중에는 멈추도록 설정했습니다.

 

 

점심을 먹고 나서는 2시에 2D TileMap과 관련된 강의가 있어서 들었고, TileRule이나 설치하는 방법 등등 유의미한 시간이었습니다. 그다음 작업으로는 기존에 있던 적을 탐색해서 상태 전환을 하는 로직에 추가로 캐릭터의 BlockCount와 몬스터의 Size를 비교하는 조건문을 추가하였고, AttackStateEnter에는 빼는 공식을 넣어놓고, Exit에는 더하는 공식을 넣어서 구현했습니다. 또한 몬스터끼리는 충돌이 일어나면 안 되기 때문에 레이어 프로젝트 세팅으로 해제를 했습니다.

 

 

작업을 다하고 나서 테스트를 해보는데, 충돌 무시를 했음에도 몬스터가 이동이 되는 문제와, 콜라이더를 삭제했음에도 몬스터가 이동한다는 점을 미루어볼 때 Ai 네비게이션 기능NevMeshAgent의 문제가 확실시되었습니다. 저는 이 문제를 팀원분들과 공유하면서 어떻게 할지 생각하다가 튜터님을 찾아서 상담을 받아봤습니다. 여러 가지 해결책을 해보았지만 다 안되었고, 튜터님께서 검색을 통해 NevMeshAgentquality를 None으로 한다면 몬스터끼리 충돌하지 않는다는 것을 알게 되어 바로 적용하였습니다.

 

 

남은 시간에는 유닛에 적용할 에셋을 찾아보면서 시간을 보냈고, 저녁을 먹은 뒤에, 또 에셋을 여러 방면으로 찾아봤지만, 저희가 원하던 4방향의 미소녀 캐릭의 2D Pixel은 찾기가 힘들었습니다. 일단 8시부터는 TIL을 쓰면서 팀원분들과 이야기를 했고, 좋은 에셋을 찾지 못한다면 최대한 할 수 있는 선에서 만들어보자는 이야기로 오늘 하루를 마무리했습니다.