找回密码
 初始化身份识别芯片
搜索
查看: 823|回复: 9

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

[复制链接]

巡洋大副

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

巡洋大副

 楼主| 发表于 2026-7-21 19:04:21 | 显示全部楼层
image.png
image.png
如图,模拟战里面很容易就复刻出来了这种情况。哪怕是单挑也会有一大堆无人机右转
这要咋整,正常的舰载机没问题。还有什么类似生态位的点防小能量推荐吗(大雾

星域军阀

英仙领大胖鸡

发表于 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中使用即可。只改动了向右乱飞的逻辑。没改其他的因为怕给中帮手和大帮手改了。

scripts.rar

8.22 KB, 下载次数: 132

巡洋大副

 楼主| 发表于 2026-7-26 16:54:51 | 显示全部楼层
想起来忘了说,需要把这些改动的文件重新编译成jar才能有效果。直接把这个文件在mod根目录解压覆盖即可,前面帖子发的都不用管

jars.rar

1.09 MB, 下载次数: 135

巡洋大副

 楼主| 发表于 2026-8-1 16:07:43 | 显示全部楼层
更新了一下,这个版本我还修正了小帮手自爆的时候会伤害友军的问题,现在自爆只会伤害敌人了。然后增加了20%小帮手发射光束的频率

jars.rar

1.09 MB, 下载次数: 95

战列舰长

发表于 2026-8-2 15:19:33 | 显示全部楼层
看了眼标题,嗯是求助没错,这就是会代码的好处吗,楼主自己就解决了

战列舰长

发表于 2026-8-2 15:29:29 | 显示全部楼层
这么唐突修改还发出来难道不闻一下原作者意见吗
不管他写成什么样总归是他自己的事(
*滑块验证:

本版积分规则

Archiver|手机版|小黑屋|远行星号中文论坛

GMT+8, 2026-9-18 07:59

Powered by Discuz! X3.5

© 2001-2077 Tencent Cloud | Durian Software Studio | IP地址位置数据由纯真CZ88提供支持

快速回复 返回顶部 返回列表