Счётчик

Общие вопросы о Unity3D

Счётчик

Сообщение Rulz009 26 май 2017, 13:23

В нижеприведенном коде нужно выполнять некоторое арифметическое действие через каждые 10 секунд. Причем выполнение этого действия должно происходить в методе OnTriggerStay(). Каким образом можно реализовать возможность такой задержки на 10 секунд? Спасибо.
Синтаксис:
Используется csharp
...
public float health = 6f;
...
void OnTriggerStay(Collision col){
health--;
//здесь должна быть задержка на 10 секунд перед тем как снова выполнить команду health--
}
 
Rulz009
UNец
 
Сообщения: 20
Зарегистрирован: 17 май 2017, 16:56

Re: Счётчик

Сообщение Valentinus 26 май 2017, 14:05

выделите вычисления в отдельную функцию и запускайте ее через Invoke или InvokeRepeat
другое мое творчество: samlib.ru/u/us_w/
Аватара пользователя
Valentinus
Старожил
 
Сообщения: 889
Зарегистрирован: 24 мар 2017, 18:33

Re: Счётчик

Сообщение waruiyume 26 май 2017, 14:18

Синтаксис:
  1. timer = 0; 
  2. TriggerStay() 
  3.     timer+=deltaTime; 
  4.     if(timer>10) 
  5.     { 
  6.         timer=0; 
  7.         DoSomething(); 
  8.     } 
  9. }  
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Счётчик

Сообщение seaman 26 май 2017, 15:21

Так не пойдет?

Синтаксис:
Используется csharp
bool imInTrigger;
Coroutine counterCoroutine;

int counter;

void OnTriggerEnter(Collision col)
{
   imIntrigger = true;
   counter = 0;
   counter = StartCoroutine(Counter());
}
void OnTriggerExit(Collision col)
{
   imIntrigger = true;
   StopCoroutine(counterCoroutine);
}

IEnumerator Counter()
{
   counter++;
   yield return new WaitOfSecond(10f);
}
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Счётчик

Сообщение Valentinus 26 май 2017, 15:33

seaman писал(а):Так не пойдет?



во-первых в OnTriggerExit вы наверное хотели написать imIntrigger = false; ?
во-вторых, в данном коде корутина сразу инкрементирует counter, потом подождет 10 сек и завершит работу.

если вы хотите чтоб она крутилась - сделайте внутри корутины
while (imIntrigger )
{
counter++;
yield return new WaitOfSecond(10f);
}
(и тогда StopCoroutine не надо делать)


вообще, для вашего случая больше подходит Invoke и InvokeRepeat
корутины предназначены для разбиения одного длительного процесса на несколько этапов (например когда создается тысяча gameobject, или вычисляется сложный алгоритм).
а если надо периодически выполнять какую-то процедуру, не занимающую процессор надолго, то для этого Invoke и InvokeRepeat
другое мое творчество: samlib.ru/u/us_w/
Аватара пользователя
Valentinus
Старожил
 
Сообщения: 889
Зарегистрирован: 24 мар 2017, 18:33

Re: Счётчик

Сообщение seaman 26 май 2017, 16:26

Ну да, торопился. Но принцип понятен.
А вот насчет InvokeRepeating - где Вы такое вычитали? Чем она таким лучше корутины? Тем что ей нужно название метода передавать строкой? Не каждая тулза для рефакторинга найдет такой "метод". Т.е. переименовать его уже не так просто. Ну и еще что-то аналогичное может возникнуть в процессе.
Вообще имхо - использовать строки-имена методов, класов и т.п - плохо. Аналогично например GetComponent(string type); - плохо.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Счётчик

Сообщение Valentinus 26 май 2017, 16:42

seaman писал(а):Ну да, торопился. Но принцип понятен.
А вот насчет InvokeRepeating - где Вы такое вычитали? Чем она таким лучше корутины? Тем что ей нужно название метода передавать строкой? Не каждая тулза для рефакторинга найдет такой "метод". Т.е. переименовать его уже не так просто. Ну и еще что-то аналогичное может возникнуть в процессе.
Вообще имхо - использовать строки-имена методов, класов и т.п - плохо. Аналогично например GetComponent(string type); - плохо.


