交接文档

蚂蚁通讯双桥实验交接文档

编写者 王小梯
版本号 V2.0.0
修改时间 2021-4-12
修改内容 将交接文档转成MD文件,对交接文档做补充说明
编写者 龙腾蛟
版本号 V1.0.0
修改时间 2020-12-17
修改内容 初始交接文档

对接信息:
策划案:http://svn.sdp.nd/svn/doc_doc_property_designcenter/%E8%BD%AF%E4%BB%B6%E8%AE%BE%E8%AE%A1%20%E4%BA%94%E5%A4%84%20%E5%8E%9F%E5%9E%8B/101LAB/%E5%8E%9F%E5%9E%8B/%E5%AE%9E%E9%AA%8C%E5%99%A8%E6%9D%90/%e7%94%9f%e7%89%a9/%e8%99%9a%e6%8b%9f%e5%ae%9e%e9%aa%8c%e5%ae%a4-101%e5%ae%9e%e9%aa%8c%e5%ae%a4-%e7%94%9f%e7%89%a9%e5%ae%9e%e9%aa%8c%e5%99%a8%e6%9d%90-%e2%80%9c%e8%9a%82%e8%9a%81%e2%80%9d%e7%9a%84%e8%87%aa%e8%ba%ab%e5%b1%9e%e6%80%a7%e5%92%8c%e8%a7%84%e5%88%99%e8%ae%be%e8%ae%a1/

策划:肖炜
元器件:陈增鑫
老师:江敏

接口文档:https://www.showdoc.com.cn/VLab?page_id=5043684748909847
组件脚本位置:
GeneralAbility\VLabGeneralAbility\Scripts\Biological\LivingBody\MaYi\
GeneralAbility\VLabGeneralAbility\Scripts\Biological\Environment\MaYi\

后续VR适配需要修改的核心脚本:
TiePanForAntsMove(环境更新、提供AC接口)
AntBehaviour(单只蚂蚁的运动逻辑AI)

一、实验流程简述

1.1、搭建实验环境

实验需要如下器材:铁盘、水、石头、长木条、馒头块、蚂蚁、香水。
以铁盘为主体,按照上一行所说的顺序(香水除外)把环境拼成下面的样子,吧蚂蚁倾倒上去后,实验就会开始:

1.2、蚂蚁首次搬运食物

实验开始后,蚂蚁会随机向两座岛出发,首只发现食物的蚂蚁(先行者)会返回巢穴并一路留下信息素,沿途还会与其他蚂蚁进行触角通讯(通讯行为只是个表现,不会影响实验逻辑)。先行者回到巢穴后,会立刻返回食物所在位置,等待其他蚂蚁集合搬运食物。
先行者之外的蚂蚁,会在接触信息素后得知食物所在位置并直奔食物;
在空岛上搜寻食物的蚂蚁,会在搜寻数次无果后返回巢穴,此后不会再去空岛搜寻目标;
期间无法对元器件进行拆卸等操作。

蚂蚁合力将食物搬回巢穴后,会静止一段时间。静止期间,用户可以拆卸元器件,此时要求用户将左右两桥的位置对换。

1.3、蚂蚁第二次搬运食物-换桥

由于两桥位置对调,受残留信息素的影响,蚂蚁会全部跑到空岛。搜寻无果后,蚂蚁会返回巢穴,重复1.1的过程,把第二块食物搬回巢穴:

1.4、蚂蚁第三次搬运食物-喷香水

蚂蚁第二次搬回食物后,用户要在右桥上喷香水,破坏信息素。

之后蚂蚁就会在右桥上来回乱走,一直找不到食物。

至此实验结束,删除铁盘,所有元器件会同时销毁。

注:以上是规范的操作流程,但这个实验颗粒需要投入很多时间去处理不规范的操作:比如蚂蚁静止时,把两座桥都拆掉了没装上,或者只装了一边。VR适配时需要处理的情况更多。

二、蚂蚁状态切换流程图

