无需手动放置可行走瓷砖的导航瓷砖地图
navigation tilemaps without placing walkable tiles manually
我在godot中有一个tilemap,但是所有的tile都是障碍物并且提供碰撞。只有没有任何瓦片的单元格是可步行的。我现在正尝试通过 Navigation2D 节点添加导航。据我所知,没有办法告诉它 "everything is walkable, but not where these tiles are"(只能说 "this part of the tile is walkable",但在我当前的设置中,可步行 space 处没有瓷砖)。
作为一种解决方法,我尝试将每个没有瓷砖的单元格设置为 "dummy tile",它可以使用以下代码完全步行:
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) 尝试了这个,结果总是一样的。
有没有办法在不事先手动放置每个图块的情况下使用图块地图进行导航?
对于将来遇到此问题的任何人,'dummy navigation tile' 解决方案现在有效(使用 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()
我在 autotiler 中找不到我的图块的 ID(在编辑器中检查时,选择了图块地图,这些都显示相同的 imagename.png 0)。因此,我没有使用 ID,而是使用了 Tileset 中可行走空白图块的坐标。代码与 LukeZaz' 相同,但 set_cell 替换为:
set_cell(x, y, 0, false, false, false, Vector2(7,4));其中 Vector2(7,4) 是我的瓦片集中空白瓦片的坐标,上面有导航多边形。 (记住坐标从 0 开始)
(戈多 3.2.3.stable)
我在godot中有一个tilemap,但是所有的tile都是障碍物并且提供碰撞。只有没有任何瓦片的单元格是可步行的。我现在正尝试通过 Navigation2D 节点添加导航。据我所知,没有办法告诉它 "everything is walkable, but not where these tiles are"(只能说 "this part of the tile is walkable",但在我当前的设置中,可步行 space 处没有瓷砖)。
作为一种解决方法,我尝试将每个没有瓷砖的单元格设置为 "dummy tile",它可以使用以下代码完全步行:
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) 尝试了这个,结果总是一样的。
有没有办法在不事先手动放置每个图块的情况下使用图块地图进行导航?
对于将来遇到此问题的任何人,'dummy navigation tile' 解决方案现在有效(使用 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()
我在 autotiler 中找不到我的图块的 ID(在编辑器中检查时,选择了图块地图,这些都显示相同的 imagename.png 0)。因此,我没有使用 ID,而是使用了 Tileset 中可行走空白图块的坐标。代码与 LukeZaz' 相同,但 set_cell 替换为:
set_cell(x, y, 0, false, false, false, Vector2(7,4));其中 Vector2(7,4) 是我的瓦片集中空白瓦片的坐标,上面有导航多边形。 (记住坐标从 0 开始)
(戈多 3.2.3.stable)