Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/jadvrodrigues/CustomNavMesh
Alternative to Unity's NavMesh system where the agents avoid each other.
https://github.com/jadvrodrigues/CustomNavMesh
agents agents-avoid avoidance navmesh navmeshagent unity-navmesh
Last synced: 3 months ago
JSON representation
Alternative to Unity's NavMesh system where the agents avoid each other.
- Host: GitHub
- URL: https://github.com/jadvrodrigues/CustomNavMesh
- Owner: jadvrodrigues
- License: mit
- Created: 2020-10-21T17:48:28.000Z (over 4 years ago)
- Default Branch: master
- Last Pushed: 2023-08-29T17:37:04.000Z (over 1 year ago)
- Last Synced: 2024-08-02T05:12:02.661Z (6 months ago)
- Topics: agents, agents-avoid, avoidance, navmesh, navmeshagent, unity-navmesh
- Language: C#
- Homepage:
- Size: 46.4 MB
- Stars: 202
- Watchers: 6
- Forks: 25
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
- awesome-unity3d - CustomNavMesh - Alternative to Unity's NavMesh system where the agents avoid each other. (Open Source Repositories / AI)
README
# Custom Nav Mesh
Alternative to Unity's NavMesh system where the **agents avoid the other non-moving agents** in their pathing. It uses the official navigation system, but you have to use its components instead. Compatible with **NavMeshComponents**.
## How it works
**How do the agents avoid others**? Unity's **NavMeshAgent** only goes around **NavMeshObstacles** and ignores the other agents in their path. By disabling **NavMeshAgent** and enabling **NavMeshObstacle** when an agent is not moving noticeably, the agents now avoid other non-moving agents in their pathing.
Unity's NavMeshAgent | CustomNavMeshAgent
:-------------------------:|:-------------------------:
![](Assets/Examples/GIFs/1_before.gif) | ![](Assets/Examples/GIFs/1_after.gif)> **1. Setting the destination** to the blue target's **exact** center position.
**What if a moving agent collides against a stopped agent that's currently in obstacle mode**? By default, it wouldn't be able to push it. However, by:
- duplicating the baked surface, obstacle, and agents;
- making the duplicated agents switch between **NavMeshAgent** and **NavMeshObstacle** instead of the original ones;
- having each original agent copy the duplicated one's velocity, and the duplicated one copy the original's position at every frame.![](Assets/Examples/GIFs/2_navigation_view.gif)
> **2.** The duplicated **NavMesh** components. The **hidden** components are on the **right** side.
**You can** have agents **push** the **other agents**. For the **CustomNavMesh** system to work, you must use its **custom components**, which are **identical to the original ones**, making the transition seamless.
NavMeshAgent vs NavMeshObstacle "Agents" | CustomNavMeshAgents
:-------------------------:|:-------------------------:
![](Assets/Examples/GIFs/3_before.gif) | ![](Assets/Examples/GIFs/3_after.gif)> **3. Overlapping** agents by throwing one against the others. The **agents** are green and the **obstacles** blue.
**Why not** just **switch** the agents back to **NavMeshAgent** instead? That wouldn't work because switching from **NavMeshObstacle** to **NavMeshAgent** isn't instant — it would take at least two frames.
**What are the disadvantages?** Every **NavMesh** component is duplicated, which makes it less performant. However, it shouldn't be noticeable in most situations.
## Custom classes
**CustomNavMesh** – you can choose the hidden game objects **relative position** and whether or not they are **rendered** by accessing the class or through its **singleton** present in the **scene**.
![](Assets/Examples/GIFs/4_custom_nav_mesh_fields.gif)
> **4.** Changing **CustomNavMesh** fields.
- **CustomNavMeshSurface** – add to each surface that is going to be baked. These **surfaces** need to be **rendered meshes**. Both **Physics Colliders** and **Terrains** are ignored by it;
- **CustomNavMeshObstacle** – replacement for **NavMeshObstacle**;
- **CustomNavMeshAgent** – replacement for **NavMeshAgent**. The main extra properties are:
- **Block after Duration** – should the hidden agent start blocking (switch from agent to obstacle) if it hasn't surpassed a certain speed for a given time?
- **Unblock after Duration** - should the hidden agent periodically try to find a new shorter path and unblock (switch from obstacle to agent) when it finds one?
- **Unblock at Speed** - should the hidden agent unblock if it surpasses a certain speed?## How To Get Started
**Clone or download** this repository and open the project in Unity. Alternatively, you can **copy the contents** of `Assets/CustomNavMesh` to an **existing project**.
The **scenes** used for the **GIFs** are available in the `Assets/Examples` folder. Just hit the **Space Bar** in play mode to test it.
Note: This project is using the **Unity 2022.3 LTS** version. Tested in **PC Standalone**, **Android**, and **WebGL**.
## Final thoughts
Things that I might implement later:
- Every time an agent in block mode does a refresh (tries to see if it should unblock), **SamplePosition** and **CalculatePath** are called. Both of these functions are **synchronous** and run on the **main thread**. I could implement the new experimental **NavMeshQuery operations** (not yet fully complete) which can be executed using the new **job system**.
- Import more methods and properties from the original **NavMesh** components.
- Create custom versions of the **NavMeshComponents'** components.If you **need help** adding this to your project or have any **questions**, just [message me](https://forum.unity.com/members/jadvrodrigues.4503760/) and I'll try to help. I'm also interested in any **tips** or **suggestions** you may have, cheers!