After considerable deliberation, arguing, researching, pounding out, arguing, bending, prying, polishing, and welding, I have a navmesh-free situation-aware basic AI going for my bird predators. I’m finally satisfied with it.
Birds follow a relatively smooth path to their opponent, avoid obstacles like the terrain, do not turn on a dime (unless I tell them they can), and circle around gradually to face targets which aren’t within an angle window in front of them. Physics and animation are whole different modules from path finding, so the animation should always match the behavior.
I remind you that in this game, you are the 🐝. The birds are not your friends… But, having a player-vs-player mode in which one player does control a bird sounds like a lot of fun. So I may come back to that!
Most navigation uses a clever concept called a navigation mesh (or in some cases, a navigation volume); which divides traversable terrain into a set of linked convex polytopes. Each pair of connected polytopes can be walked across, and as long as an agent is bound to it, they will behave quite normally.
This is usually great, and is supported by freakin’ everything! However, it isn’t always enough. As an example, for my bird here, we need to worry about altitude, too. One way to do that would be a navigation volume (using polygons instead of edges for meeting points between convex polyhedra), but I would be building that from scratch, it would take a while, and I want this playable and enjoyable before the end of December. So instead, I fell back on a few other navigation techniques and tuned the amount of error I’m comfortable with it having.
Most of this stuff actually comes from robotics, where collision detection (or hopefully anticipation!) is really essential. You can theoretically make a game that doesn’t need collisions, but nobody wants to drive their robot into a wall. The bird’s doing pretty well in that department!