You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 01:57:13