AdvancedLocomotionSystemV4分析(二):攀爬系统
ALS系统的攀爬系统思路比较简单,播放蒙太奇配合位置的刷新。缺点是没有中间状态,意味着无法打断或者做平移等
后面我打算尝试改成加入中间过程的攀爬系统
AdvancedLocomotionSysemV4分析(一):移动和脚步IK
AdvancedLocomotionSystemV4分析(三):动作叠加
AdvancedLocomotionSystemV4分析(四):布娃娃和起身
AdvancedLocomotionSystemV4分析(五):镜头
检测/ClimbCheck
原工程里的Climb
用的是Mantle
,作为一个英文盲还是改成了自己看得懂的单词
先要从输入开始,起跳输入以后在状态改为InAir
之前就做了一次检测,另外在Tick
中有检测
- TraceSetting
- MaxLedgeHeight
- MinLedgeHeight
- ReachDistance
- ForwardTraceRadius
- DownwardTraceRadius
此数据结构是配置好的常量,分Fall
、Grounded
、Automatic
三种配置
- 总览
思路是比较简单,但是算法略复杂
- 自身身体部位打一个胶囊体射线,射线始末点跟传入参数的最高/最低墙高度和ReachDistance有关系,得到墙体上的点和发现
- 从上往下打射线得到适合的落脚点位置
- 判断落脚点是否有足够的空间站人
- 根据所需要攀爬的高度来设置攀爬类型
- 开始攀爬
开始攀爬/ClimbStart
一切围绕两点
算出播放的动画参数,包括动画蒙太奇以及播放速率等
算出播放动画时所需要更新的位置信息
实现思路是
- 根据攀爬类型和当前叠加的状态(目前还没有实现,可以理解为受伤或者拿某种武器的姿势下的不一样的动画参数)得到相应的动画参数上图即使默认的2米高度攀爬的参数
- 把
Climb Check
函数得到的墙体位置信息转化为墙体本地空间的位置信息 - 计算得到角色位置和墙体最后位置的世界空间偏差
- 计算得到动画位置偏差,这个可以理解为攀爬动作本身就有唯一,这个位置偏差就是动画本身会造成的偏差。这里我们的动画都是锁定根骨骼的,意味着我们手动计算位置而非用动画本身的RootMotion
- 设置运动模式
- 根据动画参数设置
TimeLine
以及启动TimeLine
- 播放攀爬动画
刷新攀爬位置/ClimbUpdate
一张动图比较清楚的描述了位置的插值过程
从白色框到红色再到最终的蓝色,胶囊体的位移比动画早完成
攀爬结束/ClimbEnd
结束在Timeline结束的时候调用,就是把MovementMode
改回Walking
这里还有一个比较重要的事情要做,不然在爬上去以后马上移动的话,脚步还有lock效果会拉伸
于是在攀爬动作的后半段加上一个通知
目的就是检测在最后阶段是否有输入或者姿态切换,如果有就MontageStop
原作这里需要指定当前的动画本身,我这里做了稍微简化