Unity游戏重启后目标不生成、光标未切换为十字准星求助
Unity重启游戏后目标不生成+光标异常问题修复
问题现象
首次启动游戏时目标生成正常,但点击Restart按钮重启游戏后:
- 目标无法生成
- 光标未隐藏且未切换为十字准星
问题代码
public int totalHits = 0; public int ballHit = 0; public Image accuracyImage; public TextMeshProUGUI countDownText; public TextMeshProUGUI scoreText; public TextMeshProUGUI performanceText; public TextMeshProUGUI ballHitText; public TextMeshProUGUI percentageText; public float countDown; public float accuracy = 0f; public float accuracyFA = 0f; public bool isGameOver = false; public FirstPersonController fpsScript; void Awake() { isGameOver = false; countDown = 120; StartCoroutine(Spawner()); //InvokeRepeating("Spawner", 1, 1); } // Update is called once per frame void Update() { accuracy = ballHit * 100 / totalHits; if (countDown > 0) countDown -= Time.deltaTime; countDownText.text = (countDown).ToString("0"); scoreText.text = accuracy + "%"; if (countDown < 1) { isGameOver = true; } if (isGameOver) { GameOver(); } accuracyFA = ballHit / totalHits; //Spawner(); } IEnumerator Spawner() { while (true) { yield return new WaitForSeconds(0.5f); if (countDown > 0 && noOfBalls <= 3) { Vector3 position = new Vector3(Random.Range(-270, 230), Random.Range(20, 180), 355); Instantiate(target, position, target.transform.rotation); Debug.Log("Spawned"); noOfBalls++; } } } void GameOver() { Time.timeScale = 0f; fpsScript.RotationSpeed = 0f; gameOverMenu.SetActive(true); accuracyImage.fillAmount = accuracyFA / 10; ballHitText.text = (ballHit).ToString("0"); percentageText.text = accuracy + "%"; HUD.SetActive(false); if(ballHit <= 40) { performanceText.text = "Poor, Need Practice"; } else if(ballHit <= 70) { performanceText.text = "Good, Can Improve"; } else if(ballHit >= 70) { performanceText.text = "Well Done, Keep It Up"; } Cursor.visible = true; Cursor.lockState = CursorLockMode.None; crossheir.SetActive(false); } public void Restart() { SceneManager.LoadScene(SceneManager.GetActiveScene().name); }
修复方案
1. 目标无法生成问题修复
- 核心原因:
GameOver方法中设置了Time.timeScale = 0f,场景重启时该值不会自动重置为1,导致协程里的WaitForSeconds完全停止计时,Spawner协程无法执行实例化逻辑;另外noOfBalls变量未在场景重启时重置,可能导致生成条件不满足。 - 修复代码:
- 修改
Restart方法,先重置时间缩放:public void Restart() { Time.timeScale = 1f; // 重置时间缩放为正常速度 SceneManager.LoadScene(SceneManager.GetActiveScene().name); } - 在
Awake方法中重置noOfBalls:void Awake() { isGameOver = false; countDown = 120; noOfBalls = 0; // 重启时重置目标计数 StartCoroutine(Spawner()); }
- 修改
2. 光标状态异常问题修复
- 核心原因:场景重启后,光标状态和十字准星的显示状态未被重新初始化。
- 修复代码:
在Awake方法中添加光标初始化逻辑:void Awake() { isGameOver = false; countDown = 120; noOfBalls = 0; // 初始化游戏状态下的光标和准星 Cursor.visible = false; Cursor.lockState = CursorLockMode.Locked; crossheir.SetActive(true); StartCoroutine(Spawner()); }
验证要点
- 重启游戏后,查看控制台是否打印"Spawned"日志,确认目标生成逻辑正常执行
- 检查光标是否隐藏且锁定,十字准星是否正常显示
内容的提问来源于stack exchange,提问作者maark7
相关产品推荐
相关产品推荐

