Unity/RTS
Navigation Mesh
sehunbang
2025. 10. 4. 19:15
๐น ํน์ง
- ๊ธธ์ฐพ๊ธฐ์ฉ ๋ฐ์ดํฐ ๊ตฌ์กฐ
- Terrain / Collider ๊ทธ๋๋ก ์ฐ์ง ์๊ณ ,
- ์บ๋ฆญํฐ๊ฐ ์ค์ ๋ก ๊ฑธ์ ์ ์๋ ์์ญ๋ง ์ถ์ถํด ๋ง๋ ํด๋ฆฌ๊ณค ๋คํธ์ํฌ
- ํฌํจ: ๊ณ๋จ, ์ธ๋
- ์ ์ธ: ๋ฒฝ, ์ ๋ฒฝ, ์ฅ์ ๋ฌผ ์
- ๊ฒฝ๋ก ํ์
- A* / Dijkstra ์๊ณ ๋ฆฌ์ฆ ์คํ
- NavMesh ์์์ ๋ชฉ์ ์ง๊น์ง ์ต์ ๊ฒฝ๋ก ๊ณ์ฐ
- ์บ๋ฆญํฐ๋ ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ผ ์์ฐ์ค๋ฝ๊ฒ ์ด๋
- ๋์ ์ฒ๋ฆฌ
- ์ฅ์ ๋ฌผ ์ด๋, ๋ฌธ ์ด๋ฆผ/๋ซํ → NavMesh Obstacle ๋ก ์ค์๊ฐ ์ ๋ฐ์ดํธ
๐น ์ ํ์ํ๊ฐ?
- ๋จ์ Grid ๊ธฐ๋ฐ ๊ฒฝ๋ก ํ์ → ๋ถ์ ํ, ๋นํจ์จ์
- NavMesh → ๊ณต๊ฐ์ ์ต์ ํ๋ Polygon์ผ๋ก ํํ
- โ ๋น ๋ฅธ ๊ฒฝ๋ก ๊ณ์ฐ
- โ ๋ถ๋๋ฌ์ด ์์ง์
๐น ํ์ฉ ์์
- RTS → ์ ๋๋ค์ด ์๋ก ๋งํ์ง ์๊ณ ์ต๋จ๊ฑฐ๋ฆฌ ์ด๋
- RPG/์ก์ → NPC๊ฐ ์ฅ์ ๋ฌผ ํผํด ์์ฐ์ค๋ฝ๊ฒ ์ด๋
- ์คํ ์ค ๊ฒ์ → AI๊ฐ ๋ฒฝ/๊ตฌ์กฐ๋ฌผ ํํผํ๋ฉฐ ํ๋ ์ด์ด ์ถ์
๐ ์ ์
NavMesh = "์บ๋ฆญํฐ๊ฐ ๋ค๋ ์ ์๋ ์์ญ์ ํด๋ฆฌ๊ณค์ผ๋ก ํํ, AI๊ฐ ๊ธธ์ ์ฐพ์ ์ ์๋๋ก ํ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ"
๐ฐ NavMesh์์ Cost ๊ฐ๋
๐น ๊ธฐ๋ณธ ์๋ฆฌ
- A* ํ์ ์ ๋น์ฉ(cost) = ์ด๋ ๊ฑฐ๋ฆฌ + ์์ผ๋ก ์์ ๊ฑฐ๋ฆฌ
- ๊ฐ์ฅ ์ด ๋น์ฉ์ด ๋ฎ์ ๊ฒฝ๋ก ์ ํ
๐น NavMesh ํนํ๋ Cost
- ์์ญ๋ง๋ค ๋ค๋ฅธ Cost ๋ถ์ฌ ๊ฐ๋ฅ
- ๊ธธ (Default) → cost = 1
- ํ์ฒ → cost = 2 (๋๋ฆฌ๊ฒ, ๊ธฐํผ)
- ์ํ ์ง์ญ(๋ถ/๋ช/๋ ) → cost = 5 (๋๋๋ก ํผํจ)
- ๋ฒฝ/์ ๋ฒฝ → cost = ∞ (์ด๋ ๋ถ๊ฐ)
๐ ์์:
- ํ์ฒ ๊ฐ๋ก์ง๋ฌ 10m (cost ๋์)
- ๋์๊ฐ์ 15m (cost ๋ฎ์)
- → AI๋ ๋์๊ฐ๋ ๊ธธ ์ ํ
๐น Unity NavMesh Cost
- NavMesh Area ์ฌ์ฉ
- Area ๋ณ cost multiplier ์ค์ ๊ฐ๋ฅ
int grassArea = NavMesh.GetAreaFromName("Grass"); NavMesh.SetAreaCost(grassArea, 2.0f); // ํ์ฒ์ ๋น์ฉ 2๋ฐฐ
๐น Unreal NavMesh Cost
- NavModifierVolume ์ผ๋ก ์์ญ ์ง์
- AreaClass ๋ณ ๋น์ฉ ์ค์
AreaClassCost
| UNavArea_Default | 1.0 |
| UNavArea_LowCost | 0.5 |
| UNavArea_HighCost | 2.0 |
| UNavArea_Null/Block | ∞ |
๐ ์ต์ข ์์ฝ
- NavMesh = ์บ๋ฆญํฐ ์ด๋ ๊ฐ๋ฅ ์์ญ์ ํด๋ฆฌ๊ณค ๋ฐ์ดํฐ
- Cost = AI๊ฐ ๊ฒฝ๋ก๋ฅผ ์ ํํ ๋ ์ฐธ๊ณ ํ๋ ๊ฐ์ค์น
- ๊ฐ์ด ํด์๋ก → ํํผ / ๊ฐ์ด ์์์๋ก → ์ ํธ
- ๋จ์ ๊ฑฐ๋ฆฌ๋ฟ ์๋๋ผ ์ํ๋, ์๋, ์ ๋ต์ ์ ํ๊น์ง ๋ฐ์ ๊ฐ๋ฅ