Dynamic obstacles (other path seekers) on a point graph?

If I have many AIs in a small town, and I’ve scanned a simple PointGraph, how can I make individual seekers not walk through each other? In Unity, moving a seeker with a kinetic rigidbody ignores the physics colliders.
It looks like each seeker would want to make continuous updates to the point graph for OTHER seekers without cutting the path for themself.


Have you checked out local avoidance?
See https://arongranberg.com/astar/docs/local-avoidance.php

So from all that I had read on the RVO work, it looked like that was only for major swarms on dense fields, not for something as small as a 50-point point graph.

Just now I threw an RVO Controller onto one person. The error message told me I needed to add an RVO Simulator in the scene so I threw that onto my scene’s Astar Path. Awesome ease-of-use.


My test code has a simple strolling loop. Every time I get to the destination, I pick a new random spot and stroll to that point.

Without RVO, the character endlessly ran, hardly catching a breath.

With RVO, the character stopped and took about 15 seconds before beginning a new path. It looks like most of that delay is spamming the debug output, but the clue here is that it tries a thousand paths at 0.08ms each, before settling on one. Remember, the single character is the only obstacle here.

Any idea?

Update: it seems my loop is actually venturing out to walk each of those thousand paths offered by the seeker, and reaching the destination, and trying again. All invisible in the view, including gizmos, so the “path” must either be back to the same spot or the destination is usually “reached” prematurely. If I disable the two RVO classes, it’s back to normal.

In further testing I don’t think it has to do with the addition of RVO at all. It’s acting like a race condition between the three components (my script controlling behavior, the aipath, and the seeker). I have seen instant path-to-path chains with RVO and I have seen long delays without RVO.

A “path” seems to have these stages of its lifetime. Constructed and search underway, search complete and motion underway, and reachedEndOfPath. While I am waiting for the search, the prior path’s “reachedEndOfPath” status is still hanging around in my aipath, so my controller is confused.

What’s not clear from the documentation (to me) is what I should be doing to clear away the detritus of the old completed path, if I want to immediately embark on a new one. There are several calls done internally to Cancel or Release or SetPath(null) which are either private or rejected with error messages if I call them.

So I gave up on the RandomPath method and went with a less smart “pick any Vector3” solution, and have had no problems with this. There’s not really much documentation on how to manage or terminate RandomPath.


Sorry for the late reply.

So your race condition is hitting an annoying point which has caused me much grief. Since all path calculations are asynchronous, from the moment you request a path to it is completed, the agent does not know if it has reached the end of that path or not because the path has not been calculated yet. So it has to return the status for the previous path (which it is still following).
I am considering adding a reachedDestination property though which something reasonable thing in most cases, even though it would not be possible to be perfectly accurate. It might be better than the current situation where people regularly get confused by the behavior of reachedEndOfPath.