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会报错。
测试验证
- 运行前在Scene视图查看
GroundCheckTransform的位置和检测范围(可在Gizmos中开启OverlapCircle显示) - 按下空格跳跃,落地后观察动画是否自动切回地面状态
- 多次跳跃测试,确认跳行动画不再卡住
内容的提问来源于stack exchange,提问作者TheEpikDuck
相关产品推荐
相关产品推荐

