【问题标题】:Animator parameter doesnt change Unity2DAnimator 参数不会改变 Unity2D
【发布时间】:2020-12-05 10:33:18
【问题描述】:

你好

我试图为我的角色添加动画过渡,所以写了一些代码:

void Update()
    {
        Vector3 characterScale = transform.localScale;
        if (Input.GetKey(KeyCode.A))
        {
            animator.SetFloat("speed", velocity);
            characterScale.x = 1;
            transform.Translate(Vector2.right * Time.deltaTime * velocity);
        }
        else animator.SetFloat("speed", 0);


        if (Input.GetKey(KeyCode.D))
        {
            animator.SetFloat("speed", velocity);
            characterScale.x = 1;
            transform.Translate(Vector2.right * Time.deltaTime * velocity);
        }
        else animator.SetFloat("speed", 0);
        

        if (Input.GetKeyDown(KeyCode.Space) && Cground == true)
        {
            rb.AddForce(new Vector2(0f, jumpheight), ForceMode2D.Impulse);
            Cground = false;
        }
        transform.localScale = characterScale;
    }

这是我的动画控制器:

问题

我的问题是速度参数仅适用于通过按 D 向右行走时的动画过渡。如果我然后按 A 向左行走,我的角色精灵翻转,他移动但他不会过渡到跑步动画。我不知道为什么,我会很高兴得到任何帮助 =)。

【问题讨论】:

    标签: unity3d animation parameters animationcontroller


    【解决方案1】:

    您的问题是else 案例!

    想想如果你只按A会发生什么:那么你就没有按D

    这意味着你做的最后一件事是

    else animator.SetFloat("speed", 0);
    

    因此重置您刚刚为A 按下更改的速度。


    您应该将支票更改为例如

    if (Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.D))
    {
        animator.SetFloat("speed", velocity);
        characterScale.x = 1;
        transform.Translate(Vector2.right * Time.deltaTime * velocity);
    }
    else 
    {
        // Only do this if none of the move keys is pressed
        animator.SetFloat("speed", 0);
    }
    

    因为显然无论如何你在这两种情况下都做了 se。

    或者实际上我认为你在按下A时宁愿转向另一个方向。

    那我还是会做

    if (Input.GetKey(KeyCode.A))
    {
        animator.SetFloat("speed", velocity);
        characterScale.x = 1;
        transform.Translate(Vector2.left * Time.deltaTime * velocity);
    }
    else if (Input.GetKey(KeyCode.A))
    {
        animator.SetFloat("speed", velocity);
        characterScale.x = 1;
        transform.Translate(Vector2.right * Time.deltaTime * velocity);
    }
    else 
    {
        animator.SetFloat("speed", 0);
    }
    

    【讨论】:

    • 非常感谢这对我有用。我改变了一些东西,因为我意识到我的左右移动语句都有相同的 input.getkey 和 vector2.left 所以我将一个更改为 if (input.GetKey(KeyCode.D)) 并更改了 characterScale。 x 上那个 1
    【解决方案2】:

    您需要为左侧的跑步添加一个新动画,并带有新的过渡。您可以使用“速度”参数并以相同的方式检查使用速度。如果速度大于 0.1,您将转换到 runRight,而转换到 runLeft 是速度小于 -0.1。现在你只有右边的跑步动画,所以它有问题。移除角色翻转并使用 2 个动画,或者您可以保持角色翻转,但不要使用“速度”大于 0.1,您应该使用 Bool 并在速度不同于“0”时使其变为真。这样即使他向左跑也会进入你的动画

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-01
      • 1970-01-01
      • 2019-07-10
      • 2014-02-24
      • 1970-01-01
      • 2012-04-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多