Unity游戏重启后意外退出调试及4秒延迟重启实现问询
问题解答
一、修复延迟4秒重启功能(解决重启后意外退出问题)
你的代码存在两处核心逻辑漏洞,直接导致重启后快速触发二次重启甚至意外退出:
timerActive初始值为true,游戏启动后立刻满足Time.time - collisionTime > collisionThreshold条件,反复启动重启协程- 触发重启逻辑后未关闭
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
相关产品推荐
相关产品推荐

