besiege吧 关注:85,435贴子:857,692

存档发布+讲解——御剑仙人+迷宫AI

只看楼主收藏回复

前面我制作了御剑仙人和迷宫AI两个效果比较华丽的作品,由于时间关系没有直接放出,这一次吧两个存档都放出来,并且对其中逻辑的实现过程进行简单的讲解。不过受限于篇幅,大家不一定都能理解,看看了解一下整个逻辑的设计思路也是可以的。




IP属地:河南1楼2019-04-30 14:34回复
    御剑仙人
    steam创意工坊:id=1727620088
    主技能:御剑术,自动追击40格以内的敌人,并在靠近后挥舞8支剑进行攻击。

    被动技能:AT立场,正面受到抛射物攻击时,展开AT立场进行防护。

    辅助技能:舞剑术,周身召唤10支剑环绕,进行清场。按键R控制。

    终极技能:无中生友,召唤一支50人的军队。按键T控制。召唤前叉叔不能离开原位。

    终极技能还有为了拍摄进行特殊编排的版本,这里就不放出了。


    IP属地:河南2楼2019-04-30 14:41
    回复
      小迷宫AI
      steam创意工坊:id=1727620570

      小迷宫AI
      steam创意工坊:id=1727620828

      这两款迷宫AI的逻辑部分是相同的,只是第二个为了进行更深入的测试,而重置了迷宫的布局,新的迷宫会使得简易AI如左(右)手定则失效,并且对于随机运动AI也会很不友好。


      IP属地:河南3楼2019-04-30 14:46
      回复
        御剑仙人技术讲解
        其实御剑仙人里面,那些技能的技术其实是非常简单的,最核心的技术反而是运动的跟随系统。里面大部分的地图模块,都会跟着叉叔的运动而运动,这部分才是最重要的。
        这套运动系统我最早是参考工坊上一个SAM-2导弹制作的,现在由JJ饿和nice name定名为归元法。它的核心思想是:让所有运动的物体,在一瞬间完成“回归到运动的中心点→转动一定的角度→从中心点回到新的位置。”具体的逻辑段如下:

        图中的百块:开局后:瞬间沿着局部坐标X轴负向运动8→瞬间沿世界坐标转动45度→瞬间沿着局部坐标X轴正向运动8
        这3个步骤分别对应图中的红绿蓝三个位置,在开局之后,就能看到白块瞬间出现在了蓝块的位置上。这种运动方式的特点就在于,它将原本的圆周运动转化为了三个子运动,分别是前后的沿半径直线运动和中间的绕圆心转动。由于前后的直线运动都是采用的局部坐标模式,因而在方块转动之后,其实际的运动方向就是新的朝向了。这种运动方式的特点就是能做到极高精度的圆周运动,如果大家进行了实际操作,就能看到白块能够跟蓝块严丝合缝。
        另外一个特点就是瞬间移动。三个运动的时长都是instant,但实际上,这三个运动都是在同一个瞬间完成的,所以实际上,白块并不会出现红绿两个状态就能直接出现在了蓝块的位置,因此实际上并不影响观感。
        如果说,在用归元法运动之前,物体本身就带有一个角度,并不是沿轴向对齐转动中心,那也没关系,只要在回归转动中心前,再用一个instant运动先对齐,并且在结束的时候再转回去,就OK了,只要记住所有的动作都是在一个瞬间完成的就行。


        IP属地:河南4楼2019-04-30 15:11
        收起回复
          用instant控制运动有一个特殊之处。
          上面我说到,多个运动实际上会在一个瞬间全部完成,这实际上也就意味着,采用instant控制的运动,可以在一个瞬间接收多个运动的信号。
          举个例子,如果我同时用instant控制目标方块向前走4块和向左走4块,并且这两条逻辑都放在了不同的物体中,那个目标方块就能同时响应走出一条斜线,并且不会出现同时运动的错误信息。
          这也就意味着,采用这种运动方式控制的御剑仙人的多个模块,能够同时完成前进、左右、转向等多个运动,却又不会报错。


          IP属地:河南5楼2019-04-30 15:22
          回复
            实现这个御剑仙人还少不了一个元素,那就是火把叉叔。
            与其他的人物不同,叉叔的碰撞箱比较特殊。一般的人物,他的碰撞箱都是一个圆柱体,但是叉叔的碰撞箱是同心的一个圆柱和一个长方体,如下图中黄色的部分。

            这也就意味着,当叉叔在旋转的时候,我们就能够通过叉叔两侧的长方体来感觉到他旋转的角度了。
            感应叉叔运动的触箱比较复杂。首先是橙黄色的触箱,用来感知叉叔的前进。
            红框和褐色框是用来感应叉叔转动的。红色是低速高精细度的,一次转动1度;褐色框是高度低精度的,一次转动20度。由于这个转动的角度是确定的,而叉叔转动的速度很快,所以如果角度过大,这个跟随系统就没办法做到正确的感应,因此我在存档中专门说明了最好是在前方的120度范围内使用。
            粉色框是用来感应叉叔左右偏移的,当跟随物体的运动中心相对叉叔偏左或者偏右的时候,就能逐步修正回到中心。


            IP属地:河南6楼2019-04-30 15:31
            回复
              (ಡωಡ)


              IP属地:黑龙江来自Android客户端7楼2019-04-30 16:07
              回复
                真丶神仙


                IP属地:广东8楼2019-04-30 16:42
                回复
                  这些解析对地图逻辑对初学者真的很有帮助


                  IP属地:浙江来自iPhone客户端9楼2019-04-30 17:43
                  回复
                    少有的逻辑教程

                    (脑阔疼)


                    IP属地:四川来自Android客户端10楼2019-04-30 18:41
                    回复
                      “午休”结束继续讲解
                      迷宫AI的技术讲解
                      如前所述,迷宫AI的工作方式的“路径记忆”。这个“记忆”的核心,就是在每个岔路口放置的路标触箱。而基本上,整个AI的其他部分的逻辑都较为简单,都是一些非常基本的运动控制逻辑了,即使是作为AI主体的方块。
                      这个路标触箱要实现的功能比较多,包括:
                      1,它需要记忆AI第一次来到这个路口的方向,避免在正常情况下走回去;
                      2,它需要感应从死路返回的AI,之后和AI进行数据的交互,将死路的信息储存,并指导AI规划其他未探索的路径;
                      3,它需要感应从环路走来的AI,并和AI进行数据的交互,将环路信息储存为死路,并让AI原路返回;
                      4,当感应到从最后一个岔路返回的AI时,能够将自己解除钉扎,并和AI一同返回,用于下一次岔路标识;
                      5,能够感知四向路口,并且避免AI在第一次返回时落下新的路标。
                      思路说完了,后面就是一些具体实现方面的内容。


                      IP属地:河南11楼2019-04-30 19:52
                      回复
                        运动控制很简单,就是在AI周围4个方向上有4个触箱,当感应到墙壁的时候,分别给全局变量xmzztyl输入值1、2、4、8,这样一来,数字从0到15就分别对应了一种路口岔路的状态。
                        *xmzztyl:全局变量,记录当前路口的不可行方向。
                        变量xmzztyl随后传入单向的方向机中,在这里,每一个变量值都有对应的路径选择结果,随后输出下一步的运动。
                        路标的第一个功能,记忆AI第一次来到这个路口的方向,这个是通过路标的控制方块进行的,每一次新的运动方向产生后,控制方块都会给各自的路标传递两个局部变量dire和dire2,用来记录到达下一个路口时,来路的方向。当一个路标被钉扎后,路标的控制方块就会被关闭,不仅路标不会再运动了,而且也不会再传输新的来路方向信息,从而使得被钉扎的路标记录的是AI到达这个岔路的来路方向。这两个局部变量功能不同:
                        *dire:局部变量,在路标触箱内记录所在路口所有死路的方向。每一次AI返回,都会给这个变量赋值。
                        *dire2:局部变量,记录最初到达钉扎路口的来路的方向。只有在所有岔路全部探索完成的时候,才会启用这个变量。
                        第二个功能,与从死路返回的AI进行数据的交互。这个过程看似简单,实际上要进行多层的变量值运算,实现这个目的的是我常用的一种手段,暂且称为“单变量的值域-功能方法”。
                        就以路标内存储死路信息的局部变量dire为例,在0-15的值域内,这个变量没有输出信号,只记录每一次改变后的值,因此这个值域[0,15]就是“记录”功能的值域。如果给dire+20,将“记录”值域内的数值增加到对应的[20,35]中,此时每个数值都会输出一个路径选择信号,因此这个值域[20,35]就是“输出”功能的值域。
                        不过具体在触箱里实现数据的交互是很困难的事情,困难点在于“如何在不依靠具体指向的情况下,将数据传递给目标的物体中”,具体来说,就是如何将当前的死路方向信息,单独地传递给这一个路标,而又不需要将这一串逻辑特异性地指向这一个路标。实现的方式我暂时称之为“变量中介”。
                        仍以局部变量dire为例,在dire之前还有一个局部的中介变量dire-tem,dire-tem同样是“值域-功能”结构,如果路标没有感应到AI的进入,dire-tem的数值就会在低值域中,随后被清零。如果感应到进入了,就会+10,进入“准备”功能。随后在感应到AI返回的死路方向之后,dire-tem值进一步增加,进入到“传递”功能区中,从而将死路方向传递到变量dire中。这样一来,就只有感应到AI进入的路标才会吧死路信息储存起来了。


                        IP属地:河南12楼2019-04-30 20:33
                        回复
                          随着功能二的实现,功能三环路感应也就简单了。
                          同样是变量的传递过程,不同的是,此时多了一个AI运动状态的全局标记变量wrong。死路返回的AI,其值为1,在遇到路标后启动“值域-功能”结构,传递死路信息。
                          如果是正常运动的AI遇到了路标,就说明,此时AI走的是一条环路,并且遇到了先前落下的路标。此时wrong=0,遇到路标后启动“值域-功能”结构,除了传递死路信息,还会直接生成一个反向运动的指令,跳过方向机直接指挥下一次的运动。
                          功能四解除路标就需要用到局部变量dire2了。当所有岔路都探索完毕了,记录不可行方向的变量xmzztyl就会=15,此时会通过另一个“变量中介”repin在当前路标内启动计算,将dire2的值传递回xmzztyl中,从而生成一个原路返回的指令,同时控制解除当前路标的钉扎。
                          功能五感知四向路口则应用了另一种我常用的手段,暂时称为“半程传递”。就以这个过程为例,当4个方向都没有感应到围墙时,xmzztyl=0,此时会首先产生一个全局变量4cross,之后才会控制路标总控方块钉扎路标。而在每个路标的控制方块内,在感应到全局的4cross后,会控制对应路标的局部变量4cross+10,等待0.1s后-10。但是被钉扎的路标,其控制方块在不到0.1s内就会被关闭,这一段逻辑就只有前半段工作,后半段就被关闭了,因而四向路口的信息就被存储到了路标中,随后在感应到AI重新返回的时候,启动“值域-功能”阻止新路标落下。而其他路标,要么控制方块早被关闭,不产生响应,要么0.1s后就被删除数据了,就都不会响应四向路口的信息。


                          IP属地:河南13楼2019-04-30 21:02
                          回复
                            这样一来,两个作品的逻辑就全部讲解完毕了。因为后面想出更加详细的教程说明这些手段的应用,所以这篇帖子就只将概念,不给出具体的逻辑过程和动作演示了,感兴趣的朋友就敬请期待吧


                            IP属地:河南14楼2019-04-30 21:04
                            回复
                              向大佬低头


                              IP属地:湖南来自iPhone客户端15楼2019-04-30 21:23
                              回复