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

Unity动画控制器(Animator)动画片段空跑问题

博主在Unity中想要控制挖掘机挖斗做挖掘动作,由于该挖斗上方存在一个连杆区域与小臂连接,在Unity中不太好直接用代码控制,因此博主将挖斗挖掘动作在建模软件(Blender)中制作成了动画,并通过Animator的setfloat来控制动画的正序、停止、倒序播放,且由于挖斗的挖掘动画是不需要循环播放的,因此将loopTime取消了勾选。

image

通过下图可以看出博主是通过设置变量BuckControlSpeed控制动画的播放,-1倒序播放、0停止播放、1正序播放。

image

在实际的开发过程中,博主发现此时的动画片段会存在一个空跑的现象,完整的问题描述如下: 

我有一个动画片段(这个动画不是需要循环播放的,所以没设置LoopTime),在Unity中使用了animator.SetFloat(name, Value);来控制这个动画的正序播放、停止、倒序播放,但是我在实际的使用过程中发现,当Value的值持续的为-1、0、1时,如果动画片段的播放超过的边界帧,则动画播放会进入一个空跑状态;即:如果Value为-1控制动画片段倒序播放,当动画片段播放到第0帧时如果Value依旧为-1,则动画帧会变成负数,陷入空跑;此时如果想要让动画正序播放,则需要持续的输入Value等于1将空跑的那段时间抵消掉才能让动画正常正序播放。

 解决方案:即将整个动画播放过程进行归一化处理(0 -> 1),判断动画的归一化值有没有到达0或1(两个边界值),如果到达了边界值则将BuckControlSpeed设置为0,并且强制将动画帧停留在第一帧或最后一帧,这样就能有效解决动画播放出现空跑的问题;(提问回答)

以下是可以直接使用的代码:

 1     /// <summary>
 2     /// 解决动画播放问题,适用于所有带有速度参数的非循环动画
 3     /// </summary>
 4     /// <param name="animator"></param>
 5     /// <param name="name"></param>被设置的动画参数名
 6     /// <param name="value"></param>控制动画播放的值 -1、0、1
 7     /// <param name="playSpeed"></param>动画播放速度
 8     public void _AnimationControl_MuseChat(Animator animator, string name, float value, float playSpeed)
 9     {
10         // 获取当前动画状态(假设动画在第0层)
11         AnimatorStateInfo stateInfo = animator.GetCurrentAnimatorStateInfo(0);
12         // 获取当前动画片段信息
13         AnimatorClipInfo[] clipInfos = animator.GetCurrentAnimatorClipInfo(0);
14         if (clipInfos.Length == 0) return;
15 
16         // 获取当前播放速度(通过SetFloat设置的值)
17         float currentSpeed = animator.GetFloat(name);
18 
19         float normalizedProgress = GetNormalizedProgress(stateInfo, animator);
20         // 非循环动画且动画正在播放时才进行边界检查
21         if (!clipInfos[0].clip.isLooping && normalizedProgress >= 0)
22         {
23             // 正放时检查是否超过结束帧
24             if (currentSpeed > 0 && normalizedProgress >= 1.0f)
25             {
26                 animator.SetFloat(name, 0); // 停止播放
27                 // 可选:强制将动画定格在最后一帧
28                 animator.Play(stateInfo.fullPathHash, 0, 1.0f);
29             }
30             // 倒放时检查是否超过开始帧
31             else if (currentSpeed < 0 && normalizedProgress <= 0.01f)
32             {
33                 animator.SetFloat(name, 0); // 停止播放
34                 // 可选:强制将动画定格在第一帧
35                 animator.Play(stateInfo.fullPathHash, 0, 0.0f);
36             }
37             else
38             {
39                 // 循环动画或动画未播放时,直接应用速度
40                 animator.SetFloat(name, value * playSpeed);
41             }
42         }
43         else
44         {
45             // 循环动画或动画未播放时,直接应用速度
46             animator.SetFloat(name, value * playSpeed);
47         }
48     }
49 
50     /// <summary>
51     /// 计算归一化进度(0~1),仅处理反向播放,移除循环取模(避免帧数跳回)
52     /// </summary>
53     private float GetNormalizedProgress(AnimatorStateInfo stateInfo, Animator animator)
54     {
55         float normalizedTime = stateInfo.normalizedTime;
56 
57         // 处理反向播放(speed<0时,进度从1→0)
58         if (stateInfo.speed < 0f)
59         {
60             normalizedTime = 1f - Mathf.Abs(normalizedTime);
61         }
62 
63         // 强制限制在0~1,杜绝任何循环/超出的可能(核心:避免198→0或0→198)
64         return Mathf.Clamp01(normalizedTime);
65     }

 

http://www.rkmt.cn/news/91956.html

相关文章:

  • 终极指南:如何在ComfyUI中实现FP8量化视频超分[特殊字符]
  • 2025年全套煤炭化验设备厂家实力排名,看哪家合作案例多? - mypinpai
  • BrowserBee:用自然语言智能操控浏览器的AI助手
  • FlashAI多模态整合包深度解析:如何在3分钟内完成企业级AI部署
  • Switch21.1.0系统大气层1.10.1整合包系统稳定版
  • 全棉针织舒适厂家TOP5权威推荐:精细工艺供应商深度测评,甄 - myqiye
  • 如何用jynew剧情编辑工具实现可视化设计:零基础快速上手指南
  • 电磁超声测厚仪供应商TOP5权威推荐:甄选企业助力工业检测升 - 工业品牌热点
  • 3、安卓开发环境搭建及工具使用指南
  • 2025年十大高品质家纺面料品牌排行榜,奈特绵的好处解析 - 工业推荐榜
  • 2025大模型效率革命:Qwen3-8B-MLX-6bit双模式推理重塑企业AI部署范式
  • ComfyUI与Hugging Face模型库直连方案探讨
  • GC5035 CSP:移动摄影的终极图像传感器解决方案
  • 2025年12月电动球阀,气动丝口球阀,气动PP球阀厂家推荐:行业权威盘点与品质红榜发布​ - 品牌鉴赏师
  • 2025全屋定制制造厂TOP5权威推荐:甄选靠谱实力厂商,定 - 工业品牌热点
  • 2025年12月免疫力蛋白粉产品推荐:五大品牌深度对比评测榜 - 十大品牌推荐
  • Dexed终极指南:免费获取经典DX7合成器的完整解决方案
  • LMDeploy大模型部署终极指南:5大优化技巧与3步实战部署
  • Rubberduck终极入门指南:快速提升VBA开发效率的完整教程
  • 3天精通lottie-ios:从零到动画组件开发专家
  • 2025年精选:防水微动开关生产厂家前五强,大型微动开关/小型微动开关/鼠标微动开关/新能源微动开关优质厂家口碑推荐榜 - 品牌推荐师
  • 终极指南:如何用AntdUI快速构建专业级WinForm聊天界面
  • 终极指南:如何用SMUDebugTool快速解决Ryzen处理器性能瓶颈?
  • 腾讯开源Hunyuan3D-2mv:多视角3D生成技术将创作效率提升14倍
  • QuickJS多线程实战:3大并发难题与高效解决方案
  • Brian2终极指南:快速掌握开源神经网络模拟器
  • Rust内存对齐与缓存友好设计深度解析 - 指南
  • Maestro Studio:零代码可视化测试,让移动应用自动化触手可及
  • 10、SQL注入与服务器端请求伪造漏洞深度剖析
  • 2、深入解析SELinux:操作系统安全的革新力量