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

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

22.11.2019, 14:04. Просмотров 1947. Ответов 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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.11.2019, 14:04
Ответы с готовыми решениями:

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

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

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

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

2
Эксперт .NETАвтор FAQ
9634 / 4749 / 1708
Регистрация: 11.01.2015
Сообщений: 5,926
Записей в блоге: 34
24.11.2019, 11:13 2
Лучший ответ Сообщение было отмечено 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  [ТС] 3
благодарю
буду использовать корутины
только я не могу ждать окончания анимации - код расчета должен приостанавливаться на время анимации, после её окончания должен продолжиться (по events, который внутри анимации)
с yield не понимание у меня - как его можно использовать несколько раз в одной корутине, если он (yield) её перезапускает ?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.11.2019, 11:23

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.