【Unity】简易掩体系统

一、简单介绍:

该掩体系统是以地编盒子为基础,构成一根根“CoverLine”,然后FSM系统控制角色在这条线上运动,根据在线上的位置做出不同的动作。

 

二、CoverLine数据结构:

采用双链表的数据结构,对于box与box之间的引用关系(图示):

每个CoverBox对象都有的引用声明:

public CoverBox leftCorner, rightCorner;
public CoverBox left, right;

 

三、算法:

CoverLine俯视图

 

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出来

Progress calculate Diagram

(三个紫圈代表玩家的position相对于currentLine的三种情况(左超出,未超出,右超出))

①当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()...

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