Страница 1 из 1

Скорость перемещение объекта вне зависимости от FPS

СообщениеДобавлено: 20 май 2021, 10:57
Bio
Всем привет!
Проект на смартфоне в 2D, необходимо что бы за строго ограниченное время (2 минуты) игровой объект поменял позицию конкретное число раз. При высоком FPS всё идёт гладко, если же FPS падает ниже 30, то объект не успевает за это время совершить нужное кол-во смен позиции.
Смена позиции заложена в корутину, которая запускается в Start(), потом идёт цикл пока не выйдет установленное время. Есть пересечение с функцией смены цвета объекта, которая меняет цвет в зависимости от количество пройденных позиций.
Как можно сделать что бы кол-во смен позиций всегда было одинаково вне зависимости от FPS?

Таймер отчёта времени:
Синтаксис:
Используется csharp
   
    DateTime timerEnd;
    TimeSpan delta;
    Text gameTimer;

    void FixedUpdate()
    {
        Timer();    
    }

 void Timer()
    {
        if (delta.TotalSeconds >= 0)
        {
            delta = timerEnd - DateTime.Now;
            gameTimer.text = $"{delta.Minutes} : {delta.Seconds}"; //вывод таймера на экран
        }
        if (delta.TotalSeconds <= 0)
        {
            playGame = false; // конец игры
        }
    }
 

Пробовал запускать через Time.fixedDeltaTime
Синтаксис:
Используется csharp
                StartCoroutine(FlowerRespawn(TTLFlower * Time.fixedDeltaTime * 50)); // float TTLFlower - изменяет значение в зависимости от количество пройденных позиций
 

Пробовал так же переделать под функцию которую запускал в FixedUpdate().
Возможно ли вообще технически, то что я описал?

Re: Скорость перемещение объекта вне зависимости от FPS

СообщениеДобавлено: 20 май 2021, 11:15
1max1
И где сам код перемещения? Считать время через шарповские классы плохая идея, в своё время я наступил на эти грабли в сборке под WebGL и потом использовал то, что предоставляет юнити в классе Time.

Re: Скорость перемещение объекта вне зависимости от FPS

СообщениеДобавлено: 20 май 2021, 11:26
Bio
Не хотел его скидывать, ибо он большой и страшный)
Синтаксис:
Используется csharp
    private IEnumerator FlowerRespawn(float timer)
    {
        if (playGame)
        {
            if (!flower.GetComponent<Image>().enabled) flower.GetComponent<Image>().enabled = true;

            int rand = UnityEngine.Random.Range(0, pointPosition.Length);
            flower.transform.position = pointPosition[rand].position;
            if (nowPos == rand)
            {
                rand = UnityEngine.Random.Range(0, pointPosition.Length);
                flower.transform.position = pointPosition[rand].position;
                yield return new WaitForSeconds(0f);
            }
            nowPos = rand;
            yield return new WaitForSeconds(timer * Time.fixedDeltaTime * 50);

            Invoke("ColorChange", 0f); //Смена цвета, стоит через Invoke, ибо была изначально потребность в задержке и разовом вызове
        }
    }
 

Re: Скорость перемещение объекта вне зависимости от FPS

СообщениеДобавлено: 20 май 2021, 12:11
Jarico
время в FixedUpdate считай, и используй Time.fixedDeltaTime

Re: Скорость перемещение объекта вне зависимости от FPS

СообщениеДобавлено: 20 май 2021, 12:47
Bio
Jarico писал(а):время в FixedUpdate считай, и используй Time.fixedDeltaTime

Помогло фиксировать постоянное кол-во перемещений при одинаковом FPS, если FPS падает, то и кол-во перемещений тоже падает...
Цель, что бы кол-во перемещений вообще не менялось не зависимо от FPS

Re: Скорость перемещение объекта вне зависимости от FPS

СообщениеДобавлено: 20 май 2021, 13:11
1max1
Что-то я цикла в твоей корутине не вижу, ты ее вызываешь 1 раз? Или как вообще это происходит? Что вообще происходит?! 8()

Re: Скорость перемещение объекта вне зависимости от FPS

СообщениеДобавлено: 20 май 2021, 13:20
Bio
1max1 писал(а):Что-то я цикла в твоей корутине не вижу, ты ее вызываешь 1 раз? Или как вообще это происходит? Что вообще происходит?! 8()

Корутина повторно вызывается в функции ColorChange(). Там много условий по смене цвета и скорости вызова корутины
пример:
Синтаксис:
Используется csharp
            if (idFlower == 1) //Там много таких id. Указывает на то при каком числительном менять цвет
            {
                GetComponent<Image>().sprite = sprits[0];

                StopCoroutine(FlowerRespawn(TTLFlower * Time.fixedDeltaTime * 50));

                StartCoroutine(FlowerRespawn(TTLFlower * Time.fixedDeltaTime * 50));
            }
 

и по сути создаётся цикл: смена позиции -> смена цвета -> смена позиции...

Re: Скорость перемещение объекта вне зависимости от FPS

СообщениеДобавлено: 20 май 2021, 13:34
TeslaGan
1. попробуйте https://docs.unity3d.com/ScriptReferenc ... ltime.html
2. а имеет ли смысл вообще в добавлении Time.fixedDeltaTime? WaitForSeconds задает задержку. если у вас случился физ лаг, то следующий кадр после лага фикседДельта будет больше необходимого и у вас случится большая задержка в короутине.
3. смутили 2 строчки
Синтаксис:
Используется csharp
StartCoroutine(FlowerRespawn(TTLFlower * Time.fixedDeltaTime * 50));


Синтаксис:
Используется csharp
private IEnumerator FlowerRespawn(float timer)
{
 ....
yield return new WaitForSeconds(timer * Time.fixedDeltaTime * 50);

получается в вашей короутине вы 2 раза умножаете на * Time.fixedDeltaTime * 50?

Re: Скорость перемещение объекта вне зависимости от FPS

СообщениеДобавлено: 20 май 2021, 13:35
1max1
Мде...
К слову, вот это не останавливает корутину:
StopCoroutine(FlowerRespawn(TTLFlower * Time.fixedDeltaTime * 50));

Это вообще константа бесполезная:
Time.fixedDeltaTime * 50

Читай справку про StopCoroutine, там есть примеры как нужно это делать.
В моем понимании у тебя должно быть что-то типа такого:
Синтаксис:
Используется csharp
    IEnumerator c_Change(Transform target, float time, int count, Vector3[] positions)
    {
        float delay = time / count;

        for (int i = 0; i < count; ++i)
        {
            int randomIndex = UnityEngine.Random.Range(0, positions.Length);

            target.position = positions[randomIndex];

            // Где-то тут можно и цвет поменять

            yield return new WaitForSeconds(delay);
        }
    }

Эту корутину ты вызываешь 1 раз без всяких остановок, перезапусков и так далее. Просто пример того, как делал бы я.

Re: Скорость перемещение объекта вне зависимости от FPS

СообщениеДобавлено: 20 май 2021, 14:09
Jarico
Bio писал(а):
Jarico писал(а):время в FixedUpdate считай, и используй Time.fixedDeltaTime

Помогло фиксировать постоянное кол-во перемещений при одинаковом FPS, если FPS падает, то и кол-во перемещений тоже падает...
Цель, что бы кол-во перемещений вообще не менялось не зависимо от FPS


Движок однопоточный и зависим от времени кадра, поэтому цель недостигаема... Оптимизируй и ограничивай фпс до стабильного