基于ShooterGame例子,站立和蹲,引擎已经支持了,卧倒趴着和蹲类似一个状态,现在讨论卧倒趴着实现思路。
由于基于Character,自带了CapsuleComponent,并且是Character根节点,我们在卧倒趴着时候,修改CapsuleComponent方向可能影响其挂着子节点情况,所以添加卧倒趴着使用的CreepCapsuleComponent(绑定到CapsuleComponent,这样卧倒趴着移动旋转随着CapsuleComponent转动了),卧倒趴着的时候和角色骨骼模型贴合。卧趴先计算角色前后位置地面倾斜度,倾斜度构造一个朝向,设置该倾斜度到卧趴角色骨骼模型和CreepCapsuleComponent的原朝向里,这样他们相应贴着地面。
倾斜度计算思路:在角色头部正前后方向处(等于半身高距离处)分别设置碰撞开始位置,在角色脚步正前后方向处(等于半身高距离处)分别设置碰撞结束位置,角色前后分别往脚下进行碰撞检测,求出前后两个碰撞点F、B,在使用两个碰撞点构造正朝前方向,如:
FRotator R = FRotationMatrix::MakeFromX(B - F).Rotator();
R.Normalize();
R.Pitch就是角色倾斜度了。
重载角色移动组件类,这些物理计算写在PhysWalking(float deltaTime, int32 Iterations)下,有卧倒趴着命令操作,就开始判断计算角色和地面倾斜度,然后设置到卧趴角色骨骼模型和CreepCapsuleComponent的原朝向里,进入卧倒趴着状态条件,角色动画蓝图相应根据其状态条件进入卧倒趴着系列动画。
注意点:
1.CreepCapsuleComponent默认没有碰撞,在卧倒趴着状态设置有碰撞,非卧倒趴着状态在设置默认没有碰撞。
2.CapsuleComponent和CreepCapsuleComponent设置互相碰撞忽略,CapsuleComponent可以设置尺寸小到一定程度,CreepCapsuleComponent和角色模型贴着,根据卧倒趴着情况设置合理尺寸。非卧倒趴着状态恢复尺寸。
3.还需要处理CreepCapsuleComponent碰撞影响玩家移动情况,可以重载主角CapsuleComponent的MoveComponentImpl函数,函数内使用CreepCapsuleComponent参考基类MoveComponentImpl函数模拟碰撞影响移动情况。