Coroutines...в попытке понять

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

Coroutines...в попытке понять

Сообщение RefractoR 23 мар 2010, 15:25

Пытаюсь научиться работать с подпрограммами в юнити. Решил начать с простенькой функции, которая двигает объект вверх, затем возвращает на исходную позицию (мне это как раз для анимации приземления в камере от 1 лица надо). Написал вот такой кодик для теста:
Синтаксис:
Используется csharp
 using UnityEngine;
using System.Collections;

public class returnTest : MonoBehaviour {
       
        float val;
        bool animFinal = true;

        void Update () {
               
                if (Input.GetKeyDown("c")) animFinal = false;
               
                if (!animFinal) {
                       
                        StartCoroutine(sinAnim(2.5f, 5.0f));
                        animFinal = true;
                }
               
                print(val);
        }
       
        IEnumerator sinAnim (float amp, float speed){
               
                while (val > -0.9985f * amp){
                        val = Mathf.Sin(Time.time * speed) * amp;
                        transform.position += Vector3.up * val * Time.deltaTime;
                        yield return null;
                }
                val = 0.0f;
        }
}


Но поведение объекта весьма странное наблюдается: то дергается вниз вместо верха, на исходную не возвращается, двигается все выше и выше после каждого нового вызова подпрограммы.
Очень надеюсь на Вашу помощь
З.Ы Был бы очень признателен за разъяснение основных принципов работы подпрограмм..ну и вообще всего, что надо о них знать) (хелп курил, но не вкуривается чет)
RefractoR
UNIт
 
Сообщения: 50
Зарегистрирован: 05 ноя 2009, 16:31
Откуда: Краснодар
  • ICQ

Re: Coroutines...в попытке понять

Сообщение ffinder 23 мар 2010, 22:07

RefractoR писал(а):Пытаюсь научиться работать с подпрограммами в юнити.
...
Но поведение объекта весьма странное наблюдается: то дергается вниз вместо верха, на исходную не возвращается, двигается все выше и выше после каждого нового вызова подпрограммы.


coroutine это сопрограмма, оно же микротред, оно же легковесный поток (ну, почти)
Ваша ошибка похоже в том, что вы каждый Update запускаете еще одну корутину.
Проведу аналогию с потоком - его запускают, и дальше он продолжает выполнение независимо от основного потока.
Так как вы хотите анимировать объект, лучшее решение - дожидаться конца кадра при каждой итерации цикла с помощью yield return WaitForEndOfFrame
ffinder
UNITрон
 
Сообщения: 192
Зарегистрирован: 26 мар 2009, 17:35
  • Сайт

Re: Coroutines...в попытке понять

Сообщение gnoblin 23 мар 2010, 23:15

1) Он запускает одну и ту же корутину с самого начала
2) Корутина работает в этом же потоке...
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

Re: Coroutines...в попытке понять

Сообщение RefractoR 24 мар 2010, 21:00

gnoblin писал(а):1) Он запускает одну и ту же корутину с самого начала2) Корутина работает в этом же потоке...

Приведите пример, как это правильно делать (в смысле, как вообще лучше написать код для решения такой задачи)
RefractoR
UNIт
 
Сообщения: 50
Зарегистрирован: 05 ноя 2009, 16:31
Откуда: Краснодар
  • ICQ

Re: Coroutines...в попытке понять

Сообщение andoriyu 27 мар 2010, 09:19

Самое простое это ввести проверку на то, что корутина уже запущена. делаем булевую переменную проверяем если она false то запускаем корутину, в корутине сразу же меняет значение на true и выполняем действия, когда выполнили меняет обратно на false. Я с этими орутинами замучился у меня в ней данные на сервер шлтся получилось так, что каждый фреим посылается новый пакет, сервак от такого DoS умирал быстро :)
andoriyu
UNец
 
Сообщения: 30
Зарегистрирован: 10 мар 2010, 10:00

Re: Coroutines...в попытке понять

Сообщение RefractoR 27 мар 2010, 18:11

да, я переделал на реакцию через бул, но глюки с движением остаются..почему, не могу понять (двигаю так же, как и в первоначальном коде) :-?
RefractoR
UNIт
 
Сообщения: 50
Зарегистрирован: 05 ноя 2009, 16:31
Откуда: Краснодар
  • ICQ

Re: Coroutines...в попытке понять

Сообщение Ilya Smirnov 28 апр 2010, 10:25

Почитать о корутинах можно http://blog.equals-equals.com/?p=8. Хорошая статья.
Аватара пользователя
Ilya Smirnov
UNец
 
Сообщения: 8
Зарегистрирован: 24 мар 2010, 09:11
Откуда: Arrived from Flash camp

Re: Coroutines...в попытке понять

Сообщение megafanat 09 авг 2010, 12:20

Еще один вопрос по той же теме. В документации и разных статьях coroutines освещаются весьма кратко. В результате их изучения у меня сложилось некоторое видение, того как это работает.

Пожалуйста поправьте меня если я ошибаюсь или подтвердите, что так оно и есть.

  1. Корутина представляет собой нечто вроде генератора из Python:
    http://ru.wikipedia.org/wiki/Python#.D0.93.D0.B5.D0.BD.D0.B5.D1.80.D0.B0.D1.82.D0.BE.D1.80.D1.8B
  2. Где-то в программе видимо есть менеджер корутин, который раз в кадр вызывает их все по одному разу.
  3. Функция StartCoroutine добавляет корутину к этому менеджеру.

Следствия:
  1. Корутину достаточно один раз запустить и дальше о ней забыть. Она будет автоматически вызываться менеджером
  2. Команда yield return 0; означает "остановить выполнение до следующего кадра."
megafanat
UNец
 
Сообщения: 23
Зарегистрирован: 26 май 2010, 12:26

Re: Coroutines...в попытке понять

Сообщение Paul Siberdt 09 авг 2010, 12:39

Коротина не будет сама никем повторно вызываться, если Вы ей не прикажете этого.

Приказать можно, например, внутри коротины в while цикле:

while (true) {
do something
wait some time
}
Аватара пользователя
Paul Siberdt
Адепт
 
Сообщения: 5317
Зарегистрирован: 20 июн 2009, 21:24
Откуда: Moscow, Russia
Skype: siberdt
  • Сайт


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

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

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


cron