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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 14:06:17