rimworld吧 关注:293,242贴子:5,360,869

回复:攻击、命中、伤害机制的知识整合与代码解读

只看楼主收藏回复



IP属地:北京来自Android客户端51楼2024-02-27 06:55
回复
    好帖


    IP属地:贵州来自Android客户端52楼2024-03-16 11:17
    回复
      2026-05-22 13:05:28
      广告
      不感兴趣
      开通SVIP免广告
      1.5研究了远程敌人AI,之前看制作组那意思1.5应该是不改了,不过姑且还是放在这贴里
      总结:
      1.AI选取目标时,优先选目前有视线的目标,优先选旧、成年、非倒地、误伤敌方容易友方不易、想打自己、近的目标,机械族无视误伤
      2.站原地且看得到目标时,脚下无障碍物且有掩体就会开枪,或者距离目标5格以内也会开枪
      (另外不仅路障,像圣诞树、献祭旗、文化木雕和基因库等是0%掩体效果的障碍物,不过这些也算是家具)
      3.人类选取射击位置避免接近5格内和火,优先掩体、回避炮塔密集火力区、避免更长移动、接近0.8倍射程距离
      机械族和虫族无视炮塔火力区,机械族反而会回避掩体邻格,并且很倾向于选择原地开枪
      常规远程敌人AI:
      一.选取目标:
      1.筛出所有有效的敌意事物作为可能目标。(通常不会算非作战人员、无威胁对象、武器不对口的目标等,可通过通过开发者模式的Write Attack Targets查看)
      2.判断56格内有无可直接射得到的目标,若有则对这些目标评分,按最终分数为权重随机选一个作为最终目标。
      ①基础60分,减去自己与目标之间的直线距离,最多减40

      ②如果目标瞄准自己(后摇中也算),加10分
      ③如果自己在5秒内攻击过目标,加40分
      ④减去面对目标的掩体百分比*10 (比如20%掩体-2分)
      ⑤目标如果是非作战人员(60秒内未拿武器的幼年或动物)减50分,如果是作战幼年则是只减25分
      ⑥目标如果倒地减50分

      ⑦自己的武器是帝王业火炮,对远程武器目标加50分
      ⑧统计与目标之间弹道和目标邻格上所有可能的拦截事物,加分=(事物属性*拦截概率中的距离倍率*敌意属性)的总和
      其中事物属性在拦截事物为单位时为18,动物7,非单位(如炮塔)10
      敌意属性在拦截事物为敌对时为0.6,友方则是-1
      机械族不会统计这个因素
      (部分AOE类武器则是另一套算法,根据目标附近单位来算,具体就懒得写了)

      ⑨如果目标是虫巢,分数乘以0.4
      (以上分数结果可以通过开发者模式的Darw Attack Target Scores查看实际情况)
      ⑩所有目标的分数低于1时,直接选择最高分作为最终目标
      ⑪只筛选出分数在[最高分-30,最高分]范围内的目标,并将目标的分数在此范围内对0~100%的插值作为最终分数。
      3.在第二步的判断中,若没有则直接选择一个最近的作为最终目标。
      二、判断是否站在原地开枪
      满足以下其中一条即必会原地开枪
      1.原地可射击目标,且面对目标存在有效掩体,且脚下无障碍物,且未有队友预定此位置
      (有障碍物指小人征召后无法直接右键走上去的情况)
      2.原地可射击目标,且距离目标在5格直线距离内
      3.选取射击位置时选取到原地,见后文

      三、选取射击位置
      1.首先判定原地的分数,不低于1则直接选取原地
      2.选取范围为以目标为中心、半边长为自己射程的正方形,边长最大为57
      3.在自己与目标的连线上,在目标处做垂线,将选取范围以垂线分为两半,先对自己这一侧的所有格进行选取,如果最高分数低于0.33则再对另一侧选取。
      (站在目标横方向上有BUG,仅对选取范围内的所有格进行一次选取)

      4.对每格进行评分,选取分数最高的格作为射击位置
      (分数可以通过开发者模式的Darw Cast Position Search查看实际值)
      ①无法射击目标、有障碍物、无法抵达、有队友预定、地面有火或"对自己的防守位置超出射程"的格子的评分无效
      ②基础分0.3
      ③自己射程大于5格时,加上(0.55*面对目标的掩体百分比)分
      (仅指袭击进攻情况)
      ④机械族统计8邻格的掩体效果的总和,加(8 - 掩体效果总和)分
      ⑤分数乘以0.967的x次方,x=自己与格之间直线距离,"自己与目标距离"超过100格时,x还需减去超出的距离,x最低0
      ⑥分数乘以理想距离因素,=1-0.3*格与目标直线距离和理想射击距离的远离程度
      理想射击距离为射程的0.8倍处
      远离程度=两个距离的平方差/理想距离平方
      ⑦如果"格与目标直线距离"低于5格,分数减半
      ⑧如果自己不是机械族或虫族,分数乘以炮塔因素,= (37.5 - 格被炮塔射程覆盖的炮塔数量)/37.5,因素最低取0.1
      5.如果所有格都评分无效,那么选取原地
      (JobGiver_AIFightEnemy.TryGiveJob、JobGiver_AIFightEnemy.UpdateEnemyTarget、GetShootingTargetScore、TryFindCastPosition)
      ③附图

      ④附图

      ⑤~⑦附图:

      ⑧附图:


      IP属地:天津53楼2024-03-23 22:09
      收起回复
        限流条件限流就是触发单位互相之间的碰撞体积,使得一格只能站一个单位。
        一、
        先介绍一下"区域"划分吧
        固定的地块会被划分为一个区域。在不考虑其他因素的情况下,地图最左下角的12*12格正方形范围划为一个区域,以此类推,每12*12格会被划分为区域。

        墙体会分割区域各个门、连着的栅栏与路障 算作区域,且会分割区域
        其他建筑(包括木柴发电机、沙袋等)对区域无影响
        清污泵类和深水不算区域,会分割区域

        泰南的这种反直觉导致你在同一个区域里用墙连一个不封口的迷宫,那其实没有任何隔绝仇恨的作用。不过在某个地块区域分界线上来回横跳,可以分割出大量区域。像左侧的整个迷宫只算一个区域,而右侧的算6个区域

        二、
        具体区域划分可以借着开发者模式功能来演示,在open debug actions menu菜单下,挑勾draw regions和draw region traversal即可。
        暂停时可以看到鼠标指向的格子出现绿或黄框范围,这是该格所属区域。然后邻接的白框范围是所有邻接区域。时间流动时,蓝框范围会不停闪烁,显示每个单位的索敌范围。注意任何索敌行为都会闪一次,像是敌人改变目标时会有一次全图的检测。

        三、
        每个单位每1.66秒检索周围若干"区域",如果区域内有敌对事物就触发"警惕"。默认是检索18个区域,如果已触发"警惕"则检索24个区域。门、深水不参与区域计数。注意就算不是在进攻基地路上的无关区域,只要在旁边也会被数进去。因此可以在旁边分开放一堆栅栏来遮蔽限流检测。图中有11个栅栏,占了11个区域,剩余向外检测7个区域。(内部的镂空优先级很低,所以没算区域)

        所有区域都会额外检测8邻格内的事物,墙门类可阻止斜角探测,但斜角上的门可无视墙门的阻止。

        四、
        单位大致上以从内向外、(南西北东内)的顺序检查区域,实际上从内向外分轮次、每轮按上一轮优先级检查邻接区域。具体顺序可以参考下图,从1开始数到19,有19是因为其中一个门只算区域不计数。

        五、
        单位在"警惕"状态下才会被限流,主要由以下两个方式触发。
        ①格中有敌对事物,触发限流。
        ②格中至少两个单位都有战斗工作,触发限流。如果其中一个单位是动物,另一个单位被征兆,则不触发限流。
        上述的"格中"有两种情况,一种是当前所在格有至少两个单位,这时触发限流会弹飞,不过附近没有任何可达空格时无法弹飞。另一种是想进到的下一格中有单位占着,这时触发限流会无法移动。另外还有一些例外,当单位A的体型<1.5且<单位B的3.57分之一时,A与B之间无视限流。

        使用爆炸物的工作不算战斗工作。隔门有通电炮塔时,ai会倾向于设定纯粹移动的工作,不算战斗工作。这两种情况会使敌人可以穿人
        另外,有些情况在无警惕时也会强制限流,比如:
        征召待命时,会移动散开。
        远程自动选择敌人时,会弹开限流。包括敌人远程、未征召远程、征召时自动选择下一个目标。不包括征召后第一次自动选择,征召手动选择。
        (MindStateTick、EnemiesAreNearby、BreadthFirstTraverseWork、PatherTick)


        IP属地:天津55楼2024-04-29 20:48
        收起回复
          基因的体型值得选小体型么,小体型后上穿梭机的重量都减了,好像也更容易给动物捕猎,还有什么影响


          IP属地:福建来自Android客户端56楼2026-01-05 19:12
          回复