2014-02-13 108 views
1

我想更改現有顏色的Alpha值。但是,我無法直接編輯顏色。Unity顏色擴展方法不影響顏色

當我嘗試這樣的事:

gui.color.a = 0; 

我得到以下錯誤:

Error: Cannot modify the return value of 'UnityEngine.GUITexture.color' because it is not a variable.

但是,如果我複製變量,我能夠編輯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值。任何人都可以解釋爲什麼這可能不工作?

回答

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; 
} 
0

你得到錯誤信息,因爲通過使用C#作爲您得到一個結構作爲顏色屬性的腳本語言。這意味着你得到的顏色變量的副本:

gui.color // this is a struct and also a copy of the original color attribute 

因此,編譯器警告您做一個拷貝不必要的變化。

看一看這個問題: Cannot modify the return value error c#