您必须将所有状态相互连接起来......这就像66
转换......不是很有趣......因为......现在自发地添加一个转换:D
我的意思是你可以这样做并HasExitTime = true; ExitTime = 1
用于所有脱离攻击状态的转换,以便在转换之前等待动画完成 - 并且对于所有其他人来说HasExitTime = false
,为了不等待而是直接启动转换。
但我强烈建议宁愿使用一个小脚本并使用 a bool
forisAttacking
这会让你的生活更轻松。
您可以简单地添加一个脚本 ( StateMachineBehaviour ) 来攻击状态本身(类似于 GameObjects 上的组件),您可以在其中等待动画完成并重置布尔值。比您可以保留所有转换Any State
并根据需要配置它们。
在动画窗口中选择状态时,您会注意到每个状态都有一个带有Add Behaviour
按钮的 Inspector,非常类似于GameObjects
:
在这里创建一个新行为并简单地做
using UnityEngine;
public class StopAttack : StateMachineBehaviour
{
private float timePassed = 0;
// OnStateUpdate is called before OnStateUpdate is called on any state inside this state machine
//
// Unity's comment above sounds a bit confusing ... but
// simply consider this the Update method of StateMachineBehaviours ;)
public override void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
timePassed += Time.deltaTime;
// while timePassed is smaller than the animation clip's length
// do nothing
if (timePassed < stateInfo.length) return;
// reset the bool
animator.SetBool("isAttacking", false);
}
}
现在为了平滑混合,只需将过渡设置为
- HasExitTime = true
- 退出时间 = 0.75 (%)
- TransitionDuration = 0.25(如果是秒
FixedDuration
,则为 %)
根据此过渡持续时间等,您可能还希望攻击动画isAttacking
早一点重置,例如
if (timePassed < stateInfo.length - 0.25 * stateInfo.length) return;