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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 14:16:05