当前位置: 首页 > ds >正文

学习做动画4.回转运动

1。打开ABP_CharacterBase

新建一个状态别名,状态别名的简单作用就是,可以代表某一个状态过渡到另一个状态。在下图中我们勾选了Idle与Cycle,则可以表示在符合条件的Idle或Cycle状态时,由状态别名过渡到EG状态。

新建一个状态别名,命名为PivotSource,新建一个状态,命名为Pivot

如何触发这个回转的条件呢,简单来说,是当前角色的速度(角色当前朝向某方向的速度)与角色当前的加速度(玩家输入的移动方向)相反时。

我们在Pivot Source->Pivot的判断条件内

Pivot->Stop则直接使用共享条件即可

2。这一步我们要设置从Pivot->Cycle的条件了

这里可以考虑使用动画通知状态来进行。当动画通知状态被激活时,我们可以从Pivot进入到Cycle。

我们在这里新建一个动画通知状态,命名为ANS_ToLocomotion

创建好后暂时不用理会。

回到ABP_CharacterBase内,进入Pivot->Cycle的条件

新建节点

然后选择我们刚才新建的状态通知

这样子就设置好Pivot->Cycle的条件了。

3。这一步我们需要设置Pivot内的动画。可以参考前面的做法,在接口内新建一个动画层

打开ALI_AnimLayerBase,新建一个动画层

然后回到ABP_CharacterBase,将动画层的部分连接

然后打开ABP_LayerBase,进入Pivot的动画层,为Pivot新建一个状态机

进入状态机,新建一个状态

进入状态内,在细节面板将序列与显式时间设置为动态值

并且在“变为相关时”绑定函数

这里需要用到加速度,而加速度我们需要进入ABP_CharacterBase内获取,所以我们现在打开ABP_CharacterBase

先新建一个工具函数GetOppisiteDirection,获取加速度的反方向

​​​​​​​​​​​​​​

新建一个函数UpdateCardinalDirectionFromAccleration

勾选线程安全,放入到线程安全函数里

再回到ABP_LayerBase的SetupPivotAnim

接下来,为"更新时"绑定一个函数UpdatePivotAnim

这一部分是判断速度与加速度的方向是否为相反的,通过判断来进行距离预测

若为真,则表示当前速度与加速度的方向相反

若为假,则表示当前速度与加速度方向相同

接着,进入Cycle的动画层,将朝向扭曲与跨步扭曲复制

进入到PivotA

4。我们将PivotA复制一份,命名为PivotB

所以接下来我们需要对上一帧的加速度获取与判断

打开PivotA,在SetUp内

此时,在PivotA->PivotB的条件内

然后我们需要对PivotA与PivotB设置同步组,就像Cycle的那样

5。在此时进行测试时,仍有小问题:当角色向右行走时,突然向前,则会有一小段卡顿。为了解决这个,我们需要判断角色的加速度夹角出现“垂直”的情况。

进入ABP_CharacterBase,创建函数UpdateIsMovingPerpendicularToInitialPivot(输入的运动方向是否垂直于回转运动的运动方向)(需要勾选线程安全)

然后进入Pivot状态

为其绑定一个函数SetUpPivotState

在SetUpPivotState内,我们需要将当前玩家速度的方向设置为变量

然后在函数UpdateIsMovingPerpendicularToInitialPivot内,我们需要对当前速度的方向与当前加速度的方向进行判断,得出的bool就是当前角色是否有与回转运动垂直的加速度

然后将这个函数放于线程安全函数

现在我们有了这个bool值,我们可以通过这个bool值判断角色是否需要再次进入回转状态。

进入ABP_LayersBase,PivotA->PivotB的条件内,加入这个bool

这样子,在出现与玩家回转运动相垂直的加速度的情况时,会过渡到Cycle而不会进入回转。

但是此时还不够,我们仍然需要添加过度条件。

在ABP_CharacterBase内,再添加一个过渡条件

同时,这里也要新加新的过渡条件,优先值设为2

在Start状态内,绑定一个新函数

然后进入刚刚新建的过渡条件内

这样子使得Start->Cycle与Pivot->Cycle可以提前过渡,免得动画前段无用的部分。

http://www.xdnf.cn/news/19020.html

相关文章:

  • springboot实现合同生成
  • C++ SNIFE
  • JVM之【运行时数据区】
  • Nginx访问限制学习笔记
  • 论文学习日志——忆阻器与神经网络——part1
  • 基于XiaothinkT6语言模型的文本相似度计算:轻量方案实现文本匹配与去重
  • AT_abc403_f [ABC403F] Shortest One Formula
  • 阿里云docker搭建的mysql无法访问
  • Docker化性能监控平台搭建:JMeter+InfluxDB+Grafana全攻略
  • GRPO算法:告别PPO内存炸弹,无需价值函数,用组内排名代替绝对评分
  • NUMA架构
  • Java大厂面试全解析:从Spring Boot到微服务架构实战
  • 矩阵初等变换的几何含义
  • 【LeetCode】动态规划——542.01 矩阵
  • 系统设计(数据库/微服务)
  • 计算机网络的发展演进历程
  • 2 梯度下降算法
  • 英伟达 Spectrum-XGS:重构 AI 基础设施,开启跨域超级工厂时代
  • 氯化钕:以稀土之力引领科技创新
  • Spring AI 入门指南:三步将AI集成到Spring Boot应用
  • Java大厂面试实战:从Spring Boot到微服务架构的全链路技术剖析
  • MySQL 面试题系列(四)
  • Mysql——日志
  • 力扣hot100:搜索旋转排序数组和寻找旋转排序数组中的最小值(33,153)
  • TikTok广告投放革命:指纹云手机如何实现智能群控与降本增效
  • Mac中修改Word的Normal.dotm文件
  • CSS实现内凹圆角边框技巧(高频)
  • 绿算技术解密金融科技安全:高性能计算与存储驱动金融防火墙新时代
  • 【拥抱AI】一起学卷积神经网络(CNN)
  • 一天推荐一款实用的手柄零件————线性霍尔