You can use NavMesh Agent, NavMesh Obstacle, and Off Mesh Link components with other Unity components too. Here’s a list of dos and don’ts when mixing different components together.
NavMesh Agent and Physics
You don’t need to add physics colliders to NavMesh Agents for them to avoid each other
That is, the navigation system simulates agents and their reaction to obstacles and the static world. Here the static world is the baked NavMesh.
If you want a NavMesh Agent to push around physics objects or use physics triggers:
Add a Collider component (if not present)
Add Rigidbody component
Turn on kinematic (Is Kinematic) - this is important!
Kinematic means that the rigid body is controlled by something else than the physics simulation
If both NavMesh Agent and Rigidbody (non-kinematic) are active at the same time, you have race condition
Both components may try to move the agent at the same which leads to undefined behavior
You can use a NavMesh Agent to move e.g. a player character, without physics
Set players agent’s avoidance priority to a small number (high priority), to allow the player to brush through crowds
Move the player agent using NavMeshAgent.velocity, so that other agents can predict the player movement to avoid the player.
NavMesh Agent and Animator
NavMesh Agent and Animator with Root Motion can cause race condition
Both components try to move the transform each frame
Two possible solutions
Information should always flow in one direction
Either agent moves the character and animations follows
Or animation moves the character based on simulated result
Otherwise you’ll end up having a hard to debug feedback loop
Animation follows agent
Use the NavMeshAgent.velocity as input to the Animator to roughly match the agent’s movement to the animations
Robust and simple to implement, will result in foot sliding where animations cannot match the velocity