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

Корутина не останавливается при срабатывании условия выхода

12.07.2022, 07:05. Показов 1027. Ответов 4

Студворк — интернет-сервис помощи студентам
Доброе утро!
Изучаю разработку платформера на Юнити по видеокурсу.
Только прошли тему Корутины, никак не могу найти ошибку в коде.

Вкратце: есть персонаж, который при касании определенного объекта должен менять цвет на красный и обратно в течении некоторого времени.
Проблема была в том, что при повторных касаниях скорость цветового перехода резко возрастает.
Начал ковырять код, дошел до того, что метод StopCoroutine() не отсанавливает работу корутины почему-то, при повторных касаниях героем объекта корутина запускается параллельно первой потому скорость цветового перехода растет.

Что исправить в коде, чтобы корутина IsHitted корректно завершалась при возвращении цвета персонажа в норму?
Внутри класса игрок есть булева переменная isHit, по умолчанию равна False.
Далее код обработки касания игроком объекта:


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
public void RecountHP(int delta)
{
//при касании игроком объекта запускается этот метод
        HealthPoints = HealthPoints + delta;
        if (delta < 0)
        {
            StopCoroutine(IsHitted());
            isHit = true;
            StartCoroutine(IsHitted());
        //покуда цвет персонажа плавно перетекает в красный, значение isHit = true;
        }
        if (HealthPoints <= 0)      
               ...
    }
...
    IEnumerator IsHitted()
    {
        if (isHit)
        {//смещаем цвет игрока в сторону красного
            GetComponent<SpriteRenderer>().color = new Color(1, GetComponent<SpriteRenderer>().color.g - 0.2f, GetComponent<SpriteRenderer>().color.b - 0.2f);
        }
        else
        {//смещаем цвет игрока обратно в сторону исходного
            GetComponent<SpriteRenderer>().color = new Color(1, GetComponent<SpriteRenderer>().color.g + 0.1f, GetComponent<SpriteRenderer>().color.b + 0.1f);
        }
        if (GetComponent<SpriteRenderer>().color.g <= 0)
            //если цвет достиг красного, меняем значение isHit на противоположное, чтобы корутина меняла цвет игрока обратно
            isHit = false;
        if (GetComponent<SpriteRenderer>().color.g >= 1)
            //если цвет достиг исходного, завершаем корутину
//вот тут, как мне кажется, проблема. Даже если условие срабатывает, корутина продолжает увеличивать значения цвета за пределы диапазона от 0f до 1f 
            StopCoroutine(IsHitted());
        yield return new WaitForSeconds(0.5f);
        StartCoroutine(IsHitted());
    }
 
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.07.2022, 07:05
Ответы с готовыми решениями:

GetMessage - не выводится сообщение при срабатывании условия
Здравствуйте. Господа, помогите разобраться... Вроде бы всё прозрачно, но где-то я не допонимаю... Задача - необходимо...

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

Почему программа не останавливается при выполнении условия?
есть два текстбокса, кнопка и таймер, вроде все ясно. Идет цикл от a до z. Когда я вписываю в второй текстбокс буква скажем d, то после...

4
 Аватар для Uzist
209 / 143 / 68
Регистрация: 09.05.2020
Сообщений: 747
12.07.2022, 09:45
Цитата Сообщение от tarhanovk Посмотреть сообщение
if (delta < 0)
        {
            StopCoroutine(IsHitted());
            isHit = true;
            StartCoroutine(IsHitted());
        //покуда цвет персонажа плавно перетекает в красный, значение isHit = true;
        }
C#
1
2
3
4
5
6
7
8
9
10
 
private int IsHitTimes
 
  if (delta < 0&& IsHitTimes<1)
        {
            StopCoroutine(IsHitted());
            isHit = true;
            StartCoroutine(IsHitted());
            IsHitTimes=1;
        }
создаёте переменную для того чтобы действие выполнялось один раз и используете её в условии, но потом еще не забудьте где-нибудь эту переменную обнулить
1
 Аватар для tarhanovk
1 / 1 / 0
Регистрация: 08.11.2013
Сообщений: 41
12.07.2022, 11:47  [ТС]
Ну, допустим так сделать можно. Но есть же логическая переменная isHitted,которая делает то же самое, в одном месте становится true и в другом месте false.
Суть конструкции от этого же не меняется, как это поможет?
0
 Аватар для tarhanovk
1 / 1 / 0
Регистрация: 08.11.2013
Сообщений: 41
12.07.2022, 19:06  [ТС]
Проблема решилась изящно и просто:

Вместо StopCoroutine();
надо было написать yield break;

Всем спасибо
0
 Аватар для samana
2639 / 1567 / 853
Регистрация: 23.02.2019
Сообщений: 3,876
12.07.2022, 20:41
Цитата Сообщение от tarhanovk Посмотреть сообщение
Что исправить в коде, чтобы корутина IsHitted корректно завершалась
Ваша проблема была в том, что вы просто неправильно останавливали корутину.
Ниже показаны несколько вариантов корректного запуска и остановки корутины

C#
1
2
3
4
5
private Coroutine _myCoroutine;
 
_myCoroutine = StartCoroutine(IsHitted());
//........
StopCoroutine(_myCoroutine);
C#
1
2
3
StartCoroutine(nameof(IsHitted));
//........
StopCoroutine(nameof(IsHitted));
Либо для остановки всех корутин данного объекта
C#
1
StopAllCoroutines();
p.s. Если вы запустите подряд несколько одинаковых корутин, то ссылка на предыдущую корутину будет потеряна и вы не сможете её остановить. Разве что остановить ВСЁ с помощью последнего показанного метода.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.07.2022, 20:41
Помогаю со студенческими работами здесь

Не останавливается работа кода при возникновении проверяемого условия в addTextChangedListener
Смысл кода - остановить выполнении программы если вводится не та цифра в позицию, что требуется по условию. (kotlin) ...

Необходимо составить код на цикл содержащий условия выхода
Здравствуйте. Помогите составить код в VBA на одну задачку: Ввести с клавиатуры и напечатать модули N числе, если введено...

необходимо составить код; Циклы содержащие условия выхода
задача. Ввести с клавиатуры и напечатать модули N чисе, если введено отрицательное число, напечатать его, затем ввод и печать прекратить

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

Сброс МК при срабатывании реле.
Делал я одно устройство с несколькими релюшками. Так вот при срабатывании реле всегда неизбежно происходил сброс микроконтроллера. Так и...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru