导航图块地图,而无需手动放置可步行的图块

时间:2018-12-08 17:39:31

标签: godot

我在godot中有一个图块地图,但是所有图块都是障碍物,会产生碰撞。只有没有任何图块的单元格才能步行。我现在正尝试通过Navigation2D节点添加导航。据我所知,没有办法告诉它“一切都是可步行的,但这些瓷砖都不能在哪里”(所有人都可以说“瓷砖的这一部分是可步行的”),但是在我当前的设置中,没有瓷砖宜人的空间。

作为一种解决方法,我尝试将每个没有图块的单元格设置为“虚拟图块”,该代码可以完全使用以下代码进行遍历:

func _ready():
    for x in size.x:
        for y in size.y:
            var cell = get_cell(x, y)
            if cell == -1:
                set_cell(x, y, WALKABLE)

但是Navigation2D节点无法识别这些图块。如果我手动放置WALKABLE磁贴,一切都会按预期进行。

我认为我可能正在打this issue,需要打电话给update_dirty_quadrants(),但这不能解决问题。

我使用3.0.6stable,3.1Alpha2版本和最近提交的9a8569d(provided by godotwild)进行了尝试,结果始终相同。

无论如何,都无需手动放置每个图块就能在图块地图正常工作的情况下获得导航?

2 个答案:

答案 0 :(得分:2)

对于将来遇到此问题的任何人,“虚拟导航磁贴”解决方案现在都可以使用(使用Godot 3.2.3)。将此脚本放在有问题的图块上:

extends TileMap

# Empty/invisible tile marked as completely walkable. The ID of the tile should correspond
# to the order in which it was created in the tileset editor.
export(int) var _nav_tile_id := 0

func _ready() -> void:
    # Find the bounds of the tilemap (there is no 'size' property available)
    var bounds_min := Vector2.ZERO
    var bounds_max := Vector2.ZERO
    for pos in get_used_cells():
        if pos.x < bounds_min.x:
            bounds_min.x = int(pos.x)
        elif pos.x > bounds_max.x:
            bounds_max.x = int(pos.x)
        if pos.y < bounds_min.y:
            bounds_min.y = int(pos.y)
        elif pos.y > bounds_max.y:
            bounds_max.y = int(pos.y)
    
    # Replace all empty tiles with the provided navigation tile
    for x in range(bounds_min.x, bounds_max.x):
        for y in range(bounds_min.y, bounds_max.y):
            if get_cell(x, y) == -1:
                set_cell(x, y, _nav_tile_id)

    # Force the navigation mesh to update immediately
    update_dirty_quadrants()

答案 1 :(得分:0)

我在 autotiler 中找不到来自我的 tile 的 ID(在编辑器中检查时,选择了 tilemap,这些都显示相同的 imagename.png 0)。因此,我没有使用 ID,而是使用了 Tileset 中可行走空白图块的坐标。代码与 LukeZaz' 相同,但将 set_cell 替换为:

set_cell(x, y, 0, false, false, false, Vector2(7,4));其中 Vector2(7,4) 是我的图块集中的空白图块的坐标,上面有导航多边形。 (记住坐标从 0 开始)

(Godot 3.2.3.stable)