본문 바로가기
프로그래밍/유니티

Unity NavMesh #1 에이전트 장애물 충돌 회피

by 넋두리- 2021. 2. 2.

안녕하세요 넋두리입니다^^

 

어떻게 포스팅을 시작해야 할 지 고민만하다가 수개월이 지났네요.....

고로 그냥 주먹구구라도 포스팅하기로 했습니다.

 

어차피 구글링 할 때에 영어로 찾는 경우가 많기 때문에 영어로 된 용어를 아는 것이 도움이 되기 때문에

혼용해서 사용하겠습니다. 양해 바랍니다.

 

오늘은 네비메시 파헤치기 첫번째 단계로 내비메시 위에서 동작하는 NavMeshAgent 컴포넌트의 프로퍼티 중 장애물 회피(Obstacle Avoidance)를 살펴보려고 합니다. 캐릭터 겹침, 밀어내기, 회피 등의 문제 해결에 사용됩니다.

장애물 회피
Quality 장애물 회피 품질입니다. 에이전트의 수가 많다면 장애물 회피 품질을 줄임으로써 CPU 시간을 절약할 수 있습니다. 회피를 없음으로 설정할 경우 충돌만 해결할 수 있을 뿐 다른 에이전트와 장애물에 대한 적극적인 회피는 하지 않습니다.
Priority 낮은 우선 순위의 에이전트는 이 에이전트의 회피 대상에서 제외됩니다. 값은 0에서 99사이에서 설정되어야 하며 낮은 숫자가 높은 우선 순위임을 의미합니다.

(출처 : 유니티 도큐먼트 docs.unity3d.com/kr/current/Manual/class-NavMeshAgent.html)

 

Quality 설정에는 NoObstacleAvoidance, LowQualityObstacleAvoidance, MedQualityObstacleAvoidance, GoodQualityObstacleAvoidance, HighQualityObstacleAvoidance 이렇게 5단계가 있는데 각 단계마다 장애물 회피에 대한 정도를 세팅하는 값입니다.

namespace UnityEngine.AI
{
    //
    // 요약:
    //     Level of obstacle avoidance.
    [MovedFrom("UnityEngine")]
    public enum ObstacleAvoidanceType
    {
        //
        // 요약:
        //     Disable avoidance.
        NoObstacleAvoidance = 0,
        //
        // 요약:
        //     Enable simple avoidance. Low performance impact.
        LowQualityObstacleAvoidance = 1,
        //
        // 요약:
        //     Medium avoidance. Medium performance impact.
        MedQualityObstacleAvoidance = 2,
        //
        // 요약:
        //     Good avoidance. High performance impact.
        GoodQualityObstacleAvoidance = 3,
        //
        // 요약:
        //     Enable highest precision. Highest performance impact.
        HighQualityObstacleAvoidance = 4
    }
}

 

인스펙터에는 None, Low Quality, Median Quality, Good Quality, High Quality와 같이 간단하게 나옵니다.

회피 품질 설정(Obstacle Avoidance Quality Setting)

 

Obstacle Avoidance 세팅에 따른 결과 값에 대한 결과물을 아래 하나씩 정리해봤습니다. 필요한 요구사항에 맞춰서 세팅하시면 될 것 같습니다.

 

우선 Priority가 동일한 값 일 때, Quality 세팅에 따른 결과입니다.

이동하는 초록색 캡슐 객체가 Agent A, 멈춰있는 빨간 캡슐 객체가 Agent B입니다.

 

1. Agent A = None, Agent B = None으로 세팅 : 충돌 회피를 하지 않음

Unity NavMeshAgent Obstacle Avoidance Quality Setting - Agent A = None, Agent B = None으로 세팅

 

2. Agent A = High Quality, Agent B = None으로 세팅 : A가 이동할 때 B를 뚫지 못하고 피해서 간다.

