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

基于RealTutsGML波次游戏的Bot Player仅对单个敌人生效问题求助

问题诊断与修复:Bot仅响应最新生成的敌人

嘿,我来帮你拆解下为什么你的Bot只对最新生成的敌人有反应,以及怎么修复这个问题——这在波次敌人生成的游戏里是个非常常见的坑!

核心问题分析

你的Bot逻辑大概率是用单个变量存储要躲避的敌人目标了,每次新敌人生成时,这个变量会被直接覆盖成新敌人的实例,导致之前的敌人引用完全丢失,自然就只会盯着最新的那个敌人走。结合你提到的“敌人周围的圆形检测区域”,咱们一步步来修复:

1. 先把敌人实例统一管理起来

首先你需要放弃单个变量的思路,改用列表/数组来存储所有活跃的敌人,这样Bot就能遍历所有敌人进行检测:

// 在游戏初始化事件(比如房间开始事件)创建全局敌人列表
global.enemies = ds_list_create();

// 在敌人对象的【创建事件】里,把自己加入列表
ds_list_add(global.enemies, id);

// 在敌人对象的【销毁事件】里,从列表移除自己(避免引用无效实例)
ds_list_delete(global.enemies, ds_list_find_index(global.enemies, id));

2. 重构Bot的躲避检测逻辑

现在Bot需要遍历所有敌人,判断哪些在检测范围内,再执行躲避动作。这里分两种情况给你方案:

方案A:基于距离的检测(适合你提到的圆形区域)

// Bot对象的【Step事件】代码
var closest_enemy = noone;
var closest_dist = 99999; // 设一个很大的初始值

// 遍历所有活跃敌人
for(var i = 0; i < ds_list_size(global.enemies); i++){
    var enemy = global.enemies[| i];
    if(instance_exists(enemy)){ // 先确认敌人还存在
        var dist = distance_to_object(enemy);
        // 检查是否进入敌人的圆形检测范围
        if(dist < enemy.detection_radius){ // 假设你给敌人加了detection_radius变量控制范围
            // 记录最近的敌人(也可以改成同时处理多个敌人的逻辑)
            if(dist < closest_dist){
                closest_dist = dist;
                closest_enemy = enemy;
            }
        }
    }
}

// 如果找到需要躲避的敌人,执行躲避动作
if(closest_enemy != noone){
    // 计算远离敌人的方向(原方向加180度)
    var escape_dir = point_direction(x, y, closest_enemy.x, closest_enemy.y) + 180;
    // 让Bot向远离的方向移动
    move_towards_point(x + lengthdir_x(5, escape_dir), y + lengthdir_y(5, escape_dir), 3);
}

方案B:基于碰撞体的检测(如果你给敌人做了独立的圆形检测碰撞体)

如果你给每个敌人都加了一个专门的圆形碰撞体作为检测区域,那可以直接用碰撞列表来获取所有靠近的敌人:

// Bot对象的【Step事件】代码
// 获取所有靠近的敌人检测区域
var detection_instances = instance_place_list(x, y, obj_enemy_detection, [], false);
if(array_length(detection_instances) > 0){
    // 如果有多个敌人靠近,计算平均躲避方向(避免Bot左右横跳)
    var total_escape_dir = 0;
    for(var i = 0; i < array_length(detection_instances); i++){
        var enemy = detection_instances[i].parent_enemy; // 假设检测体存了对应的敌人实例
        total_escape_dir += point_direction(x, y, enemy.x, enemy.y) + 180;
    }
    var avg_escape_dir = total_escape_dir / array_length(detection_instances);
    // 执行移动
    move_towards_point(x + lengthdir_x(5, avg_escape_dir), y + lengthdir_y(5, avg_escape_dir), 3);
}

3. 额外注意点

  • 一定要在敌人销毁时从全局列表移除,否则会出现引用无效实例的报错
  • 如果你想让Bot同时躲避多个敌人,可以调整逻辑,比如计算所有敌人的“排斥力”合力方向,而不是只追着最近的一个跑
  • 检查变量作用域,别把敌人列表或者目标变量定义在局部作用域里,不然每次Step都会重新初始化

内容的提问来源于stack exchange,提问作者msacco

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 10:01:20