尝试修改RGB颜色时Unity冻结

时间:2018-11-07 16:06:38

标签: c# unity3d renderer gameobject

我试图随着时间的推移逐渐修改Unity Renderer组件的Color32 RGB值,但是每当我在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 :(得分:3)

这是因为此方法中的while循环永远不会终止,因此调用它的Update永远不会完成。这会冻结您的游戏。

一个可能的解决方案是将此方法转换为Coroutine(文档的第一个示例与您的代码非常相似!),并将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();
}

此外,颜色分量的值范围从0f1f,因此您每次都希望将其减小小于1f的值。如所写,在if语句中进入的第一帧将变为黑色。如果Unity给您输入负数带来任何麻烦,您可能还必须将组件限制在0f-1f之间。