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
相关产品推荐
相关产品推荐

