ПрограммированиеФорумОбщее

Unity: Двигание объектов корутинами[Решено]

#0
13:21, 27 мар 2015

Привет.

Двигаю картинки корутинами в юньке, и блин подтормаживает движение. Не пойму почему. Может ли это быть из-за того, что я двигаю корутинами, а не в Update()-функции ?

В чём еще может быть причина тормозов ?

P.S. На экране движется только одна картинка.

Заранее благодарю.

Решение

#1
13:50, 27 мар 2015

Нет, дело не в корутинах.

#2
14:11, 27 мар 2015

Как-то раз столкнулся с подобным необъяснимым подтормаживанием, которое оказалось следствием того, что сцена состояла из нескольких независимых кусков, отдаленных друг от друга на несколько тысяч world units. После сокращения этого расстояния до тысячи проблема исчезла.

#3
14:30, 27 мар 2015

как часто корутина срабатывает? Какой код в корутине? Повешен ли на объекта колайдер и риджидбоди?

#4
14:48, 27 мар 2015

ZeebaEata
У меня такого нет.

Phoenics
Один раз запускаюю. Проверял вроде что запускается единожды

код корутины (из AutoMotion plugin)

  public static IEnumerator MoveTo(this Transform transform, Vector3 target, float duration, Easer ease)
  {
    float elapsed = 0;
    var start = transform.localPosition;
    var range = target - start;
    while (elapsed < duration)
    {
      elapsed = Mathf.MoveTowards(elapsed, duration, Time.deltaTime);
      transform.localPosition = start + range * ease(elapsed / duration);
      yield return null;
    }
    transform.localPosition = target;
  }

Код запуска корутины:

    StartCoroutine(AnimateCardAppearance( () => { } );

    IEnumerator AnimateCardAppearance(UnityAction onAnimationFinished)
    {
        counter++;
        Debug.Log("D:"+counter);
        DrawnCard.GetComponent<PlayerHandCardControl>().enabled = false;
        yield return StartCoroutine(DrawnCard.transform.MoveTo(Vector3.zero, 0.5f));
        yield return new WaitForSeconds(0.5f);
        onAnimationFinished.Invoke();

    }
#5
15:37, 27 мар 2015

Gladiator
> while (...)
> {
> ...
> [b]yield return null;[/b]
> }
Попробуй yield return new WaitForFixedUpdate();

#6
19:22, 27 мар 2015

Никус
> Попробуй yield return new WaitForFixedUpdate();
надо WaitForEndOfFrame, раз уж в коде учитывается Time.deltaTime, т.е. обновление позиции будет каждый кадр. Если же нужно обновлять позицию с каждым апдейтом физики, тогда уже используется WaitForFixedUpdate и Time.fixedDeltaTime

#7
19:27, 27 мар 2015

Корутина у тебя каждый кадр апдейтится, и ты так и не написал привязан ли к объекту который ты двигаешь колайдер и/или риджидбоди, если риджидбоди привязан то стаит ли там флаг кинематик?
Если корутину не запускать то тормозов нет?

#8
21:34, 27 мар 2015

Phoenics
Нет никакого коллайдер. Есть просто Image(который от нового UI). Просто картинка.

> Если корутину не запускать то тормозов нет?
Мне сложно сказать, потому что ничего не двигается.. По профайлеру видно что есть небольшие всплески возможно это во время подлагивания..

#9
12:57, 29 мар 2015

Нашёл решение:

Тут или баг или что, но в общем это из-за DirectX. Запускаю Юнити через: Unity.exe -force-opengl подлагивания прекращаются

ПрограммированиеФорумОбщее

Тема в архиве.