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

Задержка выполнения кода на время выполнения анимации

22.11.2019, 14:04. Показов 5423. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пишу игру с видом пошагового боя.

С каждым ходом, игрок выкладывает на доску новую фигуру.
После того, как игрок выложил фигуру – идет расчет атаки всех его фигур на фигуры противника.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        for (int y = 1; y < 4; ++y)//перебор массива юнитов юзера
        {
            if (units[x, y].id.Length > 5)//если существует юнит юзера
            {
                if ((units[x, 4].id.Length) > 5)//если напротив юнита юзера в 4 столбике есть враг
                {
                    units[x, 4].health -= units[x, y].p_atk;  //расчет оставшейся жизни у врага
                    if (units[x, 4].health <= 0)
                    {
                        units[x, 4].id = "00";   //юнит врага убирается с доски
                    }
                }
                //далее так же
                // else if ((units[x, 5].id.Length) > 5)//если напротив юнита юзера в 5 столбике есть враг
            }
        }
После этого ход переходит к противнику.
Расчет атаки выполнялся следующим образом. Проходится по всем фигурам и рассчитывает урон который они наносят фигуре противника.
Все считалось корректно пока не понадобилось ввести анимацию атаки-урона-смерти фигур.
То есть проходит расчет атаки одной фигуры –выполняется анимация атаки этой фигуры, потом анимация получения урона фигурой противника – потом, происходит расчет атаки следующей фигуры.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
        for (int y = 1; y < 4; ++y)//перебор массива юнитов юзера
        {
            if (units[x, y].id.Length > 5)//если существует юнит юзера
            {
                if ((units[x, 4].id.Length) > 5)//если напротив юнита юзера в 4 столбике есть враг
                {
                    units[x, 4].health -= units[x, y].p_atk;  //расчет оставшейся жизни у врага
                    user_units[x, y].transform.GetChild(0).GetComponent<Obj_Lamasu>().Atack();  //вызов анимации атаки
 
                    if (units[x, 4].health <= 0)
                    {
                        bot_units[x, 4].transform.GetChild(0).GetComponent<Obj_Lamasu_Bot>().Death();   //вызов анимации смерти врага
                        units[x, 4].id = "00";     //юнит врага убирается с доски
                    }
                    else
                    {
                        bot_units[x, 4].transform.GetChild(0).GetComponent<Obj_Lamasu_Bot>().Get_Hit(); //вызов анимации получения урона врага
                    }
                }
            }
        }
Так анимация выполняется всеми и сразу - то есть не так как надо :-w
Планировал, что буду задерживать исполнение кода(простым опросом в цикле значения флага или через корутину) до того как выполнится анимация атаки очередной фигуры.
То есть в анимацию фигуры вставлять event, который будет запускать флаг, по которому будет продолжаться выполнение основного кода.
вставка event в анимацию атаки:

вызываемая в объекте функция меняет флаг в основном скрипте, после которого выполнение скрипта продолжается:
C++
1
2
3
4
    public void After_Atack()
    {
        GameObject.Find("scen_fight_1").GetComponent<scen_fight_1>()._animation = true;
    }
Всё похерилось, поскольку Unity сначала полностью выполняет код скрипта, и только потом осматривает, что же дебил разработчик засунул в анимацию объекта(фигуры) на сцены. И ожидание нужного флага становится вечным.
Подскажите, пожалуйста возможные решения такой задачки.
То есть проходит расчет атаки одной фигуры –выполняется анимация атаки этой фигуры, потом анимация получения урона фигурой противника – потом, происходит расчет атаки следующей фигуры.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.11.2019, 14:04
Ответы с готовыми решениями:

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

Задержка выполнения кода в Unity
Подскажите пожалуйста, каким образом можно реализовать задержку выполнения кода. У меня есть скрипт, который перемещает объект постоянно...

Задержка выполнения кода в скрипте
как между setActive false и true сделать задержку в 1 секунду? using UnityEngine; using UnityEngine.UI; using System.Collections; ...

2
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10425 / 5155 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
24.11.2019, 11:13
Лучший ответ Сообщение было отмечено Hallowed как решение

Решение

Цитата Сообщение от Hallowed Посмотреть сообщение
Подскажите, пожалуйста возможные решения такой задачки.
То есть проходит расчет атаки одной фигуры –выполняется анимация атаки этой фигуры, потом анимация получения урона фигурой противника – потом, происходит расчет атаки следующей фигуры.
Используйте корутины.
Весь ход игры можно поместить в один метод, назовем его GameFlow. Этот метод вызываем как корутину, внутри него содержится логика игры:
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
void Start()
{
   StartCoroutine(GameFlow());
}
 
IEnumerator GameFlow()
{
    while (true)
    {
        //ожидаем хода игрока A
        while(!isStepA)
            yield return null;
        //расчет фигур...
        //запуск анимации...
        //ждем окончания анимации 1 секунду
        yield return new WaitForSeconds(1);
 
        //ожидаем хода игрока B
        while(!isStepB)
            yield return null;
        //расчет фигур...
        //запуск анимации...
        //ждем окончания анимации 1 секунду
        yield return new WaitForSeconds(1);
    }
}
1
0 / 0 / 0
Регистрация: 15.04.2019
Сообщений: 6
24.11.2019, 11:23  [ТС]
благодарю
буду использовать корутины
только я не могу ждать окончания анимации - код расчета должен приостанавливаться на время анимации, после её окончания должен продолжиться (по events, который внутри анимации)
с yield не понимание у меня - как его можно использовать несколько раз в одной корутине, если он (yield) её перезапускает ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.11.2019, 11:23
Помогаю со студенческими работами здесь

Задержка выполнения кода скрипта
Как сделать что бы сообщение отправлялось через определенное время. Например через минуту-две после того как пользователь нажмет кнопку...

Задержка выполнения кода на несколько секунд
Здравствуйте. Как прервать выполнение кода на некоторое количество секунд? Ну например, вводит пользователь а и в, жмет кнопку, а...

Задержка окна консоли после выполнения кода
Есть код, который использует модули os, subprocess, вызывает cmd и пытается авторизоваться в сетевой папке с помощью системных команд...

Засечь время выполнения (в ms) определённого кода или части кода
Доброго времени суток всем. Хотелось бы поинтересоваться у знающих людей. Как можно засеч время выполнения(в ms) определённого кода...

Время выполнения кода
Имеется небольшой скриптик для получения сведений о времени выполнения PHP-кода: &lt;?php echo &quot;&lt;h2&gt;Тестирование...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru