Как мне сбросить переменную метода?

#c# #unity3d #variables

#c# #unity3d #переменные

Вопрос:

Я включил соответствующие фрагменты кода, которые хорошо работают при первом запуске. Когда я перезагружаю игру, у меня возникает проблема с переменной currentScore. Он не сбрасывается внутри метода calcScore. Я не могу ее правильно сбросить или не могу понять, почему метод calcScore использует переменную currentScore, как если бы это была локальная переменная.

Часто вызывается calcScore. Это привязка к кнопкам в тестовой игре. Я не объявил переменную currentScore в методе, поэтому он должен использовать переменную класса. Когда я читаю currentScore с помощью debug.в журнале после сброса игры написано «currentScore = 0». Но когда я вызываю метод calcScore (в //#####), он возвращает старое значение, оставшееся до сброса. Помогите мне понять, что я сделал не так и почему я глуп.

 public class Score : MonoBehaviour

public int currentScore = 0;
int reward = 100;
int timePassedOrLeft;
double correctAnswer;
float currentTime;

void Start()
{
    levelController = FindObjectOfType<LevelController>();
    score = FindObjectsOfType<Score>();
    ShowDisplayScore();
    timeCount = FindObjectOfType<TimeCount>();
    currentScore = 0;
}

public void CalcScore(string answeredText)
{
    Debug.Log(currentScore); // #####

    bool isTimeLimitActive = levelController.GetTimeLimit();
    timePassedOrLeft = Convert.ToInt32(timeCount.GetLeftTime());
    int answer = int.Parse(answeredText);
    correctAnswer = levelController.GetAnswer();

    if (isTimeLimitActive == false)
    {
        if (answer == correctAnswer)
        {
            currentScore  = reward;
             ShowDisplayScore();
        }
        else
        {
            currentScore -= reward;
            ShowDisplayScore();
        }
    }
    else if (isTimeLimitActive)
    {
        if (answer == correctAnswer)
        {
            currentScore  = reward;
            ShowDisplayScore();
        }
        else
        {
            currentScore -= reward;
            ShowDisplayScore();
        }
    }
}
  

}

Вот часть, которая вызывает метод calcScore

 public void ReadFromButton(int i)
{
    answeredText = buttontexts[i].GetComponentInChildren<Text>().text;
    //Debug.Log(answeredText);

    Score score;
    score = FindObjectOfType<Score>();
    score.CalcScore(answeredText);
    score = null;
}
  

И вот часть, которая должна сбросить currentScore. У меня есть 2 экземпляра Score, поэтому я использую Array.

     public void RestartGame()
{
    Score[] scores;
    scores = FindObjectsOfType<Score>();

    foreach (var score in scores)
    {
        score.currentScore = 0;
        score.DebugScore();
    }
  

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

1. На самом деле вы не дали нам достаточно кода, чтобы мы могли догадаться, что происходит. Вероятно, вам также следует предоставить код оценки, но трудно понять, что именно вы должны включить. Некоторые комментарии: if (isTimeLimitActive) излишне, поскольку и предложение main, и предложение else выполняют одно и то же. Не присваивайте значение null для оценки ReadFrom Button . Это не имеет смысла, поскольку вы выходите из блока, в котором переменная имеет область видимости.

Ответ №1:

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

Итак, чтобы решить эту проблему, учитывая, что мы не знаем всего кода, который вы запускаете, который может вызвать это (ваш код в том виде, в котором он есть, должен работать), я полагаю, что самый простой способ — заменить содержимое Restart Game следующим:

 public void RestartGame()
{
    Scene scene = SceneManager.GetActiveScene(); 
    SceneManager.LoadScene(scene.name);
}
  

~Pino

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

1. Действительно, я использую одну сцену и разные холсты. Не думал, что это имеет отношение к проблеме. Ваше решение работает, и я собираюсь его использовать. Хотя я чувствую, что буду сожалеть, что не решил проблему.

2. Ну, чтобы разобраться с этим, вам нужно сильно изменить код. Я вижу, что ваш стиль кодирования не соответствует ни одному из лучших методов Unity, поэтому вы все еще учитесь. Я уверен, что со временем вы узнаете, где еще в коде вы что-то упустили. Если хотите, напишите мне в LinkedIn ( linkedin.com/in/gdefrancesco ) и мы можем организовать бесплатную доработку вашего кода. Я люблю отдавать сообществу все, что могу, так что делайте это 😉