You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动