You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity 2D角色无法双向翻转求助:翻转后固定朝左仍可移动跳跃

Unity 2D角色翻转异常:翻转一次后固定朝左无法切换

问题描述

跟随教程开发Unity 2D项目时,角色可正常跑动、跳跃,但Sprite翻转功能异常:首次翻转后角色固定朝左,无法再切换回朝右方向。已排查Sprite动画、碰撞器工作正常,核对教程步骤,并尝试过参考视频教程、咨询AI、求助朋友等方式,均未解决问题。

现有代码

public class PlayerController : MonoBehaviour
{
    public float moveSpeed;
    public Rigidbody2D theRB;
    public float jumpForce;

    private bool isGrounded;
    public Transform groundCheckPoint;
    public LayerMask whatIsGround;

    private bool canDoubleJump;

    private Animator anim;
    private SpriteRenderer theSR;

    private void Start()
    {
        anim = GetComponent<Animator>();
        theSR = GetComponent<SpriteRenderer>();
    }

    private void Update()
    {
        isGrounded = Physics2D.OverlapCircle(groundCheckPoint.position, .2f, whatIsGround);

        if (isGrounded)
        {
            canDoubleJump = true;
        }

        if (Input.GetButtonDown("Jump"))
        {
            if (isGrounded)
            {
                theRB.velocity = new Vector2(theRB.velocity.x, jumpForce);
            }
            else
            {
                if (canDoubleJump)
                {
                    theRB.velocity = new Vector2(theRB.velocity.x, jumpForce);
                    canDoubleJump = false;
                }
            }
        }
    }

    private void FixedUpdate()
    {
        float horizontalInput = Input.GetAxis("Horizontal");

        // Apply horizontal movement only when grounded
        if (isGrounded)
        {
            theRB.velocity = new Vector2(moveSpeed * horizontalInput, theRB.velocity.y);
        }

        // Flip the character sprite based on the movement direction
        if (horizontalInput < 0)
        {
            theSR.flipX = true;
        }
        else if (horizontalInput > 0)
        {
            theSR.flipX = false;
        }

        anim.SetFloat("moveSpeed", Mathf.Abs(theRB.velocity.x));
        anim.SetBool("isGrounded", isGrounded);
    }
}

问题排查与解决方案

1. 核心问题:空中无水平输入响应导致翻转判断失效

当前代码中,水平移动逻辑仅在角色接地时生效,空中时horizontalInput的输入不会改变角色速度,但翻转判断依赖horizontalInput。由于Update与FixedUpdate的执行时序差异,可能导致空中输入的horizontalInput无法正确触发翻转状态更新。

解决方法:修改移动逻辑,让空中也响应水平输入
将FixedUpdate中的移动代码修改为:

float horizontalInput = Input.GetAxis("Horizontal");

// 空中保留水平控制(可添加衰减系数调整手感)
float horizontalVelocity = moveSpeed * horizontalInput;
// 若需要空中减速效果,可改用下面的代码:
// float horizontalVelocity = isGrounded ? moveSpeed * horizontalInput : theRB.velocity.x + (moveSpeed * 0.5f * horizontalInput * Time.fixedDeltaTime);

theRB.velocity = new Vector2(horizontalVelocity, theRB.velocity.y);

2. 优化翻转判断逻辑,避免状态残留

当前代码未处理horizontalInput = 0的情况,虽不影响切换,但可补充逻辑确保角色朝向与最后输入/速度方向一致:

// 根据输入方向翻转,无输入时根据速度方向保持朝向
if (horizontalInput != 0)
{
    theSR.flipX = horizontalInput < 0;
}
else
{
    // 若无输入,保持当前速度对应的朝向
    theSR.flipX = theRB.velocity.x < 0;
}

3. 排查动画覆盖问题

检查Animator中的所有动画片段,确认没有在动画关键帧中强制设置SpriteRenderer.flipX属性——动画的属性关键帧会覆盖代码中的设置。若存在此类关键帧,直接删除即可。

4. 验证输入设置正确性

打开Unity的Edit > Project Settings > Input Manager,确认Horizontal轴的正负方向按钮绑定正常(如A/左箭头对应负方向,D/右箭头对应正方向),无重复或冲突的输入设置。


内容的提问来源于stack exchange,提问作者Manticore Millionerds

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 01:45:05