远行星号吧 关注:41,577贴子:687,089
  • 1回复贴,共1

修一下光环的小帮手无人机乱跑的bug

只看楼主收藏回复

rt,小帮手总是飞到战场之外。准确来说是飞到战场的右边。他在刚开始打架的时候还能够正常环绕战舰防护,打个一分钟左右就全体右转(无论右边有没有敌人),然后就在右边待到天荒地老。我原先以为是ai大修的问题,但是卸载了ai大修还是这样。历经了一天的远行星号之旅,玩得我非常难受。一看bbs的帖子无人回复。
气的受不了了,我自己去看了看代码,果然有问题。自己动手改好了,现在是批斗作者的时间。
问题都出在mods\HaloDynamicsShipIndustry\src\data\ai的HSIWingManAI.java里面。
首先,看这一部分:if (s.getOwner() == ship.getOwner())
continue;
hardAvoidList.add(ship);
连锁反应:当无人机周围出现敌人时,它会把自己(ship)加入规避列表。 在 manuver() 移动计算中,无人机会计算自己和规避目标(还是自己)的距离和角度。自己到自己的距离是 0,而引擎底层函数 Misc.getAngleInDegrees 计算同一点的角度时,默认返回 0 度。 在远行星号的 2D 坐标系中,0 度就是正右方。因为距离是 0,代码会判定需要极其强烈的规避,赋予了一个高达 5f 的推力权重(正常环绕推力只有 1f)直接向 0 度(右方)推进。
修改:把ship改成s 。这个一看就是作者自动补全没关还喜欢按tab
为什么开战一会后会乱跑?
“小帮手”的设定是拦截高威胁射弹或光束,但在 doThreatAnalysis()(威胁分析)方法中,如果当前场上没有可以拦截的子弹或光束,代码写了这样一段作为保底:threat = MagicTargeting.pickTarget(source, targetSeeking.FULL_RANDOM, 1200, 360, 100, 0, 0, 0, 0, false);
这段代码会随机在 1200 范围内挑一艘敌方舰船作为 threat(威胁)。随后,无人机的移动逻辑会试图去“拦截”这艘敌方舰船。这就导致了无人机在没有子弹可挡时,会像无头苍蝇一样朝着随机的敌方战舰乱跑。更糟的是,一旦它跑近敌舰,就会立刻触发上面提到的“向右规避”Bug,直接向右发射出去。
修改:直接注释掉!不过理论上来说不改也行,这样可以保留原版设定中无人机撞人能力,但是其实没什么变化,因为无人机本来就会乱动,实测它乱动撞人和主动撞人的效率差不多。
脱战后乱跑。这个是代码逻辑问题,倒不是bug。但是这个看着太难受了,好好的无人机飞行姿态像是上个世纪的彩色屏保,忍不了,改!
在 manuver() 方法底部的 if (total.length() <= 0.05f) 块里,替换成这段平滑环绕逻辑:
if (total.length() <= 0.05f) {
// 获取当前无人机相对于母舰的角度
float angleToSource = VectorUtils.getAngle(source.getLocation(), ship.getLocation());
float tangentOffset = r > 0.5f ? 90f : -90f;
float targetAngle = angleToSource + tangentOffset;
float desiredOrbitRadius = source.getCollisionRadius() + 500f;
Vector2f idealPoint = MathUtils.getPoint(source.getLocation(), desiredOrbitRadius, targetAngle);
Vector2f dir = Misc.getUnitVectorAtDegreeAngle(Misc.getAngleInDegrees(ship.getLocation(), idealPoint));
float distToIdeal = Misc.getDistance(ship.getLocation(), idealPoint);
float f = distToIdeal / 200f;
if (f > 1f) f = 1f;
dir.scale(f * 1.5f);
Vector2f.add(total, dir, total);
}
代码中其他的隐患:
if (Math.random() < sumTotal / sumTotal + 4000f)
给哥们看无语了。
改成:sumTotal / (sumTotal + 4000f)
if(rotation<0){
ship.giveCommand(ShipCommand.TURN_LEFT, source.getMouseTarget(), 0);
}else{
ship.giveCommand(ShipCommand.TURN_RIGHT, source.getMouseTarget(), 0);
}
原来你的转向一直写的是反着的吗?
修改:left和right换过来
这里直接附上我改好的文件,直接替换即可
求助一下光环工业的小帮手无人机,总是飞到战场之外 - 游戏讨论 - 远行星号中文论坛
可以直接去bbs上面下载


贴子原创声明
IP属地:中国香港1楼2026-07-24 14:29回复
    @作者进行拷打


    IP属地:新疆来自Android客户端2楼2026-07-24 16:23
    回复