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

Unity 2D角色跳跃动画落地后无法停止切换问题求解

问题修复方案

核心问题排查与修复步骤

1. 代码逻辑修正

现有代码存在两个逻辑错误:

  • 输入检测方法Input.GetButtonDown()仅在按键按下的单帧返回true,放在物理帧FixedUpdate中执行会因为帧率不匹配概率丢失输入,建议拆分跳跃逻辑
  • 动画更新逻辑AnimatedJump()放在FixedUpdate中会和动画系统的更新频率不匹配,导致参数更新延迟,建议移动到Update中执行

修正后的代码参考:

[SerializeField]
private float moveforce = 10f;

[SerializeField]
private float jumpForce = 11f;

private float movementX;
private bool jumpTrigger = false; // 新增跳跃触发标记

private string RUN_ANIMATION = "run";
private string JUMP_ANIMATION = "jump";
private bool isGrounded = true;
private string GROUND_TAG = "ground";

private Animator anim;
[SerializeField]
private Rigidbody2D myBody;
private SpriteRenderer sr;

private void Awake()
{
    sr = GetComponent<SpriteRenderer>();
    anim = GetComponent<Animator>();
    myBody = GetComponent<Rigidbody2D>();
}

void Update()
{
    PlayerMoveKeyboard();
    AnimatedPlayer();
    // 把输入检测移到Update
    if(Input.GetButtonDown("Jump") && isGrounded)
    {
        jumpTrigger = true;
    }
    AnimatedJump(); // 动画逻辑移到Update
}

private void FixedUpdate()
{
    PlayerJump();
}

void PlayerMoveKeyboard()
{
    movementX = Input.GetAxisRaw("Horizontal");
    transform.position += new Vector3(movementX, 0f, 0f) * Time.deltaTime * moveforce;
}

void AnimatedPlayer()
{
    if(movementX > 0)
    {
        anim.SetBool(RUN_ANIMATION, true);
        sr.flipX = false;
    }
    else if(movementX < 0f)
    {
        anim.SetBool(RUN_ANIMATION, true);
        sr.flipX = true;
    }
    else
    {
        anim.SetBool(RUN_ANIMATION, false);
    }
}

void PlayerJump()
{
    // FixedUpdate里只处理物理受力
    if(jumpTrigger && isGrounded)
    {
        isGrounded = false;
        myBody.AddForce(new Vector2(0f, jumpForce), ForceMode2D.Impulse);
        jumpTrigger = false;
     }
}

private void OnCollisionEnter2D(Collision2D collision)
{
    if (collision.gameObject.CompareTag(GROUND_TAG))
    {
        isGrounded = true;
    }
}

void AnimatedJump()
{
    anim.SetBool(JUMP_ANIMATION, !isGrounded);
}

2. Animator状态机配置修正

90%的动画不切换问题都是状态机配置错误导致,按以下要求检查:

  • 打开Animator窗口,找到从跳跃状态到Idle状态、跳跃状态到跑步状态的两条过渡线
  • 取消勾选过渡配置里的Has Exit Time,这个选项会强制等跳跃动画播放完才会切换,即使参数已经满足切换条件
  • 把过渡的Transition Duration设置为0或0.1,避免过渡动画过长导致的切换延迟
  • 确认过渡条件配置正确:
    • Jump→Idle:jump参数为false 且 run参数为false
    • Jump→Run:jump参数为false 且 run参数为true
  • 确认跳跃动画剪辑没有勾选Loop Time,否则跳跃动画会循环播放,无法自然结束

3. 碰撞检测有效性验证

  • 确认角色和地面的Collider2D组件都没有勾选Is Trigger
  • 确认地面对象的Tag设置为ground,拼写、大小写完全和代码一致
  • 可以在Update中添加Debug.Log(isGrounded),运行游戏测试落地时控制台是否输出true,确认isGrounded参数能正确更新

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 08:45:03