Unity зависает при попытке изменить цвета RGB - PullRequest
0 голосов
/ 07 ноября 2018

Я пытаюсь постепенно изменять значения RGB Color32 компонента Unity Renderer, но всякий раз, когда я играю в игру в Unity, она просто останавливает программу, и мне приходится закрываться. Я уверен, что это из-за того, как я пытаюсь изменить это, но я не знаю, где я ошибаюсь. Любая помощь будет принята с благодарностью. Спасибо.

void degradeGradually(Renderer ren){
    float time = Time.time; 
    Color32 col;
    while(((Color32)ren.material.color).r > 89f){
        if (Time.time - time > .025f) {
            time = Time.time;
            col = new Color32 ((byte)(((Color32)ren.material.color).r - 1f), (byte)(((Color32)ren.material.color).g - 1f), (byte)(((Color32)ren.material.color).b - 1f), 255);
            ren.material.color = col; 
        }
    }
}

1 Ответ

0 голосов
/ 07 ноября 2018

Это потому, что цикл while в этом методе никогда не завершается и, следовательно, Update, который его вызывает, никогда не завершается. Это замораживает вашу игру.

Одним из возможных решений является превращение этого метода в сопрограмму (первый пример документации удивительно похож на ваш код!) И добавление return yield null в конце цикла while:

IEnumerator degradeGradually(Renderer ren){
    float time = Time.time; 
    Color32 col;
    while(((Color32)ren.material.color).r > 89f){
        if (Time.time - time > .025f) {
            time = Time.time;
            col = new Color32 ((byte)(((Color32)ren.material.color).r - 1f), (byte)(((Color32)ren.material.color).g - 1f), (byte)(((Color32)ren.material.color).b - 1f), 255);
            ren.material.color = col; 
        }

        yield return null;
    }
}

А потом, где вы это называете,

 // Instead of degradeGradually(r);
 StartCoroutine(degradeGradually(r));

И если вам нужно что-то сделать непосредственно после того, как происходит деградация, вы можете добавить это в конец degradeGradually.

            ...
            ren.material.color = col; 
        }

        yield return null;
    }

    DoStuffAfterDegrade();
}

Кроме того, значения цветовых компонентов варьируются от 0f до 1f, поэтому вы захотите уменьшить их на величину, меньшую 1f каждый раз. Как уже было написано, вы будете переходить в черный цвет на первом кадре, который вы получите внутри оператора if. Вам также может потребоваться зажать компоненты между 0f - 1f, если Unity не даст вам никаких проблем с вводом отрицательных чисел.

...