Форум программистов, компьютерный форум, киберфорум
Unity, Unity3D
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
1 / 1 / 0
Регистрация: 21.08.2019
Сообщений: 62

При запуске корутины не сбрасываются локальные переменные

02.05.2021, 05:38. Показов 2032. Ответов 6

Студворк — интернет-сервис помощи студентам
Обычно когда я работал с корутинами, то при каждом запуске локальные переменные равнялись тем значениям, которые я им задал при объявлении. Сейчас я решил немного изменить подход к работе с корутинами и тут же обнаружил странное поведение. Запускаю корутину, останавливаю, запускаю снова, а она, как можете увидеть на скриншоте, каким-то образом сохраняет значение локальной переменной. Кто-то знает почему так происходит и как можно этого избежать?

Класс для работы с корутинами:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class CustomCoroutine
{
    private MonoBehaviour _owner;
    private Coroutine _coroutine;
    private IEnumerator _routine;
 
    private bool _isProcessing
    {
        get => _coroutine != null;
    }
 
 
    public CustomCoroutine(MonoBehaviour owner, IEnumerator routine)
    {
        _owner = owner;
        _routine = routine;
    }
 
    public void Start()
    {
        Debug.Log("Coroutine started");
        Stop();
 
        _coroutine = _owner.StartCoroutine(Process());
    }
 
    public void Stop()
    {
        if (_isProcessing)
        {
            _owner.StopCoroutine(_coroutine);
            _coroutine = null;
            Debug.Log("Coroutine stopped");
        }
    }
 
 
    private IEnumerator Process()
    {
        yield return _routine;
        _coroutine = null;
    }
}

Класс где это использую:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class Test : MonoBehaviour
{
    private CustomCoroutine _testCoroutine;
 
    private void Start()
    {
        _testCoroutine = new CustomCoroutine(this, TestRoutine());
    }
 
    private void Update()
    {
        if (Input.GetKeyUp(KeyCode.Space))
        {
            _testCoroutine.Start();
        }
        if (Input.GetKeyUp(KeyCode.Backspace))
        {
            _testCoroutine.Stop();
        }
    }
 
    private IEnumerator TestRoutine()
    {
        int i = 20;
 
        while(i > 0)
        {
            Debug.Log("Heh " + i);
            i--;
            yield return new WaitForSeconds(1f);
        }
    }
}
Миниатюры
При запуске корутины не сбрасываются локальные переменные  
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.05.2021, 05:38
Ответы с готовыми решениями:

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

При любом действии сбрасываются переменные. Как этого избежать
У меня проблема небольшая. Пишу приложение ASP.net, при любой действии сбрасываются переменные. Как сделать так чтобы они не сбрасывались? ...

Локальные переменные удаляются при выходе из области видимости или просто становятся невидимыми в новом контексте?
Локальные переменные удаляются при выходе из области видимости или просто становятся невидимыми в новом контексте? Добавлено через 29...

6
 Аватар для zhunshun
767 / 495 / 216
Регистрация: 05.04.2015
Сообщений: 2,073
02.05.2021, 09:32
Вызовите StopAllCoroutines и все корутины остановятся https://docs.unity3d.com/Scrip... tines.html а так они не все останавливаютс
0
 Аватар для samana
2639 / 1567 / 853
Регистрация: 23.02.2019
Сообщений: 3,876
02.05.2021, 11:54
А вы точно уверены, что остановка внешней корутины Process(), так же останавливает корутину, которая выполнялась внутри неё?
0
1 / 1 / 0
Регистрация: 21.08.2019
Сообщений: 62
02.05.2021, 17:48  [ТС]
samana, а, то есть работа _routine просто замораживается, когда отключается Process()?
Потому что судя по сообщениям, она не работает после остановки.

Добавлено через 53 минуты
zhunshun, вообще все корутины останавливать не надо, но я проверил ради интереса, написал _owner.StopAllCoroutines() - происходит то же самое

Добавлено через 1 час 37 минут
А может быть такое, что когда я записываю TestRoutine в поле _routine, то она превращается в объект и все её локальные переменные становятся чем-то вроде полей в экземпляре класса, что препятствует их инициализации с нуля во время каждого нового запуска? И если я думаю в правильном направлении, то есть ли способы этого избежать? Может можно как-то сохранить _routine в первоначальном состоянии, а запускать её копии? Что-то типа IEnumerator routine = new IEnumerator(_routine).
Только вот сам по себе IEnumerator это же интерфейс и по идее невозможно создавать его экземпляры. Что-то я запутался.
0
 Аватар для samana
2639 / 1567 / 853
Регистрация: 23.02.2019
Сообщений: 3,876
02.05.2021, 21:24
К сожалению не могу ничего толкового подсказать на тему корутин, потому что однажды я запутался в них и понял - что не осознаю их внутреннюю работу и не могу уверено ими манипулировать. А сейчас стараюсь их использовать только в самых простых случаях.
0
 Аватар для 1max1
3362 / 1775 / 1028
Регистрация: 26.10.2018
Сообщений: 5,204
02.05.2021, 22:35
Лучший ответ Сообщение было отмечено Farbeyond как решение

Решение

Сохраняя енумератор в переменную, с каждым запуском корутина продолжит с места остановки. Можно передавать лямбду в качестве рутины:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
public class CustomCoroutine
{
    private MonoBehaviour _owner;
    private Coroutine _coroutine;
    private Func<IEnumerator> _routine;
 
    private bool _isProcessing
    {
        get => _coroutine != null;
    }
 
    public CustomCoroutine(MonoBehaviour owner, Func<IEnumerator> routine)
    {
        _owner = owner;
        _routine = routine;
    }
 
    public void Start()
    {
        Debug.Log("Coroutine started");
        Stop();
 
        _coroutine = _owner.StartCoroutine(Process());
    }
 
    public void Stop()
    {
        if (_isProcessing)
        {
            _owner.StopCoroutine(_coroutine);
            _coroutine = null;
            Debug.Log("Coroutine stopped");
        }
    }
 
 
    private IEnumerator Process()
    {
        yield return _routine();
        _coroutine = null;
    }
}
C#
1
_testCoroutine = new CustomCoroutine(this, () => TestRoutine());
1
1 / 1 / 0
Регистрация: 21.08.2019
Сообщений: 62
03.05.2021, 03:44  [ТС]
1max1, большое спасибо, то что нужно!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.05.2021, 03:44
Помогаю со студенческими работами здесь

Переменные контроллеров сбрасываются в NULL
В общем проблема такая: package ChumInterface; import javafx.application.Application; import javafx.fxml.FXMLLoader; import...

Переменные Controller сбрасываются в NULL
Имеется довольно простая форма (inner), которую нужно N-раз добавить на основную форму (root). Естественно, что просто добавить ее мало -...

Когда сохраняем в cookie сессионные переменные сбрасываются?
Это опять я. Все получилось, все сохранилось в cookie? но переключаясь на другую страницу у меня сбрасываюися переменные Session('aaa')...

Локальные переменные
Какие из указанных форм не «могут» самостоятельно создавать локальные переменные LET DO* PROG LOOP PROGN PROG1 DOTIMES

Локальные переменные
Добрый день. В Java в частности и в программировании новичок. На интерактивном курсе(учусь на BA) застрял на таске: Есть объект: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru