一、简单介绍:
该掩体系统是以地编盒子为基础,构成一根根“CoverLine”,然后FSM系统控制角色在这条线上运动,根据在线上的位置做出不同的动作。
二、CoverLine数据结构:
采用双链表的数据结构,对于box与box之间的引用关系(图示):
每个CoverBox对象都有的引用声明:
public CoverBox leftCorner, rightCorner;
public CoverBox left, right;
三、算法:
1.leftNode,RightNode选择
根据当前玩家所在box的边缘关系(是否存在coner或者说edge),leftNode与rightNode的不同选择情况
1、currentBox都有left和right引用,则
leftNode=currentBox.coverPoseP;
rightNode = currentBox.right.coverPoseP;
2、currentBox的left为空,但right不为空
leftNode=currentBox.leftEdgeP;
rightNode = currentBox.coverPoseP;
3、currentBox的left不为空,right为空
leftNode=currentBox.coverPoseP;
rightNode = currentBox.rightEdgeP;
4、currentBox的left、right均为空
leftNode=currentBox.leftEdgeP;
rightNode = currentBox.rightEdgeP;
5、currentBox的left、right均为空,并且当前为edge状态,且正在掩体瞄准
leftNode=currentBox.leftEdgeAimP;
rightNode = currentBox.rightEdgeAimP;
2.进度计算
每帧根据leftNode和rightNode计算process,并且将currentLine; 、vertical、horizon等变量 out出来
①当process<0时,尝试currentBox = currentBox.left;
②当process>1时,尝试currentBox = currentBox.right;
若尝试失败,则判定为edge状态
edge状态下:若此时相应side方向的coner不为空的话,则长按对应方向键,触发切换掩体朝向
vertical变量用途:
在OnAnimatorMove阶段,对ApplyRootMotion后的位置修正,保证角色的position在currentLine这条线上
playerTransform.position -= vertical;
horizon变量用途:
同样在OnAnimatorMove阶段起位置修正作用,保证角色position不超出currentLine;
if(process>1 || process<0)
playerTransform.position -= horizon - coverSide==Left?Vector.zero: currentLine;
3.状态机分层:
CoverMoving和CoverAim部分逻辑是重叠的,故提取出Cover层将这部分逻辑给Cover的各个状态用于base.Update(), base.Enter()...