Гладкие, быстрые сопрограммы? - PullRequest
0 голосов
/ 17 января 2019

Итак, в моей игре куча Coroutines работает / работает нормально.

Однако, один из них для измерителя мощности, и вот проблема ...

Вы нажимаете кнопку, измеритель мощности использует сопрограмму, чтобы начать заполнять измеритель мощности. (представлен шириной красной панели)

Цель состоит в том, чтобы заставить измеритель заполняться достаточно быстро, чтобы вы не могли просто получить «полную мощность» каждый раз. Тем не менее, он также должен быть гладким и хорошо выглядеть.

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

Это работает, но это вызывает 2 проблемы.

  1. Это не выглядит гладко. (Выглядит неряшливо и нервно)
  2. Он пропускает целую кучу ценностей / возможностей. (Например, планка должна увеличиться на единицу «50», чтобы сделать ее достаточно быстрой, чтобы быть сложной. Но это глупо, потому что это дает только 12 возможностей при остановке счетчика. А их может быть до 600!)

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

Спасибо, Ben

Вот мой код:

public static IEnumerator StartPitchMeter(Player.Guy guy, float duration)
{

    var dur = 0.01f;

    do
    {
        yield return new WaitForSeconds(dur);

        PlayerControls.PitchMeter += 50f;

        if (PlayerControls.PitchMeter > 600) PlayerControls.PitchMeter = 0f;

        PlayerControls.pitchMeter.sizeDelta = new Vector2(PlayerControls.PitchMeter, 50);

    } while (!PlayerControls.stopPitch);

}

1 Ответ

0 голосов
/ 17 января 2019

Если вы используете сопрограмму для обновления чего-либо в графических целях, вы хотите обновлять каждый доступный кадр рендеринга (так же, как часто вызываются методы Update). Таким образом, вместо ожидания установленного количества времени, используйте yield return null, а затем переместите счетчик в соответствии с Time.deltaTime, время, прошедшее с последнего кадра в секундах. В этом случае вы можете умножить Time.deltaTime на количество единиц в секунду, которое вы хотите заполнить счетчиком:

public static IEnumerator StartPitchMeter(Player.Guy guy, float duration)
{

    do
    {
        yield return null;

        // Fill 50 units per second.
        float fillThisFrame = Time.deltaTime * 50f;

        PlayerControls.PitchMeter += fillThisFrame;

        if (PlayerControls.PitchMeter > 600) PlayerControls.PitchMeter = 0f;


        PlayerControls.pitchMeter.sizeDelta = new Vector2(PlayerControls.PitchMeter, 50);
        // Not sure what the 50 is doing here so it might be this instead:
        // PlayerControls.pitchMeter.sizeDelta = new Vector2(PlayerControls.PitchMeter, fillThisFrame);

    } while (!PlayerControls.stopPitch);

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...