三、蚂蚁的类图

四、设计详解

蚂蚁基于A星寻路算法进行运动。
实验过程中会有一张导航图,数据存在ElementResource/GenernalResource/Data/AntEnvGraphData.bytes,记录了蚂蚁的可行走和不可行走区域(拼接和拆除操作会更新导航图);
每只蚂蚁都有一个单独的空物体target作为自身的运动目标,实验就是通过调整每只蚂蚁的target来实现不同的运动模式的。

4.1、铁盘:

4.1.1、

创建铁盘元器件时,会从GenernalResource读取导航网格的数据,生成导航网格:


导航图红色的部分是不可行走区域,空白部分是可以行走的区域。
橙色的部分是障碍块,目前有四个(左桥整体、左桥局部、右桥整体、右桥局部),当发生两座桥的拼接和拆卸操作时,可以通过这四个障碍块灵活地将两座桥的区域设为可行走/不可行走。

创建铁盘时,还会创建两个实例——
其中AstarPath是导航网格,四个子物体分别对应了四个障碍块。需要注意的是,场景中只能存在一个AstarPath,也就是说,无法同时进行两个蚂蚁实验,否则两个地图会互相干扰。这一块如果需要优化,请联系王伟超(958857)同学进行排期;
RVO是动态闭障实例,可以避免蚂蚁运动时不停和其他单体对抗前进;
这一部分是在TiePanForAntsMove.Init()方法中处理的。

4.1.2、

铁盘创建完成后,本身会挂上一些脚本,其中比较重要的有两个——TiePanForAntsMove和AntsManager:

4.1.2.1、

TiePanForAntsMove脚本负责整个实验的进度管理,提供了所有的AC接口。
1-脚本里记录了拼接到铁盘上的各个元器件实例,包括巢穴、空岛、食物岛、左桥、右桥、馒头块列表、蚂蚁列表等。各种元器件进行拼拆操作时,都要调用AC接口进行内部环境数据更新:

2-实验中重要的三个节点(实验开始、交换双桥、喷洒香水),也由元器件调用AC接口完成:

3-蚂蚁运动的过程中,是不允许进行元器件的拼拆操作的;只有在蚂蚁静止时才能进行元器件拼拆。所以元器件要注册两个事件,一个关闭交互、一个开启交互,而具体的调用时机由组件决定:

注:在新建实验中,元器件的拼接顺序是有要求的,比如要先放好岛屿,才能架桥,这一部分由元器件进行限制。但是,如果是已经拼好环境的一个lab文件,直接打开的话,拼接顺序是无法确定的,可能先拼接了桥,后拼接了蚂蚁,可能会造成代码报错,这是虚拟实验室的锅,编码时一定要注意这一块的处理。

4.1.2.2、

AntsManager脚本主要负责蚂蚁的初始化,为蚂蚁添加各种需要的脚本。

同时也对外提供一些状态管理和查询接口,比如将所有蚂蚁设为失活状态、查询是否所有蚂蚁都是静止状态等。

4.2、石头:

一共有三块石头,可分为巢穴、空岛和食物岛,这里主要说下巢穴。
巢穴是蚂蚁的出生点,也是一个通讯中枢。先行者回到巢穴会留下信息素标记食物位置;而在空岛搜寻无果的蚂蚁回到巢穴会留下信息说空岛上没有食物。就这样所有蚂蚁都把自己了解到的信息留在巢穴进行信息共享,这样每次蚂蚁回到巢穴时都会获得最新的探索结果。

同时,巢穴石头有一个食物摆放位置的子节点,蚂蚁会把找到的食物运回这三个位置(从左到右)。这些子节点由元器件创建,组件只需知道节点路径:

4.2、馒头块:

馒头块会挂上AntFood,具体功能不再赘述,这里讲下馒头资源:
1-馒头块本身带有几个collider,具体如下:
当蚂蚁闻到首个食物的气味后,会忽略其他食物的气味,优先去检查首个食物是否存在(去触碰食物本体),若不存在,则会重新进入觅食状态。

