首页 > 解决方案 > UNITY Animation setFloat 无法正常工作

问题描述

我有一个屏幕上的按钮来控制角色的移动,向右走、向左走和跳跃。我的 Walk Left 和 Jump 按钮事件与动画正常工作,但右侧按钮只是移动角色而不播放 walk 动画,我使用 setFloat 来检测角色的移动,请帮助我确定为什么没有向右走动画玩。

我的运动控制脚本:

void Movement()
{

    if (RightPressed)
    {
        target.Translate(Vector2.right * 3f * Time.deltaTime);
        target.eulerAngles = new Vector2(0, 0);
    }

    if (LeftPressed)
    {
        target.Translate(-Vector2.right * 3f * Time.deltaTime);
        target.eulerAngles = new Vector2(0, 0);
    }

    if (SpacePressed && isJumping == true)
    {

        if (jumpTimeCounter > 0)
        {
            rb.velocity = Vector2.up * jumpForce;
            rb.freezeRotation = true;
            jumpTimeCounter -= Time.deltaTime;
            anim.SetBool("IsJumping", true);
        }
        else
        {
            isJumping = false;
        }
    }
}

我的更新功能:

void Update () {

    Movement();
    {

        if (RightPressed)
            anim.SetFloat("speed", 0.1f);
        else
            anim.SetFloat("speed", 0.0f);


        if (LeftPressed)
            anim.SetFloat("speed", -0.1f);
        else
            anim.SetFloat("speed", 0.0f);

        isGrounded = Physics2D.OverlapCircle(feetPos.position, checkRadius, whatIsGround);

    } 

}

我的屏幕按钮功能

public void OnScreenButtonChange(string dir)
{
    switch (dir)
    {
        case "A":
            LeftPressed = !LeftPressed;
            break;
        case "D":
            RightPressed = !RightPressed;
            break;
        case "Space":
            SpacePressed = !SpacePressed;
            break;
    }
}

标签: c#visual-studiounity3dgame-development

解决方案


因为您的 RightPressed 代码块被 LeftPressed 代码块覆盖,

基本上,如果你像这样翻来覆去

    if (LeftPressed)
        anim.SetFloat("speed", -0.1f);
    else
        anim.SetFloat("speed", 0.0f);

    if (RightPressed)
        anim.SetFloat("speed", 0.1f);
    else
        anim.SetFloat("speed", 0.0f);

你会注意到你的问题是相反的,你在这两种情况下都使用一个布尔值,它必须是 false 或 true,当 LeftPressed 为 false 时,你仍在将动画的速度更新为 0.0f,这会覆盖原来的在 RightPressed 中设置,您要做的是改变组织代码的方式

    if (LeftPressed)
        anim.SetFloat("speed", -0.1f);

    if (RightPressed)
        anim.SetFloat("speed", 0.1f);

    if ((!LeftPressed && !RightPressed) || (LeftPressed && RightPressed))
        anim.SetFloat("speed", 0.0f);

这会更好,但不是一个很好的方法,您应该将动画与刚体/变换的实际速度同步,以确保对象的运动和动画之间没有不同步


推荐阅读