While i don’t much about how L4D2 construct their navigation mesh, valve seems to describe a little bit about it there:
https://developer.valvesoftware.com/wiki/Navigation_Meshes
and from the L4D wiki there is this: L4D Level Design/Nav Meshes - Valve Developer Community
i don’t know the specifics, but it is probable that with that specific navigation mesh above, if it is navigated with normal A*, nodes are just directly linked together, with no specific order.
From what I’ve seen A* using a Navigation mesh data structure is often still used in 2d space! For the most part, many Navigation mesh & A* implementations I’ve seen are still treated as if the mesh is still 2d behind the scenes.
Normally agents (“bots”) don’t really “recognize” the stairs themselves (unless they need to for some reason), but the Navigation mesh is usually the one that needs to “work with them”.
Automatic generation is definitely easier to use (not make), for a manual alternative to navigation mesh there are also way-point graph data structures.
if you are interested in making your own automatic navigation mesh generator:
There are many types of navigation mesh systems and many different ways to construct them, if you are trying to make your own navigation mesh and use A*, its pretty easy–that is…manually at least. One easy way you could make one manually is by using a triangulation algorithm (for the actual mesh) and then using A* to search for nodes and then finally a string pulling algorithm perhaps this: funnel algorithm to do some smoothing for traversal. However, for automatic navigation mesh generation…it’s not so easy–and information on how to specifically make one is pretty sparse.
Here are just a couple (there are likely more, many probably with long reads) :
CritterAI Study --an ok study on the famous Recast library
Mesh Generation in Configuration Space
While automatic navigation mesh might be difficult to tackle-- making efficient dynamic navigation mesh generation is likely even harder. By dynamic, i mean navigation mesh that can be rebuilt during runtime. Rebuilt when stuff moves, blocks a path, gets added or removed, or when other significant changes occur. Because dynamic navigation mesh needs to be rebuilt at run time, it also needs to be quite preformant, which is a task in on its self. in my opinion, easy to follow-complete resources on making a navigation mesh dynamic are hard to come by…
if you are trying to make your own navigation mesh–What type of navigation mesh system are you trying to implement?