- Home /
Navmesh Agent velocity VS physics
I'm making an RTS game demo with Navmesh agent. I tried to move many characters to a point at same time. They can collide and avoid each other, also calculate their positions automatically, just like Warcraft.
According to the document:
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.
My code:
void OnAnimatorMove() {
GetComponent<Rigidbody>().velocity = agent.desiredVelocity;
}
agent.updatePosition = false; has been already set.
I've also tried to switch on/off of character's "Is Kinematic" in rigidbody. The problem is, if "Is Kinematic" == true, you can not set its velocity since it's not affected by physics engine. If "Is Kinematic" == false, the nav mesh agent will not work correctly since a race condition happened. So, I don't know how to implement "move a character without physics" described in this document. Please help.
P.S. I've made a demo here with test case for reference, single character movement is fine but multiple characters will cause some issues like nav mesh agent didn't function well after colliding.
Answer by elhispano · Oct 14, 2016 at 02:27 PM
You need to setup things like:
Your rigibody IsKinematic must be set to FALSE, so you can move the character.
You need to freeze rotation in your rigidbody to avoid the character falling.
You need your Animator with Rootmotion = true.
You need your navMeshAgent updatePosition = true and updateRotation = false.
Then what you need to do is:
Get the desiredVelocity of the nav mesh agent. Use this velocity to change animator parameters to move forward and turn around.
Probably, despite of having enabled rootmotion, you will have to rotate your character manually using Transform.Rotation so you can rotate faster.
Finally, in the event OnAnimationMove you need to get Animator.deltaPosition and use it to get the velocity and set it to your character's rigidbody.