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

Unity游戏重启后意外退出调试及4秒延迟重启实现问询

问题解答

一、修复延迟4秒重启功能(解决重启后意外退出问题)

你的代码存在两处核心逻辑漏洞,直接导致重启后快速触发二次重启甚至意外退出:

  1. timerActive初始值为true,游戏启动后立刻满足Time.time - collisionTime > collisionThreshold条件,反复启动重启协程
  2. 触发重启逻辑后未关闭timerActive,Update帧循环会持续创建新的协程实例,导致场景加载逻辑混乱

修改后的代码

using UnityEngine;
using UnityEngine.SceneManagement;
using System.Collections;
using TMPro;

public class BallController : MonoBehaviour
{
    private float collisionTime = 0f;
    // 初始设为false,避免游戏启动就触发重启逻辑
    private bool timerActive = false;
    public float collisionThreshold = 5f;
    public float restartDelay = 4f;
    public TextMeshProUGUI timerText;
    public GameObject cylinderPrefab;

    private GameObject cylinderObject;
    // 添加标记,避免重复启动协程
    private bool isRestarting = false;

    void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.CompareTag("CylinderTag"))
        {
            collisionTime = Time.time;
            timerActive = true;
            cylinderObject = collision.gameObject;
            // 重置重启标记,确保下次碰撞能正常触发流程
            isRestarting = false;
        }
        else if (collision.gameObject.CompareTag("Ground"))
        {
            timerActive = false;
            UpdateTimerText();
        }
    }

    void Update()
    {
        if (timerActive && !isRestarting && Time.time - collisionTime > collisionThreshold)
        {
            isRestarting = true;
            if (cylinderObject != null)
            {
                Destroy(cylinderObject);
            }
            StartCoroutine(RestartGameAfterDelay(restartDelay));
            // 关闭计时器,避免后续帧重复触发
            timerActive = false;
        }

        UpdateTimerText();
    }

    IEnumerator RestartGameAfterDelay(float delay)
    {
        yield return new WaitForSeconds(delay);
        SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
    }

    void UpdateTimerText()
    {
        if (timerText != null)
        {
            float remainingTime = Mathf.Max(0f, collisionThreshold - (Time.time - collisionTime));

            if (timerActive)
            {
                timerText.text = $"Time: {remainingTime:F1}s";
            }
            else
            {
                timerText.text = "";
            }
        }
    }
}

关键修改说明

  • 调整timerActive初始值为false,避免游戏启动就进入重启逻辑
  • 新增isRestarting标记,防止Update循环重复启动重启协程
  • 触发重启逻辑后立即设置timerActive = false,终止计时器更新流程
  • 碰撞圆柱时重置isRestarting标记,确保下次碰撞能正常触发计时

二、调试重启后意外退出的通用步骤

如果修改代码后仍存在问题,可按以下步骤逐一排查:

  • 检查Unity控制台错误:重启后立刻查看Console窗口的报错信息,空引用、缺失组件、场景未加入构建列表是最常见原因
  • 添加调试日志:在RestartGameAfterDelay协程的yield return前后、SceneManager.LoadScene调用处添加Debug.Log(),确认流程执行顺序和时机
  • 验证场景加载合法性:打开File > Build Settings,确认当前场景已添加到Scenes In Build列表中
  • 检查组件引用:确认timerText、cylinderPrefab等公共变量已在Inspector面板正确赋值,无空引用
  • 单独测试场景加载:写一个极简测试脚本,直接调用SceneManager.LoadScene加载当前场景,验证场景本身是否能正常加载
  • 核对标签配置:确认圆柱对象的标签为CylinderTag、地面标签为Ground,无拼写错误
  • 断点调试协程:在协程的yield return new WaitForSeconds(delay)处打断点,确认延迟时间是否正确,是否在延迟结束后执行加载
  • 检查Player设置:进入Edit > Project Settings > Player,查看Resolution and Presentation、Other Settings中的配置,排除因窗口模式、权限等导致的异常退出

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 08:00:26