Временная задержка

Программирование на Юнити.

Временная задержка

Сообщение Nortol 20 янв 2011, 17:26

Какой командой в JS можно создать временную задержку, например прошло 10 секунт - произошла одна функция , прошло ещо 10 секунд произошла другая функция
Если не скриптом поможете? то какое условие записать в скрипте?
Nortol
UNец
 
Сообщения: 14
Зарегистрирован: 20 янв 2011, 16:36

Re: Временная задержка

Сообщение Zaicheg 20 янв 2011, 17:35

Дьяченко Роман
e-mail: _zaicheg.reg@gmail.com
skype: zaicheg12
vkontakte: _vk.com/zaichegq
Работа: _wie3.com _www.sanviz.com
Аватара пользователя
Zaicheg
Адепт
 
Сообщения: 3024
Зарегистрирован: 19 июн 2009, 15:12
Откуда: Череповец

Re: Временная задержка

Сообщение Paul Siberdt 20 янв 2011, 17:38

Прочитайте справку по yield

print("узпел");
yield WaitForSeconds( 1.0 );
print("апаздал");
Аватара пользователя
Paul Siberdt
Адепт
 
Сообщения: 5317
Зарегистрирован: 20 июн 2009, 21:24
Откуда: Moscow, Russia
Skype: siberdt
  • Сайт

Re: Временная задержка

Сообщение seaman 02 фев 2011, 09:45

Сорри, что возвращаюсь к этому вопросу, но что-то до меня не доходит работа с корутинами :(
Простейший вопрос - нужно запускать некую функцию раз в 10 секунд.
Функция:
Синтаксис:
Используется csharp
    private IEnumerator Foo()
    {
        yield return new WaitForSeconds(10);
        //Make all "нечто"
    }


Здесь она ждет 10 секунд, потом делает "нечто".
Если ее вызывать из Update, то она будет вызываться каждый кадр и замирать на 10 секунд. Что будет через 10 секунд? Я вижу три варианта.
1. Каждый кадр начнет выполняться "нечто"?
2. Или все же после первого вызова дальнейшие вызовы ни к чему не приведут пока не выполнится один раз "нечто"? Т.е. то, что я хочу - выполнение "нечто" раз в 10 секунд.
3. Или каждый последующий вызов сбрасывает внутренний счетчик секунд и "нечто" вообще никогда не выполнится?
Ну и главное - как все же сделать запуск функции раз в 10 секунд?
Пока я сделал так:
Синтаксис:
Используется csharp
private bool _make = true;
   void Update()
   {
       if(_make)
           Foo();
   }

    private IEnumerator Foo()
    {
        _make = false;
        yield return new WaitForSeconds(10);
        //Make all "нечто"
        _make = true;
    }

Так вроде двусмысленности нет. Вызывается Foo, сразу делается _make = false, т.о. в Update она больше вызываться не будет. Через 10 секунд делается то что нужно и _make = true. Т.о. в следующем кадре Foo снова вызовется из Update.
Но мне это не нравится. Хотелось бы разобраться в Корутинах. Может можно без проверок в Update?
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Временная задержка

Сообщение DbIMok 02 фев 2011, 10:26

Синтаксис:
Используется csharp
    private IEnumerator Foo()
    {
        while (needRun)
        {
                yield return new WaitForSeconds(10);
                //Make all "нечто"
        }
    }

и запустить один раз
правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.7k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

Re: Временная задержка

Сообщение seaman 02 фев 2011, 10:43

О как!
Спасибо.

А все же какой из трех вариантов верен?
1. При каждом вызове корутины образуется новый счетчик. Следовательно при вызове ее из Update все что после yeld будет запускаться каждый кадр.
2. Счетчик образуется один раз и все последующие вызовы корутины просто игнорируются пока не закончится счетчик yeld. Следовательно при вызове из Update корутина будет выполняться раз в столько време, сколько задано в yeld.
3. Счетчик образуется один раз, но при каждом вызове корутины он сбрасывается в исходное состояние. Следовательно при вызове из Update все что после yeld никогда не выполнится.

В общем исследовал я это дело. Получается вариант 1 с некоторыми глюками.
Синтаксис:
Используется csharp
     // Update is called once per frame
     void Update ()
    {
        Debug.Log("BEFORE= " + Time.frameCount);
        StartCoroutine("Foo");
        Debug.Log("AFTER= " + Time.frameCount);
        }

    private IEnumerator Foo()
    {
        Debug.Log("ENTER_IN_COR= " + Time.frameCount);
        yield return new WaitForSeconds(1);
        Debug.Log("AFTER_YELD_IN_COR= " + Time.frameCount);
    }


В логе:
BEFORE= 69
ENTER_IN_COR= 69
AFTER= 69
AFTER_YELD_IN_COR= 69
AFTER_YELD_IN_COR= 69
BEFORE= 70
AFTER= 70
AFTER_YELD_IN_COR= 70
BEFORE= 71

Т.е. вызывается каждый кадр и поначалу то один раз, то два. Потом вроде устаканивается и вызывается один раз каждый кадр.

Получается что корутину можно вызывать из нескольких мест независимо друг от друга...
Последний раз редактировалось seaman 02 фев 2011, 11:29, всего редактировалось 1 раз.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Временная задержка

Сообщение DbIMok 02 фев 2011, 11:23

просто прочитайте порядок выполнения
правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.7k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

Re: Временная задержка

Сообщение seaman 02 фев 2011, 11:31

Спасибо. Очень полезная ссылка.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Временная задержка

Сообщение DbIMok 02 фев 2011, 11:57

и все это есть в справке прямо у вас на HDD в Unity Manual > Advanced > Execution Order
там же рядом почитайте про корутины. это буквально несколько страничек с примерами
тогда перестанете запускать корутины каждый кадр.
откройте для себя сообщения, чтобы забыть про Update
правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.7k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

Re: Временная задержка

Сообщение 666marat666 02 фев 2011, 22:32

А ещё в некоторых случаях конструкцией:
Синтаксис:
Используется javascript
while(true)
{
//а здесь ваша функция
yield WaitForSeconds(0.2)
}
 


можно заменить функцию Update(), и этим повысить производительность :)
Изображение

->Невозможно решить проблему на том же уровне, на котором она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.<-
Альберт Эйнштейн
Аватара пользователя
666marat666
UNIт
 
Сообщения: 139
Зарегистрирован: 04 авг 2010, 22:40
Откуда: Украина


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8