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

学习做动画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.dtcms.com/a/352320.html

相关文章:

  • Docker移动安装目录的两种实现方案
  • Qwen3-Coder-30B-A3B-Instruct AWQ 量化
  • 基于51单片机的DS18B20大棚温度监控系统
  • TRUST:a thermohydraulic software package for CFD simulations,开源多物理场数值模拟平台
  • Decode Global:以合规资质筑牢全球服务的根基
  • 数据中台的下一步,是数据飞轮吗?
  • Maya绑定基础:创建骨骼、修改骨骼
  • Android之腾讯TBS文件预览
  • JSX深度解析:不是HTML,胜似HTML的语法糖
  • Milvus介绍及多模态检索实践
  • 坑机介绍学习研究1
  • 美的组织架构再调整,微清事业部划入洗衣机事业部
  • uniapp 顶部tab + 占满剩余高度的内容区域swiper
  • 低空经济的中枢神经:实时视频链路如何支撑通信、导航、监视与气象
  • C/C++---浮点数与整形的转换,为什么使用sqrt函数时,要给参数加上一个极小的小数(如1e-6)
  • “喵汪联盟”宠物领养系统的设计与实现(代码+数据库+LW)
  • LangGraph
  • 研究4:海外休闲游戏,如何给主角做萌化处理
  • 基于SpringBoot的摄影跟拍约拍预约系统【2026最新】
  • C/C++---memset()初始化
  • 31.Encoder-Decoder(Seq2Seq)
  • MySQL8 排名窗口函数实战
  • 面试:Spring
  • 30.LSTM-长短时记忆单元
  • 抢红包案例加强版
  • 并行多核体系结构基础——共享存储并行编程(笔记)
  • 网络编程close学习
  • Java大厂面试实录:从Spring Boot到Kubernetes的全链路技术突围
  • python命名规则(PEP 8 速查表),以及自定义属性
  • 深度感知卷积和深度感知平均池化