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

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

22.11.2019, 14:04. Показов 5484. Ответов 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
10427 / 5157 / 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера 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. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru