본문 바로가기
유니티

NavMesh.AllAreas/ NavMesh.GetAreaFromName

by 유니티세상 2025. 8. 26.
반응형

 

  • 모든 Area를 포함하는 비트마스크 상수예요. (사실상 “필터링 없음”)
  • 특정 Area만 대상으로 하고 싶다면:
     
    int walkable = 1 << NavMesh.GetAreaFromName("Walkable"); // 여러 개를 합치고 싶다면 int slow = 1 << NavMesh.GetAreaFromName("Slow"); int mask = walkable | slow;

 

  • 참고: AllAreas로 샘플링하면 걷기 비허용 Area 위 좌표도 나올 수 있어요.
    그 경우 에이전트가 실제로는 그 지점까지 못 갈 수 있으니, 위의 경로 검사로 거르세요.

 


NavMesh.GetAreaFromName("Slow") 는 네비메시 “영역(Area)” 이름을 숫자 인덱스로 바꿔주는 함수

Unity의 NavMesh에는 “Area”라는 개념이 있고 기본으로 Walkable / Not Walkable / Jump 등이 있어요.

여기에 사용자가 직접 “Slow”, “Restricted” 같은 커스텀 Area를 추가할 수 있습니다.

  • (에디터) Window > AI > Navigation → Areas 탭에서 +로 새 Area 생성 → 이름을 “Slow”로 지정하고 Cost(비용)도 설정
  • 또는 NavMeshComponents 사용 시에도 같은 “Areas” 목록을 공유합니다. (스크린샷의 NavMesh Surface도 이 목록을 사용)

스샷의 Default Area = Walkable 은 “이 Surface로 베이크될 기본 영역이 Walkable”이라는 뜻입니다.
특정 오브젝트/구역만 “Slow”로 굽고 싶다면 그 오브젝트에 NavMeshModifier(Override Area=On, Area=Slow) 를 주거나, 공간으로 지정하려면 NavMeshModifierVolume을 배치한 뒤 다시 Bake 하세요.

 

int slowIdx = NavMesh.GetAreaFromName("Slow");     // "Slow" 영역의 인덱스
int slowMask = 1 << slowIdx;                       // 비트마스크

// 예) 랜덤 점을 "Slow" 영역에서만 샘플
if (NavMesh.SamplePosition(randomPos, out NavMeshHit hit, 2f, slowMask))
{
    // hit.position은 Slow 영역 위의 좌표
}

 

복수 영역을 허용하고 싶으면 |로 합칩니다.

 
int walkable = 1 << NavMesh.GetAreaFromName("Walkable");
int slow = 1 << NavMesh.GetAreaFromName("Slow");
int mask = walkable | slow; // 두 영역 모두 대상으로 샘플
 


Navigation > Areas 탭에 보이는 “Name” 목록(Walkable, Not Walkable, Jump, User n …)이 그대로 코드에서 NavMesh.GetAreaFromName("<이름>")로 찾는 대상입니다.

  • GetAreaFromName("Walkable") → 해당 Area 인덱스(int) 반환 (기본으로 Walkable=0, Not Walkable=1, Jump=2)
  • 못 찾으면 -1 이 나와요(문자열 정확히 일치해야 함).

그 다음 보통 이렇게 비트마스크로 바꿔서 API에 넘깁니다:

int slowIdx  = NavMesh.GetAreaFromName("Slow");
int slowMask = 1 << slowIdx;                       // 단일 영역
int mask     = (1 << NavMesh.GetAreaFromName("Walkable")) |
               (1 << NavMesh.GetAreaFromName("Slow"));     // 여러 영역 OR 결합

헷갈리기 쉬운 포인트

  • Areas 탭에서 이름/Cost를 만든 뒤 그 이름을 GetAreaFromName에 넣는 거예요. (프로젝트 전역 공유)
  • NavMesh Surface의 Default Area도 이 같은 목록을 사용합니다.
  • 특정 지형/공간에 Area를 적용하려면 NavMeshModifier / NavMeshModifierVolume으로 “Override Area=On, Area=Slow” 식으로 지정하고 Bake해야 실제 NavMesh에 반영돼요.
  • Not Walkable은 애초에 NavMesh가 생성되지 않으니 샘플/경로 대상이 아닙니다.
  • Area Cost는 “경로 탐색 가중치”일 뿐, 에이전트 속도는 자동으로 느려지지 않아요(속도를 바꾸려면 별도 로직 필요).

간단 예: “Slow” 구역에서만 점 뽑기

int slowMask = 1 << NavMesh.GetAreaFromName("Slow");
if (NavMesh.SamplePosition(rand, out NavMeshHit hit, 2f, slowMask)) {
    // hit.position은 Slow 영역 위
}

예외 처리(이름 오타 방지):

int idx = NavMesh.GetAreaFromName("Slow");
if (idx < 0) Debug.LogError("Area 'Slow'가 없습니다. Areas 탭에서 생성/이름 확인!");

 

https://docs.unity3d.com/6000.2/Documentation/ScriptReference/AI.NavMesh.AllAreas.html

 

 

https://docs.unity3d.com/Packages/com.unity.ai.navigation@2.0/manual/AreasAndCosts.html

 

 

 

반응형