为什么我不能直接更改Sprite属性?

时间:2016-04-22 13:32:40

标签: c# unity3d reference null attributes

当我尝试切换我发布的网站时,我不小心越过了帖子。哎呀! https://gamedev.stackexchange.com/questions/120309/why-can-i-not-change-a-sprite-directly/120311#120311

我正在更改图像数组上的精灵。我可以想到两种方法。第一种方式是:

var images = GetComponentsInChildren<Image>();
foreach(var image in images)
{
    if (!image.sprite)
    {
        image.sprite = GetMySprite();
    }
}

这种方式非常有效。但是,如果我试图像这样抓住精灵本身:

var images = GetComponentsInChildren<Image>();
foreach(var image in images)
{
    var sprite = image.sprite;
    if (!sprite)
    {
        sprite = GetMySprite();
    }
}

它不起作用。 Sprite被赋值,但它不是原始的Sprite。附加到图像的Sprite保持为空。

起初我想,也许Sprite是一个结构?但它不是 - 它是一个扩展Object的密封类。 (我认为无论如何都不一定能解释它。)

那么为什么我必须在更改其Sprite属性时保留对Image的引用?

1 个答案:

答案 0 :(得分:2)

在两个实例中,sprite字段都是对sprite对象的引用。在第二个示例中,您将创建一个局部变量,该变量也是对精灵对象的引用 - 您可以通过复制image.sprite中的值来初始化。请注意,“var sprite”不是对“image.sprite”本身的引用。

在第二个示例中,您只修改局部变量的值,保持原始值不变。