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

Unity角色跳行动画卡顿求助:OnGround函数未正常触发

解决角色跳行动画卡住的问题

核心问题分析

你的代码里有两个关键问题导致跳行动画卡住:

  • 跳行动画的布尔值isJumping仅在按下空格时更新,角色落地后没有重置为false
  • 空格按键逻辑错误:即便角色在地面,你先设置anim.SetBool("isJumping", false),紧接着又设置为true,直接覆盖了正确状态

修复步骤

1. 修正动画状态更新逻辑

把isJumping的状态检查移到Update每一帧执行,而非仅在按键时处理:

void Update()
{
    // 改用Rigidbody2D控制横向移动,避免直接修改transform.position引发物理冲突
    rb.velocity = new Vector2(SpeedValues[(int)CurrentSpeed], rb.velocity.y);
    
    // 每一帧根据地面检测结果自动更新动画状态
    anim.SetBool("isJumping", !OnGround());

    if(Input.GetKeyDown(KeyCode.Space))
    {
        if (OnGround())
        {
            rb.velocity = new Vector2(rb.velocity.x, 0); // 仅重置Y轴速度,保留横向移动
            rb.AddForce(Vector2.up * 26f, ForceMode2D.Impulse);
        }
    }   
}

2. 确保OnGround函数正常工作

检查以下配置是否正确:

  • GroundCheckTransform位置:将该Transform放在角色脚底(比如Sprite底部中心),确保检测范围能覆盖地面
  • GroundCheckRadius:设置合适数值(如0.2f),避免过大或过小
  • GroundMask:在Inspector中,确保仅勾选地面层(如命名为"Ground"的Layer),不要勾选角色自身或其他无关层

3. 修复其他代码错误

你的OnTriggerEnter2D函数将协程定义在内部,会导致编译错误,需将协程移到函数外部:

void OnTriggerEnter2D(Collider2D collision)
{
    if(collision.tag == "Barrier" || collision.tag == "Enemy")
    {
        transform.position = respawnPoint;
        StartCoroutine(WaitBeforeRespawn());
    }

    if(collision.tag == "End")
    {
       this.gameObject.SetActive(false);
    }
}

IEnumerator WaitBeforeRespawn()
{
    yield return new WaitForSeconds(1);
    SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
}

同时记得在代码顶部添加using UnityEngine.SceneManagement;,否则SceneManager会报错。

测试验证

  1. 运行前在Scene视图查看GroundCheckTransform的位置和检测范围(可在Gizmos中开启OverlapCircle显示)
  2. 按下空格跳跃,落地后观察动画是否自动切回地面状态
  3. 多次跳跃测试,确认跳行动画不再卡住

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 06:23:18