如何一次制作一个动画片段 运行 而不是混合在一起

How do I make animation clips run one at a time and not blend together

我有 lookwalkattack 的 2D 动画——每个都有4 个方向——总共 12 个动画片段。动画控制器有以下参数:

我只想一次播放一个剪辑。它适用于 lookwalk 动画,因为根据它们的参数,它们是互斥的。问题是 attack 剪辑,因为它基于触发器。当我进入该状态时,它会与正在播放的 lookwalk 动画混合。当我进入 attack 动画时,我希望当前动画停止并且 attack 动画在 [=22] 之前 运行 完成=]看或动画再次播放。

最好,我想通过仅从 Any State 到其他状态(无状态间转换)的转换来实现此目的。我有一堆针对不同角色和设备的动画,而且我将来还会有 look/walk/attack 以外的更多类型的动画,所以我想避免添加还有几十个转换。

我考虑过将 isAttacking 参数从触发器更改为布尔值,但这似乎是一个糟糕的选择,因为那样我就必须有代码和动画事件来跟踪我的 attack 动画并在播放完毕后将 isAttacking 设置为 false,这似乎增加了系统的复杂性和膨胀性

编辑 误读了问题。您最好将检查器中的过渡设置中的过渡持续时间设置为 0。

在动画控制器中:select 过渡,转到检查器,单击过渡列表中的“-”符号。您还可以打开设置并更改过渡效果(如果您需要其他动画)。

你必须将所有状态相互连接起来......这就像 66 转换......不是很有趣......因为......现在自发地添加一个转换:D

我的意思是你可以这样做并使用 HasExitTime = true; ExitTime = 1 用于所有离开攻击状态的转换,以便在转换之前等待动画完成 - 并且对于所有其他人有 HasExitTime = false 顺序不要等待,而是直接开始转换。


但我强烈建议您使用一个小脚本并使用 bool 作为 isAttacking,这会让您的生活轻松很多。

您可以简单地添加一个脚本 (StateMachineBehaviour) 到攻击状态本身(类似于 GameObjects 上的组件),等待动画完成并重置 bool。您可以将所有转换保留在 Any State 上并根据需要配置它们。

在动画器中选择状态时 window 您会注意到每个状态都有一个带有 Add Behaviour 按钮的检查器,与 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);
    }
}

现在为了平滑混合,只需将过渡设置为类似

的东西
  • 有退出时间 = 真
  • 退出时间 = 0.75 (%)
  • TransitionDuration = 0.25(秒,如果 FixedDuration,% 否则)

根据此过渡持续时间等,您可能还希望攻击动画将 isAttacking 重置得更早一点,例如

if (timePassed < stateInfo.length - 0.25 * stateInfo.length) return;

尝试将动画状态添加到 8 个角而不是 4 个。 因此,例如,您当前可能有 4 个角,UpRight、UpLeft、DownLeft 和 DownRight,因此当它选择一个状态时,它会选择其中的 2 个角,但不知道要坚持哪一个。也许尝试将节点添加到缺失的角中,例如上、下、左、右,然后选择一个相关的动画来适应。

我在我的游戏中使用了它,它似乎至少暂时解决了这个问题。