Unity Resources.Load <sprite> vs Sprite </sprite>

时间:2015-02-20 13:15:53

标签: unity3d resources load sprite renderer

我尝试使用此代码更改我的对象的图像(使用作为Sprite 强制转换):

GetComponent<SpriteRenderer>().sprite = Resources.Load("GameObjects/Tiles/Hole") as Sprite;

它不起作用,但这有效(使用&lt; Sprite&gt; ):

GetComponent<SpriteRenderer>().sprite = Resources.Load<Sprite>("GameObjects/Tiles/Hole");

有什么区别?

2 个答案:

答案 0 :(得分:4)

FunctionR的答案可能是更常见的答案,我可能在这里错了,但我认为Load()Load<T>()之间的区别在于Load<T>()检查元数据。 “Hole”不是Sprite,它是一个图像文件。 Load()找到该图像文件并将其加载为文件类型的默认类型,在本例中为Texture2D

换句话说,您无法使用as Sprite,因为您无法cast Texture2DSprite。但是,您可以使用

    Texture2D = Resources.Load("GameObjects/Tiles/Hole");
    Rect rect = {whatever};
    Vector2 pivot = {whatever};
    Sprite.Create(texture, rect, pivot);

但这需要您知道您尝试加载的Sprite的大小。

总之,Load()仅根据您要加载的文件类型对其进行处理,Load<T>()包含元数据。

答案 1 :(得分:3)

Resources.Load("GameObjects/Tiles/Hole") as Sprite;

您的Resources文件夹中有另一个“Hole”。此 other-Hole 不是Sprite。因此,当您使用as Sprite时,它根本无法转换为一个并且不会抛出异常(在该行上),因为:

  

as运算符就像一个强制转换操作。但是,如果转换   是不可能的,因为返回null而不是引发异常。


Resources.Load<Sprite>("GameObjects/Tiles/Hole");

在工作代码中,您可以指定所需的文件Sprite,以便找到正确的文件。