В Unity (C#) не меняются значения локальных переменных

Юнити, C#. Заранее извиняюсь за долгие пояснения.

Итак, у меня в юнити есть 2 скрипта: первый печатает заданный текст посимвольно, второй - менеджер, вызывает методы из первого скрипта. Файлы, с которых я читаю текст, есть двух типов: скажем, тип А и тип В. Разные типы записываются в разные текстовые области. введите сюда описание изображения

Соответственно, для каждого типа файла у меня свой метод вызова анимации текста. Все они вызываются в Update по нажатию клавиш.

Метод для типа А:

public void LetterText()
{
    if (textWriter.isActiveWriter()) //скипать анимацию по нажатию
    {
        textWriter.WriteAll();
    }
    else if (!textWriter.isActiveWriter()) //вызов анимации текста и получение следующего файла
    {
        
        if (!getState.isEndState) //если не конечный файл и наборе
        {
            getState = getState.GetNextState()[0]; //меняем нынешний файл на следующий
            if (!getState.isCC) //если типа А
            {
            textWriter.AddWriter(otherManagerForLetter, otherManagerForLetter.text+getState.GetFraseText(), 0.03f, true, otherManagerForLetter.text.Length); //otherManagerForLetter - область для текста типа А
            }
            else
            {
                textWriter.AddWriter(text, getState.GetFraseText(), 0.03f, true); //text - область для текста типа В
            }
        }
        else if (getState.isEndState)
        {
            //вызываем следующую сцену
        }
    }

}

Метод для типа В (почти идентичен):

public void LetterTextForCC()
{
    if (textWriter.isActiveWriter()) //скипать анимацию
    {
        textWriter.WriteAll();
    }
    else if (!textWriter.isActiveWriter()) //вызов анимации текста и получение следующего файла
    {
        if (!getState.isEndState)
        {
            getState = getState.GetNextState()[0];
            
            if (getState.isCC)
            {
                textWriter.AddWriter(text, getState.GetFraseText(), 0.03f, true);
            }
            else
            {
                DialogueBoxToDisableForLetter.SetActive(false);
                textWriter.AddWriter(otherManagerForLetter, otherManagerForLetter.text + getState.GetFraseText(), 0.03f, true, otherManagerForLetter.text.Length); 
            }
        }
        else if (getState.isEndState)
        {
            //вызываем следующую сцену
        }
    }
}

Итак, оба этих метода вызывают следующий из другого скрипта, где он меняет значения локальный переменных:

public void AddWriter(TextMeshProUGUI uiText, string textToWrite, float timePerCharacter, bool invisibleCharacters, int characterToStart = 0) //задаем новые параметры
    {
        this.uiText = uiText; //Текстовое поле, с которым работает код
        this.textToWrite = textToWrite; //текст для написания
        this.timePerCharacter = timePerCharacter; //скорость
        this.invisibleCharacters = invisibleCharacters; //скрывать ли ненаписанные символы
        characterIndex = characterToStart; //С какого символа начнется отображение
    }

Изменив значения, Update выполняет всю работу по отображению символов следующим образом:

    public void Update()
    {
        if (uiText != null) //если есть текст для написания
        {
            timer -= Time.deltaTime;
            while (timer <=0)
            {
                timer += timePerCharacter;
                characterIndex++;
                string text = textToWrite.Substring(0, characterIndex);//забираем символ
                if (invisibleCharacters)
                {
                    text += "<color=#00000000>" + textToWrite.Substring(characterIndex) + "</color>"; //делаем остальные симфоолы невидымыми
                }
                uiText.text = text;

                if (characterIndex>= textToWrite.Length) //если символы кончились
                {
                    FindObjectOfType<textManager>().textWritingSFX.Stop();
                    uiText = null;
                    return;
                    
                }
            }
        }
    }

А теперь к проблеме:

Код работает прекрасно во всех случаях, кроме двух: когда происходит первый вызов метода сразу по запуску сцены и когда вызывается из метода для типа А (который писала выше).

При начале я из Start вызываю следующий метод:

public void CallFirstStateForLetter()
{
    textWriter.AddWriter(otherManagerForLetter, getState.GetFraseText(), 0.03f, true);
}

Проверяя значения переменных, я пришла к выводу, что в двух данных ситуациях функция AddWriter выполняется, но далее в Update значения всех переменных из нее просто null, почему и не проходят проверку и код не выполняется. Я не могу понять, почему, собственно, в AddWriter не меняются значения конкретно в данных случаях, хотя во всех остальных - меняяются корректно. Может кто-нибудь увидит ошибку?


Ответы (0 шт):