Когда я использую Invoke для метода, который я хочу использовать, я больше не могу его вызывать?

#c# #unity3d

#c# #unity3d

Вопрос:

Я начал изучать кодирование самостоятельно, просматривая видео, читая веб-статьи и т. Д. И я подумал, что обучение на практике подойдет мне лучше, Поэтому я начал создавать игру с Unity с помощью обучающих видеороликов Brackeys.

 using UnityEngine.SceneManagement;
using UnityEngine;

public class gameManager : MonoBehaviour
{
    bool hasGameEnded = false;

    public float restartDelay = 1f;
    public void endGame()
    {
        if (hasGameEnded == false)
        {
            
            hasGameEnded = true;
            Invoke("Restart", 2f);
        }

        void Restart()
        {

            SceneManager.LoadScene(SceneManager.GetActiveScene().name);

        }

    }

 

Итак, моя проблема здесь в том, что когда я использую invoke с перезапуском метода, ни один из вызовов не работает.
«Предупреждение CS8321 Локальная функция’Restart’ объявлена, но никогда не использовалась», — вот ошибка, которую я получаю.

При желании я могу показать, где и как я использовал метод endGame. Спасибо за любую помощь.

Комментарии:

1. Вы объявили Restart как метод ВНУТРИ endGame метода. Попробуйте переместить его оттуда (в класс). И при вызове Invoke Restart не должно быть в кавычках.

2. Пол Бак дал вам правильный ответ. Я просто хотел сказать, что вы получили предупреждение, а не ошибку. Код все равно будет компилироваться с предупреждениями и выполняться, но не всегда будет работать. Мой совет — продолжайте рассматривать их как ошибки и исправляйте их, не слушайте «экспертов», которые говорят, что вы можете игнорировать предупреждения, потому что, как вы только что обнаружили, это не всегда так 🙂

3. Спасибо за добрые ответы. Я сделал то, что вы и Мохаммад сказали, и это сработало так, как должно. Единственное, что Поул сказал неправильно, что перезапуск должен быть в кавычках. Я попробовал это без кавычек, и это не сработало, и, конечно, Gorilla, я не буду игнорировать предупреждения, даже если это всего лишь одно предупреждение. Спасибо за ваш долгосрочный совет!

Ответ №1:

Если Void он был внутри другого Void , он не будет работать.

Итак, вам нужно изменить :

 using UnityEngine.SceneManagement;
using UnityEngine;

public class gameManager : MonoBehaviour
{
    bool hasGameEnded = false;

    public float restartDelay = 1f;
    public void endGame()
    {
        if (hasGameEnded == false)
        {
            
            hasGameEnded = true;
            Invoke("Restart", 2f);
        }

        void Restart()
        {

            SceneManager.LoadScene(SceneManager.GetActiveScene().name);

        }

    }

}
 

Для :

 using UnityEngine.SceneManagement;
using UnityEngine;

public class gameManager : MonoBehaviour
{
    bool hasGameEnded = false;

    public float restartDelay = 1f;
    public void endGame()
    {
        if (hasGameEnded == false)
        {
            
            hasGameEnded = true;
            Invoke("Restart", 2f);
        }
    }

    void Restart()
    {

        SceneManager.LoadScene(SceneManager.GetActiveScene().name);

    }
}
 

Комментарии:

1. Спасибо за ваше примерное решение и объяснение!