не лучше и не хуже. просто для каждой вещи свое назначение, для которого она подходит оптимально. обухом топора тоже можно забивать гвозди, но лучше молотком.
с инвоками код был бы как минимум короче, понятней и меньше шансов допустить ошибку.
сравните два куска
Синтаксис:
Используется csharp
bool imInTrigger;
Coroutine counterCoroutine;

int counter;

void OnTriggerEnter(Collision col)
{
   imIntrigger = true;
   counter = 0;
   counter = StartCoroutine(Counter());
}
void OnTriggerExit(Collision col)
{
   imIntrigger = false; // или   StopCoroutine(counterCoroutine);
}

IEnumerator Counter()
{
while(imIntrigger)
{
   counter++;
   yield return new WaitOfSecond(10f);
}
}
 

и
Синтаксис:
Используется csharp
int counter;

void OnTriggerEnter(Collision col)
{
   counter = 0;
   InvokeRepeat("Counter", 10,10);
}
void OnTriggerExit(Collision col)
{
   CancelInvoke("Counter");
}

void  Counter()
{
   counter++;
}
 

какой понятнее и быстрее написать?

а в Юнити без строк-имен вы не обойдетесь никак. переменные в аниматор-контроллере и анимациях, названия event`ов, которые прописываются в настройках анимаций, и т.п.
се ля ви.
что касается именно рефакторинга- я думаю топикстартер еще не скоро озадачится этим. :)
другое мое творчество: samlib.ru/u/us_w/
Аватара пользователя
Valentinus
Старожил
 
Сообщения: 889
Зарегистрирован: 24 мар 2017, 18:33

Re: Счётчик

Сообщение Cr0c 27 май 2017, 19:38

Valentinus писал(а):а в Юнити без строк-имен вы не обойдетесь никак.

В шейдерах можно вместо стрингов хеши использовать. В аниматоре такого нет?
Аватара пользователя
Cr0c
Адепт
 
Сообщения: 3035
Зарегистрирован: 19 июн 2015, 13:50
Skype: cr0c81

Re: Счётчик

Сообщение Valentinus 27 май 2017, 20:16

Cr0c писал(а):
В шейдерах можно вместо стрингов хеши использовать. В аниматоре такого нет?
не знаю ответа. посмотрите в справке.
другое мое творчество: samlib.ru/u/us_w/
Аватара пользователя
Valentinus
Старожил
 
Сообщения: 889
Зарегистрирован: 24 мар 2017, 18:33

Re: Счётчик

Сообщение seaman 27 май 2017, 21:23

В аниматоре такого нет?

Есть. Но хеш же сначала нужно из строки получать все равно.
Но это все же не то что я имел в виду.
Строковые переменные - нормальное явление. Ключи строки в словаре похуже, но тоже нормально. А вот вместо типа использовать его имя или вместо метода использовать имя метода - гораздо хуже.
какой понятнее и быстрее написать?

Первый понятнее. Второй быстрее.
Да, в Юнити много вещей не приспособлены для того же рефакторинга. События могут пропасть, функции в onClick, кто-то может взять и переименовать параметр в Аниматоре. Даже просто компоненты, накинутые на объект пропадают. Но зачем же себе еще ухудшать жизнь используя строковые названия методов и типов.
Вот, например обфускация. Обфускатор может стандартные методы Юнити опознать и не обфусцировать. Но откуда он узнает, что Вы имя этого метода строкой где то написали, или в Event-ах использовали? Придется обфускатору явно это указать

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

Re: Счётчик

Сообщение Valentinus 27 май 2017, 22:27

seaman писал(а):
Первый понятнее.

:))
другое мое творчество: samlib.ru/u/us_w/
Аватара пользователя
Valentinus
Старожил
 
Сообщения: 889
Зарегистрирован: 24 мар 2017, 18:33


Вернуться в Общие вопросы

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

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