Unity碰撞检测脚本BUG调试与修复咨询
修复Unity中碰撞计时器未停止的BUG
问题根源:你的代码只在球开始碰撞圆柱体时启动计时器,但完全没处理球离开圆柱体的场景——球离开后timerActive依然保持true,导致计时器继续倒计时,最终误触发获胜判定。
简便修复步骤
直接添加OnCollisionExit函数,检测球离开圆柱体时停止计时器:
// 新增:处理球离开圆柱体的逻辑 void OnCollisionExit(Collision collision) { if (collision.gameObject.CompareTag("Cylinder")) { timerActive = false; UpdateTimerText(); // 立刻清空计时器文本 } }
完整修改后的代码(仅新增上述函数)
void OnCollisionEnter(Collision collision) { if (collision.gameObject.CompareTag("Cylinder")) { collisionTime = Time.time; timerActive = true; cylinderObject = collision.gameObject; } else if (collision.gameObject.CompareTag("Ground")) { timerActive = false; UpdateTimerText(); } } // 新增的碰撞离开处理函数 void OnCollisionExit(Collision collision) { if (collision.gameObject.CompareTag("Cylinder")) { timerActive = false; UpdateTimerText(); } } void Update() { if (timerActive && Time.time - collisionTime > collisionThreshold) { restarting = true; if (cylinderObject != null) { Vector3 newPosition = cylinderObject.transform.position; newPosition.y -= 2f; cylinderObject.transform.position = newPosition; timerActive = false; } StartCoroutine(RestartGameAfterDelay(restartDelay)); } UpdateTimerText(); } IEnumerator RestartGameAfterDelay(float delay) { yield return new WaitForSeconds(delay); SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex); } void UpdateTimerText() { if (restarting) { timerText.text = ""; return; } if (timerText != null) { float remainingTime = Mathf.Max(0f, collisionThreshold - (Time.time - collisionTime)); if (timerActive) { timerText.text = $"Time: {remainingTime:F1}s"; } else { timerText.text = ""; } } }
修复逻辑说明
- 当球离开圆柱体时,
OnCollisionExit会被触发,此时直接将timerActive设为false,计时器停止计数,同时调用UpdateTimerText清空显示。 - 这个改动不需要修改原有函数的核心逻辑,只是补充了缺失的“碰撞结束”检测,属于最小侵入式的简便修复。
内容的提问来源于stack exchange,提问作者Hadis Seif
相关产品推荐
相关产品推荐

