我想更改现有颜色的Alpha值。但是,我无法直接编辑颜色。
当我尝试这样的事情时:
gui.color.a = 0;
我收到以下错误:
错误:无法修改'UnityEngine.GUITexture.color'的返回值 因为它不是变量。
但如果我复制变量,我可以编辑alpha值。
Color tempColor = gui.color;
tempColor .a = .25f;
gui.color = tmpclr;
这是为什么?为什么Color的新实例不会抛出相同的错误?
另外,我认为因为我必须经常这样做,所以我会写一些像这样的扩展方法:
private static Color tempColor;
public static void SetAlpha(this Color color, float alpha)
{
tempColor = color;
tempColor.a = alpha;
color = tempColor;
}
但令我惊讶的是这个编译但是根本没有改变alpha值。谁能解释为什么这可能不起作用?
答案 0 :(得分:3)
在C#中,结构是passed by value。
当您获得gui.color
时,您将获得GUITexture
颜色的副本;对副本所做的更改不会改变原件。
以下不起作用,因为您正在修改和丢弃副本:
gui.color.a = 0;
以下工作正常,因为您正在获取副本,修改副本并将其传回:
Color tempColor = gui.color;
tempColor.a = .25f;
gui.color = tmpclr;
Color
的扩展方法由于同样的原因失败:将在副本上调用扩展方法,而不是原始方法。您可以为GUITexture
编写扩展方法,而不是:
public static void SetAlpha(this GUITexture self, float alpha) {
Color tempColor = self.color;
tempColor.a = alpha;
self.color = tempColor;
}
答案 1 :(得分:0)
您收到错误消息,因为通过使用c#作为脚本语言,您将获得一个结构作为颜色属性。这意味着您将获得颜色变量的副本:
gui.color // this is a struct and also a copy of the original color attribute
因此,编译器会警告您对副本进行不必要的更改。