2-馒头块有个CarryPoints子节点,规定了蚂蚁合力搬运食物时的站位,也就是说,根据蚂蚁到达食物的先后顺序,其站位都是固定的。这里着重讲下,当搬运食物时,只有第一只到达的蚂蚁是“搬运者”,按照A*寻路返回巢穴,其他蚂蚁都处于静止状态,都是搬运者拖着走的。因此食物的摆放点要很讲究,不能轻易改变。而且此后要适配VR的话,可能会出现“蚂蚁合力搬起食物,然后在右桥乱走,回不到巢穴”的情况,要注意运动时别让其他蚂蚁的位置超出桥梁。

4.3、蚂蚁:

蚂蚁的类图和逻辑流程已在手册开头说过,这里做下复述和补充:
1-蚂蚁基于A寻路算法移动,每只蚂蚁都有一个自己的target物体作为移动目标,所有target物体都放在TargetRoot根节点下:

2-蚂蚁的状态转换是在AntBehaviour的OnTriggerEnter和Update中处理的;
3-蚂蚁状态转换的工具类是AntStateManager;
4-觅食状态时,控制蚂蚁无序运动的脚本是AntRoamRVO。老师有个需求,蚂蚁到达空岛时,要在空岛上搜寻数次才能确定空岛上是没有食物的,这段逻辑在AntRoamRVO的Update里。
5-蚂蚁身上挂了比较多的collider。分别有如下作用:

6-目前蚂蚁只会在右桥上分泌信息素,信息素里记录的是食物的世界坐标。*当“对换双桥”后,世界坐标会根据铁盘位置进行对称变换;当“喷洒香水”后,信息素会被清除。


7-除了导航图的限制,蚂蚁还会通过垂直向下的射线检测识别环境,它只会在挂有AntMoveEnvironment脚本的物体上行走,三块石头、两块木板上是有挂这个脚本的。
8-老师提的需求:当超过80%的蚂蚁聚集在食物旁时,剩下的蚂蚁不管在哪儿,全都直接赶过去(避免落单),这一部分代码放在AntsManager的Update()里。

4.4、香水:

香水是VR适配时的主要问题。
4.4.1、在PC端,对香水的操作进行了限制,只有同时满足“实验开始、蚂蚁全部静止”后,香水才能且仅能和“右桥”交互。交互完的表现是:所有蚂蚁进入混乱状态(只会在右桥上来回走,同类、食物、巢穴都无法识别)。
4.4.2、而在VR下,香水的交互是没有限制的,可以在任意时间喷到任意位置。
经过和老师的讨论,VR的香水效果应是如下表现:(最好和老师再确认一下)
1-环境分为五个部件,分别是巢穴、空岛、食物岛、左桥、右桥,喷到某一部件的某一部分时,视为整个部件上都有香水;
2-香水不会直接作用于蚂蚁,但是当蚂蚁运动到带有香水的部件上时(暂称为部件A),会进入混乱状态(只会在部件A的区域来回走,同类、食物、巢穴都无法识别)
3-更多细节比如当蚂蚁搬运食物时走到部件A、或者部件A是巢穴,这些情况的表现需要和老师重新确认,还要向策划确认新的策划案及OA需求。

王小梯 补充:

2021-04-12 17:22:53 星期一
对接测试补充文档:
1、蚂蚁AntRoamRVO脚本上的ListNoFoodEnv集合记录的是,蚂蚁知道的没有食物的地方。
2、蚂蚁会朝向TargetRoot下的物体移动。如果蚂蚁正在集体搬运食物,随从的蚂蚁就会跟随主蚂蚁相对静止运动。
3、设置蚂蚁运动的点即可,RVOLocalSpace和AntWalkRVO脚本控制蚂蚁运动到target目标点
4、AntRoamRVO处于激活状态时,蚂蚁移动就会混乱