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

Unity中实现UI按钮重复触发非循环动画的代码修改方法

嘿,我懂你要解决的问题——就是想让每个UI按钮不管当前对应的非循环动画有没有在播放,只要点击就能立刻重新触发播放对吧?我之前做Unity交互系统的时候也碰到过类似的需求,给你几个实用的实现方案:

方案1:直接重置动画并强制播放(最简便)

如果你的动画是用Animator组件管理的,这是最直接的做法:在按钮点击事件里,先把动画进度强制拉回起始帧,再触发播放。这样不管当前动画处于什么状态(正在播放、已经结束),点击按钮都会立刻从头开始播。

先给每个按钮绑定对应的脚本,代码示例:

using UnityEngine;
using UnityEngine.UI;

public class AnimButtonHandler : MonoBehaviour
{
    // 在Inspector里给每个按钮关联对应的Animator和目标动画状态名
    [SerializeField] private Animator _targetAnimator;
    [SerializeField] private string _animStateName;

    public void OnButtonPressed()
    {
        // 第一个参数是动画状态名,第二个-1表示默认层,第三个0f是归一化时间(0就是动画开头)
        _targetAnimator.Play(_animStateName, -1, 0f);
        // 用Trigger触发动画(如果你的状态机是用Trigger驱动的)
        _targetAnimator.SetTrigger(_animStateName);
        // 要是你用的是直接切换状态,也可以换成:_targetAnimator.CrossFade(_animStateName, 0f);
    }
}
方案2:添加状态判断(更精细控制)

如果你需要先判断当前是否正在播放目标动画,再决定要不要重启,可以加个状态检查逻辑:

public void OnButtonPressed()
{
    // 获取当前默认层的动画状态
    AnimatorStateInfo currentState = _targetAnimator.GetCurrentAnimatorStateInfo(0);
    
    // 如果当前正在播放目标动画,就重置到开头;否则直接触发
    if (currentState.IsName(_animStateName))
    {
        _targetAnimator.Play(_animStateName, -1, 0f);
    }
    else
    {
        _targetAnimator.SetTrigger(_animStateName);
    }
}

这个方案适合需要避免重复触发的场景,但其实方案1已经能满足你的核心需求——随时点击按钮重启动画。

如果你用的是旧版Animation组件

要是你没使用Animator状态机,而是直接用Animation组件播放剪辑,逻辑更简单:

using UnityEngine;
using UnityEngine.UI;

public class LegacyAnimButtonHandler : MonoBehaviour
{
    [SerializeField] private Animation _targetAnimation;
    [SerializeField] private string _animClipName;

    public void OnButtonPressed()
    {
        // 直接调用Play,默认就会从头播放,不管之前的状态
        _targetAnimation.Play(_animClipName);
    }
}
关键注意点
  • 确保你的动画剪辑没有勾选Loop Time(在Inspector的动画剪辑属性里),这样动画播放完会停在最后一帧,下次点击能正常从头启动。
  • 如果你的Animator状态机里有过渡条件,记得确保Play方法能强制覆盖当前过渡,一般把过渡的Has Exit Time关掉会更稳妥。

内容的提问来源于stack exchange,提问作者Mario

火山引擎 最新活动