Unity颜色扩展方法不影响颜色

时间:2014-02-13 22:21:44

标签: unity3d extension-methods

我想更改现有颜色的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值。谁能解释为什么这可能不起作用?

2 个答案:

答案 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

因此,编译器会警告您对副本进行不必要的更改。

看看这个问题: Cannot modify the return value error c#