- 모든 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 영역 위의 좌표
}
복수 영역을 허용하고 싶으면 |로 합칩니다.

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
'유니티' 카테고리의 다른 글
| Random.insideUnitSphere (0) | 2025.08.26 |
|---|---|
| NavMeshHit hit (0) | 2025.08.26 |
| NavMesh.SamplePosition (NavMesh에 존재하는 가장 가까운 점찾기) (0) | 2025.08.26 |
| Unity Tmp 텍스트 부분 색 변경 (0) | 2025.08.25 |
| 공지사항 API 서버 만들기 & 실무 확장 흐름 (0) | 2025.08.08 |