IEnumerator While l oop: Mathf.Lerp, пока игра продолжается - PullRequest
0 голосов
/ 29 февраля 2020

Я пытаюсь выскочить из набора из 2 значений плавно в течение 2 секунд, а затем сделать обратное в течение 2 секунд. Я пытался использовать Mathf.Lerp или Smoothstep, однако кажется, что значение изменяется только один раз, а затем не достигает остальной части метода IEnumerator. Моя проблема с реализацией IEnumerator или в Lerp?

void OnCollisionEnter2D(Collision2D other)
    {
        if (other.gameObject.CompareTag("Player")) {
            StartCoroutine(DistortScreenFX());
            puh.gm.score += 500;
            SoundManager.PlaySound("lightspeed1");
            Destroy(gameObject);
        }

        if (other.gameObject.CompareTag("Asteroid")) {
            Physics2D.IgnoreCollision(other.gameObject.GetComponent<Collider2D>(), GetComponent<Collider2D>());
        }

        if (other.gameObject.CompareTag("Ability")) {
            Physics2D.IgnoreCollision(other.gameObject.GetComponent<Collider2D>(), GetComponent<Collider2D>());
        }
    }


        IEnumerator DistortScreenFX() {

        ChromaticAberration abbFX; //ramp then reset to 0
        LensDistortion lensFX; //ramp then reset to 0

        pp.profile.TryGetSettings(out abbFX);
        pp.profile.TryGetSettings(out lensFX);

        var startTime = Time.realtimeSinceStartup;
        float duration = 2.0f;
        float t = 0;
        while (Time.realtimeSinceStartup < startTime + duration) {
            t = (Time.realtimeSinceStartup - startTime) / duration;
            abbFX.intensity.value = Mathf.SmoothStep(0.0f, 1.0f, t);
            lensFX.intensity.value = Mathf.SmoothStep(-25.0f, -100.0f, t);

            yield return null;
        }

        startTime = Time.realtimeSinceStartup;
        while (Time.realtimeSinceStartup < startTime + duration) {
            t = (Time.realtimeSinceStartup - startTime) / duration;
            abbFX.intensity.value = Mathf.SmoothStep(1.0f, 0.0f, t);
            lensFX.intensity.value = Mathf.SmoothStep(-100.0f, -25.0f, t);

            yield return null;
        }

    }

Ответы [ 2 ]

2 голосов
/ 29 февраля 2020

Вы уничтожаете игровой объект, запустив сопрограмму. Поместите Destroy(gameObject); в конце сопрограммы (после последнего yield return null).

0 голосов
/ 29 февраля 2020

Если вы запускаете эту функцию с помощью StartCoroutine (DistortScreenFX ()), то, скорее всего, функция выдает исключение, которое вызывает ее завершение. Проверьте журналы и посмотрите, есть ли ошибка.

Если вы не используете StartCoroutine для его вызова, значит, вы ошиблись.

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