前言
研究一下Low Poly Epic City的CarBehavior和TrafficLight怎么做的。
今天研究的内容:
CarBehavior
首先,每个车辆都打上了"Car"标签,并且在前方放置一个触发器用于探测环境。
Low Poly Epic City使用在每个单元放置PathFinding,而我采用PathRequestManager为每个单元提供路径。
这里面部分功能与我的Unit脚本重合。比较好玩的是,它会获取前车的CarBehavior脚本,使用bool来表示其是否在红绿灯下,是否才车辆后面,是否正在移动。盲猜是给状态机用的。居然还定义了加速。
开始运行,会在Start中调用StartDriving。如果是随机目的地模式,选择随便一个Tile作为目的地。一共尝试tiles的总数次。
如果是检查点模式,将第一个检查点作为目的地。
然后会去调用寻路算法,拿到Path队列,找到第一个Path中离单位最近的点赋值给targetDrivePoint。如果是闭合路径,就将检查点翻转,因为检查点模式下一次调用StartDriving一定是所有检查点走完的时候。
如果寻路失败路径队列为空,是随机目的地模式就再次尝试,会尝试直到randomPathTries<=0。
FixedUpdate处理车辆移动,通过直接修改Position的方法。
还有两个小细节:
- 同样是查看单位当前的与目标点的距离,但是会加上速度,速度越快精度可以越低。
- 根据是否在车辆后面设置不同的速度,如果在车辆后面,速度不会超过前车。如果不在,会插值往车辆的最大加速,如果大于了路径最大速度则插值减速到路径最大速度。
如果没有路径,速度设置为0,什么都不做。
如果接近了目标点,会调用MoveToNextPoint来获取路径中的下一个目标点。首先查看path是否为最后一个path,如果是,是否为path中的最后一个位置,如果是,寻找下一个随机目的地或根据是否为闭环路径来决定是否往回再走。如果不是最后一个位置,再继续走。
如果不是最后一个path,查看是否为最后一个pathPosition。如果是,切到下一个path,activepoint设置为1。从设置为1可以看出,程序无视了path的第一个点。
OnTriggerEnter处理当车辆前面的触发器碰到东西的时候要怎么做。如果碰到红绿灯,红灯的情况下设置无法移动,并且给lightChange委托绑定StartMoving函数,变为绿灯时再次开始移动。挺高效的。
有趣的是,会判断红绿灯与单位的角度,基本上是正前方的红绿灯才进行考虑。
火车道交叉点和红绿灯类似,当前方是其它车辆时,通过判断与其它车辆的角度来做决策。估计最后一个if处理当遇到可能相撞的情况时停车。
离开触发器时需要的一些处理。
TrafficLightControl
切换红绿灯状态,并改变材质。
每隔一段时间调用一次。
Crosswalk咱们不管,这里面重要的就是委托LightChange和isGreen。
接下来的计划:
接下来用自己的代码把功能做出来。