You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity中翻滚动画被攻击动画中断时如何调用函数?

解决动画中断时调用函数的问题

以下是几种实用的实现方案(以Unity引擎为例),根据你的需求场景选择即可:

方案1:利用Animator状态的Exit事件

直接在动画状态机的翻滚状态上绑定退出事件,当翻滚状态被切换(无论哪种操作导致的中断)时自动触发函数:

  • 打开Animator Controller,选中翻滚动画对应的状态
  • 在Inspector面板的「Events」区域,添加一个Exit事件
  • 将你的角色脚本拖拽到事件的对象字段,选择要调用的中断处理函数(比如OnRollInterrupted())

如果仅需要处理攻击触发的中断,可以在函数内额外判断:

public void OnRollInterrupted()
{
    AnimatorStateInfo attackState = animator.GetCurrentAnimatorStateInfo(0);
    if (attackState.IsName("Attack"))
    {
        // 仅执行攻击导致的中断逻辑
    }
}

方案2:触发攻击前主动检查并调用函数

在处理攻击按钮输入的代码里,先判断当前是否处于未完成的翻滚状态,是的话直接调用中断函数,再播放攻击动画:

public void OnAttackButtonPressed()
{
    AnimatorStateInfo currentState = animator.GetCurrentAnimatorStateInfo(0);
    // 确认翻滚动画未播放完成,属于被中断
    if (currentState.IsName("Roll") && currentState.normalizedTime < 1f)
    {
        OnRollInterrupted();
    }
    animator.SetTrigger("Attack");
}

这个方案逻辑直观,不需要依赖动画系统的事件,适合仅处理攻击触发中断的场景。

方案3:监听Animator状态变化

通过跟踪动画状态的切换,全局检测翻滚状态被中断的情况:

private Animator _animator;
private bool _wasInUnfinishedRoll;

void Start()
{
    _animator = GetComponent<Animator>();
}

void Update()
{
    AnimatorStateInfo currentState = _animator.GetCurrentAnimatorStateInfo(0);
    bool isInUnfinishedRoll = currentState.IsName("Roll") && currentState.normalizedTime < 1f;

    if (_wasInUnfinishedRoll && !isInUnfinishedRoll)
    {
        // 翻滚状态未播放完成就退出,触发中断函数
        OnRollInterrupted();
    }

    _wasInUnfinishedRoll = isInUnfinishedRoll;
}

这种方式能覆盖所有导致翻滚中断的场景(比如被怪物攻击打断、触发其他技能等),适合需要全局监听的需求。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 08:27:30