Tizeng's blog Ordinary Gamer

ALS学习

2025-05-22
Tizeng

输入相关

使用EnhanceInput时,将对应的IMC作为参数调用AddMappingContext后,还需要为每个IA注册对应的方法,在蓝图中可以直接输入IA的名字拿到其处理回调的节点,若要在C++中注册,则需要有地方去配置每个IA,lyra的做法是写一个结构,其中每个IA都对应一个Tag,代码中根据Tag来遍历区分对应的回调函数,具体逻辑在LyraHeroComponent.cpp中。

要实现一个简单的鼠标控制镜头和人物移动,人物自动转向移动的方向,除了正确的处理输入外,还需要配置以下内容:

  • 角色蓝图中不勾选UseControllerRotationYaw
  • SpringArm中勾选UsePawnControlRatation
  • 移动组件中勾选OrientRotationToMovement(此项在加入八方向移动时需要去掉,因为我们要自己控制角色的旋转,以更好的匹配动画)

速度匹配

在获取速度和加速度进行计算时,不要忘了考虑角色的朝向,计算前需要将其与角色对齐,拿到角色的rot后进行一次Unrotate即可。

角色旋转

角色骨骼中有一个YawOffet的曲线,角色蓝图可以读取当前这个曲线的值,动画蓝图中通过修改这个曲线的值(ModifyCurve),来将信息传递给角色蓝图。修改的方式为加载曲线,然后用速度的相对偏转yaw在曲线中读取。

八方向移动

八方向实际上只有六个状态,左前、前、右前、左后、后、右后,往左边走时左前和右前的动作都是可以的,切换时左前和右后对应,右前和左后对应,因此当向左走时马上向右,会变成右后的动画,为了更自然,我们在过渡到右后且双脚没交叉(通过动画曲线值判断)时,增加一个从右后过渡到右前的条件,这样当变化成右后之后,很快就会变为右前的动画,看起来更自然。

动画状态由下面几个枚举值代表的状态决定:

  • Gait:步态,是走、跑还是冲刺
  • Stance:站立姿势,是站立还是蹲伏、匍匐
  • RotationMode:角色旋转的策略,是否要始终面向摄像机看向的方向,还是会面向当前移动(速度)的方向
  • MovementState:移动的方式,比如当前是在空中还是在地面

状态机中有一个Pivot变量,在LF<=>RB、RF<=>LB、F<=>B这几种切换的情况下(相反方向幅度比较大的切换),会将其设置为true,持续0.1s,在Pivottrue时,动画根据方向,叠加一个倾斜的加速动画,让切换看起来更协调。同样从走到跑的状态切换时,也做一个叠加。

脚部锁定

原地旋转

原地转转使用的方式是动画加程序驱动的方式,也就是说我们要通过动画播放的进度去控制当前角色旋转的角度,方式同样是通过曲线。 首先在需要原地旋转时(Aiming模式),计算摄像机和角色朝向的差值速度(与delta time比值),动画蓝图会将这个值重新映射(1.15~3),对曲线进行缩放。 原地旋转的动画长度为30帧,对应曲线(RotationAmount)在每帧取值后,总和为90,对应旋转了90度。 实际游戏中运行的帧数并不一定是30,因此我们要做一次映射,计算出当前帧数情况下需要旋转的值,具体方式为帧间隔的比值等于yaw的比值,因此最终的yaw值为:

\[yaw = \frac{curve\ value \times \Delta time}{\frac{1}{30}}\]

注意30为旋转动画资源的帧数。


Comments

Content