在Unity 2d中向左走时,玩家会不断旋转

时间:2020-06-26 07:14:26

标签: c# unity3d

我正在使用Unity在2D平台游戏机中移动我的播放器精灵,如果按了右键,它将向右移动;如果按了左键,将向左移动。

右移工作正常,但是每当播放器向左移动时,我都将Y旋转更改为180,该播放器应该只显示左动画,但在向左移动时会保持来回旋转。

请参见video sample

这是我的代码:

private Rigidbody2D rb;

private void FixedUpdate() {
    InputManager();
}

private void InputManager()
{
    float hDir = Input.GetAxis("Horizontal");

    if (state != State.hurt) {
        if(!anm.GetCurrentAnimatorStateInfo(0).IsTag("attack"))
        {
            if (hDir < 0)  // Go left
            {
                rb.velocity = new Vector2(-speedX, rb.velocity.y);
                transform.Rotate(0f, 180f, 0f);
            }
            else if (hDir > 0)  // Go right
            {
                rb.velocity = new Vector2(speedX, rb.velocity.y);
                transform.Rotate(0f, 0f, 0f);
            }
        }
    }
}

在向左走时,如何使播放器坚持左向动画?据我所知,请不要建议更改localScale,但出于射击目的,最好让播放器旋转。

2 个答案:

答案 0 :(得分:2)

这行代码执行时,transform.Rotate(0,180,0);习惯了rotate 180 degree in y axis each time,这就是玩家不停止旋转的原因

这是您可以使用的代码,它将阻止您根据方向旋转播放器

 private void InputManager()
    {
        float hDir = Input.GetAxis("Horizontal");

        if (state != State.hurt)
        {
            if (!anm.GetCurrentAnimatorStateInfo(0).IsTag("attack"))
            {
                if (hDir < 0)  // Go left
                {
                    rb.velocity = new Vector2(-speedX, rb.velocity.y);
                    this.transform.rotation = Quaternion.AngleAxis(180, Vector3.up);
                }
                else if (hDir > 0)  // Go right
                {
                    rb.velocity = new Vector2(speedX, rb.velocity.y);
                    this.transform.rotation = Quaternion.AngleAxis(0, Vector3.up);
                }
            }
        }
    }

答案 1 :(得分:0)

您需要添加一个布尔变量来检查玩家是否朝右,以及一个翻转功能来翻转他:

bool bFacingRight = true;

private Rigidbody2D rb;

int _switch;

private void FixedUpdate() {
    InputManager();
}

private void InputManager()
{
    if (state == State.hurt || anm.GetCurrentAnimatorStateInfo(0).IsTag("attack"))
       return;
    
    float hDir = Input.GetAxis("Horizontal");

    // Move the character by finding the target velocity
    rb.velocity = new Vector2(hDir * 10f, rb.velocity.y);

    if (hDir < 0 && bFacingRight) { // Flip Left
       _switch = 0;
       Flip(_switch);
    }
    else if (hDir > 0  && !bFacingRight) { // Flip Right
       _switch= 1;
       Flip(_switch);
    }
}

private void Flip(int swth)
{
    // Switch the way the player is labelled as facing.
    bFacingRight = !bFacingRight;

    // Multiply the player's x local scale by -1.
    switch(swth)
    {
       case 0:
       this.transform.rotation = Quaternion.AngleAxis(180, Vector3.up);
       break;
       case 1:
       this.transform.rotation = Quaternion.AngleAxis(0, Vector3.up);
       break;
    }
}