0

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

  • 面对(整数)
  • isMoving(布尔值)
  • 攻击(触发)

我希望一次只播放一个剪辑。它适用于外观行走动画,因为它们基于它们的参数是互斥的。问题在于攻击剪辑,因为它基于触发器。当我进入该状态时,它会与已经播放的外观行走动画融合在一起。当我进入攻击动画时,我希望当前动画停止并且攻击动画运行完成,然后再次播放观看行走动画。

最好,我想通过让转换只从Any State彼此状态(没有州际转换)来做到这一点。我有一堆用于不同角色和设备的动画,而且我将来还会有更多类型的动画,除了外观/步行/攻击,所以我想避免添加一个会带来的复杂性还有几十个过渡。

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

4

3 回答 3

2

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

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


但我强烈建议宁愿使用一个小脚本并使用 a boolforisAttacking这会让你的生活更轻松。

您可以简单地添加一个脚本 ( 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;
于 2019-02-05T07:45:51.870 回答
0

编辑误读了这个问题。您应该很好地将检查器中转换设置中的转换持续时间设置为 0。

在动画控制器中:选择转场,转到检查器,单击转场列表中的“-”符号。如果您想要其他动画的内容,您还可以打开设置并更改过渡。

在此处输入图像描述

于 2019-02-04T23:38:03.340 回答
0

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

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

于 2022-01-06T06:09:40.220 回答