【问题标题】:Unity Color Extension Method not Affecting ColorUnity颜色扩展方法不影响颜色
【发布时间】:2014-02-13 22:21:43
【问题描述】:

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

【问题讨论】:

    标签: unity3d extension-methods


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      您收到错误消息,因为通过使用 c# 作为脚本语言,您将获得一个结构作为颜色属性。这意味着您将获得颜色变量的副本:

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

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

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

      【讨论】:

        猜你喜欢
        • 2020-11-10
        • 1970-01-01
        • 1970-01-01
        • 2017-08-20
        • 1970-01-01
        • 2014-06-01
        • 2012-07-17
        • 1970-01-01
        • 2021-06-12
        相关资源
        最近更新 更多