沉默的约书亚 发表于 2026-7-21 18:58:49

求助一下光环工业的小帮手无人机,总是飞到战场之外

准确来说是飞到战场的右边。他在刚开始打架的时候还能够正常环绕战舰防护,打个一分钟左右就全体右转(无论右边有没有敌人),然后就在右边待到天荒地老。我原先以为是ai大修的问题,但是卸载了ai大修还是这样{:tieba_11:}用的船是浮生,问问这种情况怎么解决(还不知道其他船有没有类似的情况,但是别告诉我这是浮生特有的bug)

沉默的约书亚 发表于 2026-7-21 19:04:21



如图,模拟战里面很容易就复刻出来了这种情况。哪怕是单挑也会有一大堆无人机右转
这要咋整,正常的舰载机没问题。还有什么类似生态位的点防小能量推荐吗(大雾

AIYHBVDCX 发表于 2026-7-21 21:55:44

希腊奶~

沉默的约书亚 发表于 2026-7-24 11:25:39

顶一下,有没有大哥知道这个是啥情况?或者我是不是应该直接去问作者

沉默的约书亚 发表于 2026-7-24 13:34:07

受不了了,我自己去看了看代码,果然有问题。自己动手改好了,现在是批斗作者的时间。

问题都出在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换过来


这里直接附上我改好的文件,直接替换即可

沉默的约书亚 发表于 2026-7-26 03:19:15

鬼故事,我今天打远神的时候发现还是有这个bug,仔细一看,原来wingmanAI是个废类,我真是……实际上管事的是HWIIntercepterController.JAVA

小帮手无人机是由 HWIIntercepterController 里 spawnAndBindScript() 生成,并且 w.setShipAI(null),说明它们不是用 HSIWingManAI 在驱动,而是用 HSIInterceptorDroneScript 内部逻辑在控制。而在其中的 REACHED_ATTACK_POINT 阶段有一段方向随机代码:Math.signum(1f-random.nextFloat())。由于 random.nextFloat() 几乎总是 < 1,这个 signum 几乎总是 +1,于是无人机会稳定偏向右边。当然,原来的那个wingman写的也是依托答辩。


把这个压缩包解压到Starsector\mods\HaloDynamicsShipIndustry\data\weapons中使用即可。只改动了向右乱飞的逻辑。没改其他的因为怕给中帮手和大帮手改了。

沉默的约书亚 发表于 2026-7-26 16:54:51

哦{:tieba_23:}想起来忘了说,需要把这些改动的文件重新编译成jar才能有效果。直接把这个文件在mod根目录解压覆盖即可,前面帖子发的都不用管

沉默的约书亚 发表于 前天 16:07

更新了一下,这个版本我还修正了小帮手自爆的时候会伤害友军的问题,现在自爆只会伤害敌人了。然后增加了20%小帮手发射光束的频率

渡鸦612 发表于 昨天 15:19

看了眼标题,嗯是求助没错,这就是会代码的好处吗,楼主自己就解决了{:tieba_12:}

hbdhbs 发表于 昨天 15:29

这么唐突修改还发出来难道不闻一下原作者意见吗{:tieba_23:}(
不管他写成什么样总归是他自己的事(
页: [1]
查看完整版本: 求助一下光环工业的小帮手无人机,总是飞到战场之外