尝试修改 RGB 颜色时 Unity 冻结
Unity freezes when attempting to modify RGB colors
我试图随着时间的推移逐渐修改 Unity 渲染器组件的 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;
}
}
}
这是因为此方法中的 while
循环永远不会终止,因此调用它的 Update
永远不会完成。这会冻结您的游戏。
一个可能的解决方案是将此方法变成 Coroutine(文档的第一个示例与您的代码非常相似!)并在 while 循环的末尾放置一个 return yield null
:
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
语句的第一帧淡入黑色。如果 Unity 给您输入负数带来任何麻烦,您可能还必须将组件限制在 0f
-1f
之间。
我试图随着时间的推移逐渐修改 Unity 渲染器组件的 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;
}
}
}
这是因为此方法中的 while
循环永远不会终止,因此调用它的 Update
永远不会完成。这会冻结您的游戏。
一个可能的解决方案是将此方法变成 Coroutine(文档的第一个示例与您的代码非常相似!)并在 while 循环的末尾放置一个 return yield null
:
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
语句的第一帧淡入黑色。如果 Unity 给您输入负数带来任何麻烦,您可能还必须将组件限制在 0f
-1f
之间。