AdvancedLocomotionSystemV4分析(二):攀爬系统

ALS系统的攀爬系统思路比较简单,播放蒙太奇配合位置的刷新。缺点是没有中间状态,意味着无法打断或者做平移等

后面我打算尝试改成加入中间过程的攀爬系统

AdvancedLocomotionSysemV4分析(一):移动和脚步IK

AdvancedLocomotionSystemV4分析(三):动作叠加

AdvancedLocomotionSystemV4分析(四):布娃娃和起身

AdvancedLocomotionSystemV4分析(五):镜头

检测/ClimbCheck

原工程里的Climb用的是Mantle,作为一个英文盲还是改成了自己看得懂的单词

image-20201028165706917

image-20201028165823436

先要从输入开始,起跳输入以后在状态改为InAir之前就做了一次检测,另外在Tick中有检测

  • TraceSetting
    • MaxLedgeHeight
    • MinLedgeHeight
    • ReachDistance
    • ForwardTraceRadius
    • DownwardTraceRadius

此数据结构是配置好的常量,分FallGroundedAutomatic三种配置


  • 总览

image-20201028170206771

思路是比较简单,但是算法略复杂

  1. 自身身体部位打一个胶囊体射线,射线始末点跟传入参数的最高/最低墙高度和ReachDistance有关系,得到墙体上的点和发现
  2. 从上往下打射线得到适合的落脚点位置
  3. 判断落脚点是否有足够的空间站人
  4. 根据所需要攀爬的高度来设置攀爬类型
  5. 开始攀爬

开始攀爬/ClimbStart

image-20201028170736835

一切围绕两点

  1. 算出播放的动画参数,包括动画蒙太奇以及播放速率等

  2. 算出播放动画时所需要更新的位置信息

实现思路是

  1. 根据攀爬类型和当前叠加的状态(目前还没有实现,可以理解为受伤或者拿某种武器的姿势下的不一样的动画参数)得到相应的动画参数image-20201028171040513上图即使默认的2米高度攀爬的参数
  2. Climb Check函数得到的墙体位置信息转化为墙体本地空间的位置信息
  3. 计算得到角色位置和墙体最后位置的世界空间偏差
  4. 计算得到动画位置偏差,这个可以理解为攀爬动作本身就有唯一,这个位置偏差就是动画本身会造成的偏差。这里我们的动画都是锁定根骨骼的,意味着我们手动计算位置而非用动画本身的RootMotion
  5. 设置运动模式
  6. 根据动画参数设置TimeLine以及启动TimeLine
  7. 播放攀爬动画

刷新攀爬位置/ClimbUpdate

录制_2020_10_29_09_25_36_526

一张动图比较清楚的描述了位置的插值过程

从白色框到红色再到最终的蓝色,胶囊体的位移比动画早完成

image-20201029092848925

攀爬结束/ClimbEnd

结束在Timeline结束的时候调用,就是把MovementMode改回Walking

这里还有一个比较重要的事情要做,不然在爬上去以后马上移动的话,脚步还有lock效果会拉伸

于是在攀爬动作的后半段加上一个通知

image-20201029093133029

目的就是检测在最后阶段是否有输入或者姿态切换,如果有就MontageStop

原作这里需要指定当前的动画本身,我这里做了稍微简化

image-20201029093239908