Animator 参数不会改变 Unity2D

Animator parameter doesnt change Unity2D

你好

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

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 向左走,我的角色精灵翻转,他移动但他不会过渡到运行 动画。我不知道为什么,如果有任何帮助我会很高兴 =)。

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

您的问题是 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);
}

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

或者实际上我认为您在按 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);
}