Godot 4.3中如何用AStarGrid2D让敌人移动到随机瓦片?
实现幽灵在逃跑状态下移动到随机可行走瓦片
问题核心是你直接调用path.pick_random()无效,因为逃跑状态下没有生成有效的目标路径。正确的做法是先收集所有可通行的瓦片,随机选择一个作为目标,再通过AStarGrid2D生成路径移动。
步骤1:预存可行走瓦片列表
在脚本顶部添加数组变量,用于存储所有可通行的瓦片位置:
var walkable_tiles: Array[Vector2i] = []
在_ready()方法的瓦片遍历循环中,将可通行的瓦片加入数组:
func _ready() -> void: # 原有代码... var region_size = astar_grid.region.size var region_position = astar_grid.region.position for x in range(region_size.x): for y in range(region_size.y): var tile_position = Vector2i(x + region_position.x, y + region_position.y) var tile_data = tile_map.get_cell_tile_data(0, tile_position) if tile_data == null or not tile_data.get_custom_data("walk_tiles") or tile_data.get_custom_data("gate"): astar_grid.set_point_solid(tile_position) else: # 记录可行走瓦片 walkable_tiles.append(tile_position) # 原有代码...
步骤2:编写随机目标生成函数
添加一个函数,从预存的可行走瓦片列表中随机选取一个位置:
func get_random_walkable_tile() -> Vector2i: if walkable_tiles.is_empty(): # fallback到当前位置,防止数组为空报错 return tile_map.local_to_map(global_position) return walkable_tiles.pick_random()
步骤3:修改逃跑状态的移动逻辑
更新frightened_mode()函数,添加随机移动的路径生成与移动逻辑,和追逐状态的移动逻辑保持一致:
func frightened_mode(): print("FRIGHTENED") if frightened_timer.is_stopped(): ghostsiren.stop() body.frightened() eyes.hide_eyes() frightened_timer.start() is_blinking = false move_speed = 0.6 current_state = GhostState.RUN_AWAY # 随机瓦片移动逻辑 is_moving = true var current_tile = tile_map.local_to_map(global_position) var random_tile = get_random_walkable_tile() # 生成到随机瓦片的路径 var path = astar_grid.get_id_path(current_tile, random_tile) path.pop_front() if path.size() == 0 or path.is_empty(): is_moving = false return var original_position = Vector2(global_position) global_position = tile_map.map_to_local(path[0]) body.global_position = original_position var movement_direction = global_position - body.global_position update_direction(movement_direction) is_moving = true
说明
- 预存可行走瓦片避免了每次逃跑时都遍历整个地图,提升性能
- 随机目标选取后,复用了追逐状态的路径生成与移动逻辑,保证幽灵移动行为的一致性
- 加入了数组为空的 fallback 处理,防止出现运行时错误
内容的提问来源于stack exchange,提问作者SPONGEBOB RED YT channel
相关产品推荐
相关产品推荐

