AdvancedLocomotionSystemV4分析(四):布娃娃和起身
接下来就是布娃娃系统,对应的就有从布娃娃恢复成正常状态的起身动作。
这里还同时分析了一下站立和下蹲姿势的切换,因为起身动作会涉及到这一块
AdvancedLocomotionSysemV4分析(一):移动和脚步IK
AdvancedLocomotionSystem分析(二):攀爬系统
AdvancedLocomotionSystemV4分析(三):动作叠加
输入
站姿切换的输入比较简单粗暴,ASL
项目用一个按键来实现姿势切换和翻滚,我这里方便测试就直接把这两个功能分开了,只需要设定一个按键直接调用Crouch
和UnCrouch
即可,然后在角色自带的时间OnStartCrouch
和OnEndCrouch
去调用方法OnStanceChanged
然后是布娃娃的输入,直接按键以后调用RagdollStart
即可,如果已经处于Ragdoll
状态就调用RagdollEnd
结束布娃娃状态
布娃娃
开始/进入布娃娃状态
进入布娃娃状态我们分3步走
- 设置移动状态为
None
,设置MovementState
为Ragdoll
- 关闭胶囊体碰撞,设置骨骼模型的碰撞为
PhysicsBody
,开启物理和检测效果,打开pelvis
及以下的所有骨骼物理效果 - 停止当前蒙太奇动画
这里有一个非常大的坑需要注意,第2条的开启骨骼物理效果需要修改默认的骨骼物理资产,见下图
需要注意几点
- 给
root
添加一个碰撞体 - 修改碰撞体属性,
PhysicsType
设置为Kinematic
,关闭碰撞检测 - 修改
root
与pelvis
碰撞体之间的约束,线性约束全部设置为free
如果不做以上几点你就会发现起身以后位置的异常,是因为pelvis
碰撞体如果最为最上层碰撞体必然会导致的异常位置缘故
进入布娃娃以后我们也需要看一下动画蓝图中的内容
在主动画视图里的最后节点混合了布娃娃状态机
比较简单,2个状态机切换而已
刚进入布娃娃的时候使用动画Flail
动画来过度
离开布娃娃时会使用离开布娃娃瞬间保存的快照动作来过度,很巧妙
刷新布娃娃状态
图片上的注释已经说的比较详细了,用的方法比较传统,这个线速度保存着是为了在结束布娃娃状态的时候在特定时候需要继续使用
结束布娃娃状态
需要稍微注意的是这里有一个方法GetGetUpAnimation
来得到具体的起身蒙太奇动画,考虑到的主要就是动作叠加问题,其实动画序列来自于同一个,只是动画通知内容不一样
动画通知调用了接口设置角色的状态为GettingUp
到这里,整个布娃娃和起身逻辑基本上完成了,但是实现的时候还会发现一个问题,就是起身以后会异常抖动
原因是这套系统需要配合站立/下蹲的过度切换,如果不参用这个套路或者把起身动画里的下蹲权重=1的曲线BasePose_CLF
删掉或设置为0都可以让角色直接成为站立状态,不需要下蹲姿势的过度,不过这个效果稍微差劲一点,看下图对比
站立/下蹲切换
下蹲在Baselayer
层内也有类似站姿的2个状态机,实现内容也大同小异不过多讲述了
Cycles
内6方向混合,States
内停止/移动切换,转身
重点看一下MainGrounded
状态机内的姿势切换状态机
拿一张脑图来说明一下
两个过渡状态机添加了通知StopTransition
另外,目前阶段的切换站姿会导致视角抖动,因为UE4本身Crouch
的瞬间会把胶囊体的大小缩放为CrouchHalfHeight
的高度,解决方法是把相机独立出去,即不挂载在角色身上,后续分析