I’ve had a lot of trouble with 3d navigation on the terrain. My agents won’t go up slopes, they take a bad route, and the navmesh slows everything down and causes stuttering. As soon as you bake the navmesh it stops working for me. If you still want to go down that route, generate the mesh from the terrain, then the navmesh from that. Make sure they are both under the navigation node. Follow this tutorial:https://www.youtube.com/watch?v=_urHlep2P84. Don’t bake it. It works for me if I do that.
If that method isn’t working for you, I’ve come up with a kind of half baked solution using astar and gridmap. Basically what I do is loop over the terrain mesh and generate a gridmap from the faces. Then disable terrain collision on your bots. Then use astar pathfinding over the gridmap you generated. The results aren’t great, but good enough for prototyping imo.
export var terrain_path := NodePath()
var terrain
export var grid_path := NodePath()
var grid
export var bounds := Vector3()
# stops the grid from stacking on top of each other
export var allow_overlap = false
var astar
func _enter_tree():
pass
#connect("pressed", self, "clicked")
func generate():
terrain = get_node(terrain_path).mesh
grid = get_node(grid_path)
grid.clear()
var faces = terrain.get_faces()
for face in faces:
if face.x < bounds.x and face.y < bounds.y and face.z < bounds.z:
var cell_pos = grid.world_to_map(face)
if !allow_overlap:
var set = false
if grid.get_cell_item(cell_pos.x, cell_pos.y+grid.cell_size.y, cell_pos.z) == grid.INVALID_CELL_ITEM:
grid.set_cell_item(cell_pos.x, cell_pos.y, cell_pos.z, 0)
else:
grid.set_cell_item(cell_pos.x, cell_pos.y, cell_pos.z, 0)
It’s best you run this in the editor, as you can then edit the gridmap and erase where you don’t want them to go e.g. obstacles. I’m sure this isn’t the best way to do things, but it seems to be faster than using the navmesh, though I haven’t done any real tests.