Unity中如何检查Animator动画状态是否运行并阻止特定动画切换?
嘿,我来帮你搞定这两个Animator的问题!
解决你的Animator需求
1. 阻止换弹过程中触发射击
你的核心问题是当前代码没有判断动画状态——不管是否在换弹,只要按左键就会强制播放射击动画。我们只需要在响应射击输入前,先检查是否正处于换弹动画的播放过程中即可。
2. 如何检查Animator中某动画是否正在运行
要判断某个动画是否处于播放状态,可以用Animator.GetCurrentAnimatorStateInfo方法获取当前动画层的状态信息,结合normalizedTime(动画进度,0为开始,1为结束)来判断动画是否还在进行中。
举个例子,检查是否正在播放换弹动画的代码如下:
// 获取Base Layer(默认层)的状态信息,若动画在其他层,需替换对应索引 AnimatorStateInfo stateInfo = m4a4animator.GetCurrentAnimatorStateInfo(0); // 判断是否处于reload动画,且动画尚未完成(normalizedTime < 1) bool isReloading = stateInfo.IsName("reload") && stateInfo.normalizedTime < 1f;
修改后的完整脚本
把上面的判断逻辑整合到你的代码里,就能实现换弹时无法触发射击的需求:
using UnityEngine; public class m4a4 : MonoBehaviour { public Animator m4a4animator; void Update () { // 检查当前是否正在换弹 AnimatorStateInfo stateInfo = m4a4animator.GetCurrentAnimatorStateInfo(0); bool isReloading = stateInfo.IsName("reload") && stateInfo.normalizedTime < 1f; // 响应换弹输入 if (Input.GetKeyDown(KeyCode.R)) { m4a4animator.Play("reload"); } // 仅当不在换弹时,才响应射击输入 if (Input.GetMouseButton(0) && !isReloading) { m4a4animator.Play("shoot"); } } }
额外提示
- 如果你的动画不在默认的Base Layer(索引0),可以用
m4a4animator.GetLayerIndex("你的层名")来获取对应层的索引,替换到GetCurrentAnimatorStateInfo的参数里。 - 如果你还想阻止过渡过程中的误操作,可以额外加上
!m4a4animator.IsInTransition(0)来判断是否正处于动画过渡状态,进一步优化逻辑。
内容的提问来源于stack exchange,提问作者TheMatrixAgent22