Unity NavMeshAgent Obstacle Avoidance Quality Setting - Agent A = High Quality, Agent B = None으로 세팅

 

3. Agent A = None, Agent B = High Quality로 세팅 : A의 이동에 따라서 B가 적극 회피를 해서 밀려난다.

Unity NavMeshAgent Obstacle Avoidance Quality Setting - Agent A = None, Agent B = High Quality로 세팅

 

4. Agent A != None(Low Quality ~ High Quality), Agent B != None(Low Quality ~ High Quality)으로 세팅 : 회피의 정도가 다를뿐 None이 아닌 것으로 세팅되어 있으면 어쨋든 A의 이동에 의해서 B가 밀려난다.

Unity NavMeshAgent Obstacle Avoidance Quality Setting - Agent A != None, Agent B != None으로 세팅

 

마지막 테스트를 통해서 같은 Priority 값이 세팅되어 있는 한, Quality 세팅이 None이냐 None이 아니냐에 따라서 결과 값이 매우 상이함을 알 수 있습니다.

 

NavMeshAgent가 동일한 Priority 값을 가질 때, Quality 세팅에 대해서 정리하자면,

1. Agent A, B 모두 None
Agent 간의 회피가 일어나지 않으므로 Agent끼리 서로 뚫고 지나갈 수 있다.

2. Agent A != None, Agent B = None
Agent A는 Agent B를 회피해서 이동한다. 뚫고 지나갈 수 없음.

3. Agent A = None, Agent B != None
Agent A가 다가오면 Agent B가 회피를 한다.
즉, Agent A는 회피하지 않지만 Agent B가 회피해서
마치 밀어내면서 지나가는 것처럼 보인다.

4. Agent A != None, Agent B != None
Agent A와 Agent B는 서로 회피를 시도해서 밀면서 지나갈 수 있다.

 

 

그럼 다음은 Priority 값에 따른 차이점을 살펴보자. Priority는 0~99 사이 값으로 세팅이 가능하며, 숫자가 낮을수록 우선순위가 높음을 의미한다.

 

1. Agent A = 49~50, Agent B = 50으로 세팅 : Agent A가 지나갈 때 B가 회피를 한다(B가 밀려난다).

Unity NavMeshAgent Obstacle Avoidance Priority Setting - Agent A = 49~50, Agent B = 50으로 세팅

2. Agent A = 51, Agent B = 50으로 세팅 : Agent A는 B를 회피해서 지나간다(B가 밀려나지 않음).

Unity NavMeshAgent Obstacle Avoidance Priority Setting - Agent A = 51, Agent B = 50으로 세팅

 

NavMeshAgent가 서로 상이한 Priority 값을 가질 때, 정리하자면

1. Agent A가 Agent B와 동일하거나 더 낮은 Priority
Agent A가 지나갈 때 Agent B는 회피한다(밀려난다).

2. Agent A가 Agent B보다 낮은 Priority
Agent A가 지나갈 때 Agent B를 회피해서 지나간다(밀어내지 못함).


충돌에 관해서는 프로젝트마다 혹은 프로젝트 안에서도 객체마다 처리가 되길 원하는 방식이 다르기 때문에 그에 맞춰서 세팅을 해주면 될 것 같습니다.

 

3D MMORPG를 예로 들면, '내 플레이어는 몬스터를 밀어내면 안되지만, 몬스터는 내 플레이어를 밀어낼 수 있어야 한다'를 세팅하기 위해서 내 플레이어와 몬스터의 Obstacle Avoidance의 Quality와 Priority 값을 다르게 세팅해야겠지요.

 

위의 내용은 크게 어려운 부분이 없지만, 직접 해보지 않으면 헷갈릴 수 밖에 없는 부분이기 때문에 샘플프로젝트를 만들어서 테스트해보기를 권장합니다^^

 

그럼 조금이나마 제 포스팅이 도움이 많이 되었기를 바랍니다.

댓글