После перезапуска игры цели не появляются

После того, как я нажимаю кнопку перезапуска, игра перезапускается, но цели не появляются. когда я впервые запускаю игру, она работает, но после перезапуска цели не появляются, курсор также должен исчезнуть и повернуть его в перекрестье. он пробовал много вещей, но это не работает

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);
    }
}

цели должны появиться, а курсор должен исчезнуть и превратиться в перекрестие

возможно, вы никогда не сбрасываете шкалу времени с 0?

BugFinder 14.08.2024 16:32
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я редактирую, так как после разговора с ipodtouch я обнаружил, что моя первая часть неверна, поскольку выход приведет к выходу цикла While(true).

То, что указали ipodtouch и bugfinder, является хорошим указанием на то, что может быть причиной проблемы. В методе Gameover вы устанавливаете Time.timescale на 0, который не перезапускается при повторной загрузке сцены. Возможно, было бы разумно вернуть ему значение 1 (или любое другое значение, которое вы используете в игре, обычно это 1) в конце метода или при запуске сцены. Возможно, лучше даже не менять Time.timescale, так как это может испортить код, который может работать.

Хотя я также понимаю и согласен с iPodtouch, что noOfballs перезапускается после повторной загрузки сцены. Переменная не появляется в предоставленном коде, и важно указать ее в скрипте, чтобы знать ее начальные значения, откуда она берется.

private int noOfBalls = 0;

    void Awake()
    {
        noOfBalls = 0;
        isGameOver = false;
        countDown = 120;
        StartCoroutine(Spawner());
        //InvokeRepeating("Spawner", 1, 1);
    }

Причина, по которой перекрестие, скорее всего, не возвращается, заключается в том, что, как упоминалось ранее, Time.timescale установлен на 0, а сценарий, отвечающий за внесение указанного изменения, приостановлен. Также вероятно, что сценарий, отвечающий за изменение положения курсора мыши на перекрестии, находится в другой сцене, поэтому он больше не запускается. Убедитесь, что он вызывается.

1) while (true) подходит для сопрограммы, в которой есть yield. -- 2) вам не нужно сбрасывать переменную noOfBalls, поскольку перезагрузка сцены уничтожает и воссоздает все объекты — она вернется к значению по умолчанию.

ipodtouch0218 14.08.2024 19:26

Я не был уверен, позволяют ли выходные данные завершить выполнение while(true), и хотел убедиться, что оно действительно завершилось. Что касается перезапуска noOfBalls, я не вижу другой причины, по которой предметы не смогут начать возрождаться после перезапуска сцены. Особенно учитывая, что код не показывает создание указанных переменных и присвоение значения.

Montain Production 14.08.2024 19:37

Скорее всего, просто они никогда не меняют Time.timeScale обратно с 0, поэтому время никогда не движется, как упоминалось в комментарии BugFinder

ipodtouch0218 14.08.2024 19:38

Если бы noOfBalls сбрасывался в новой сцене, разве шкала времени также не сбрасывалась бы после загрузки новой сцены?

Montain Production 14.08.2024 19:41
Time.timeScale — статическая переменная, она никогда не будет сброшена/переинициализирована. (потому что Unity не создает экземпляр new Time)
ipodtouch0218 14.08.2024 19:42

Вы правы. Я обновлю свой ответ, включив его сверху, чтобы показать проблему с timeScale, и удалю часть while(true). Поскольку он не упоминается в коде, где создается noOfBalls и устанавливается значение, я оставлю его как нечто, что пользователю необходимо включить.

Montain Production 14.08.2024 19:47

Только что обновил информацию. Надеюсь, теперь это достаточно хорошо, чтобы не проголосовать против.

Montain Production 14.08.2024 20:00

Спасибо. Ваши ответы действительно помогли, и проблема решена. Последнее, что вы можете мне предложить, как добавить возможность настройки чувствительности мыши в игре.

maark7 14.08.2024 21:08

В следующем уроке, который я нашел, содержится подробное объяснение того, как они это сделали. m-ansley.medium.com/… Я не знаю, есть ли технически лучшая версия, о которой знает кто-то еще, но эта кажется хорошей.

Montain Production 14.08.2024 21:29

Спасибо, это то, что я искал

maark7 14.08.2024 22:01

Другие вопросы по теме

Похожие вопросы

Таблица данных JQuery – сортировка столбцов не работает в
Как я могу исправить связь многие-ко-многим между двумя объектами, чтобы третья таблица автоматически заполнялась в структуре сущностей и веб-API (С#)
Как я могу зарегистрировать HTTP-ответ с помощью промежуточного программного обеспечения в функциях Azure, выполняющих изолированный процесс .NET 8?
Контекст Testcontainers .NET 8 db, похоже, не обновляется в [Факт], проблема решена, ищет объяснение
Переписать удаление служебной шины Azure
Невозможно вставить явное значение для столбца идентификаторов в таблице «Обсуждаемые продукты», если для параметра IDENTITY_INSERT установлено значение OFF
Сопоставление и удаление подстрок повторяющихся символов, а затем возврат длины самой длинной подстроки
Как отсортировать массив объектов сам по себе на основе свойства указанного объекта?
Динамическое создание выражений LINQ — ToLower и «Содержит» одновременно
Visual Studio 2022 FileNotFoundException при доступе к dll без локальной копии