Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Unity Resources.Load<Sprite> vs as Sprite

I've tried to change the image of my object with this code (used as Sprite cast):

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

It did not work, however this worked (used <Sprite>):

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

What's the difference?

like image 764
Ferenc Dajka Avatar asked Feb 20 '15 13:02

Ferenc Dajka


People also ask

Should I use resources load Unity?

Resources. Load is still very useful for loading prefabs that are common to many scenes. However I put it behind my own prefab loader so that I can load prefabs by references such as item SKU's, and I cache the objects that I load via Resources. Load.

What is difference between sprite and image Unity?

One of the key differences between sprites and images is that sprites support the automatic creation of meshes out of it, where UI images consist always of rectangles. The reason for creating meshes will be explained in the next section; we will see how important it is, as it has an important performance impact.

How do you use sprite as material in Unity?

You just have to import your picture(of shape you want) into unity. (Drag and drop it there) Then click Assets -> Create -> Material Then, under Main Maps, you should see an option called Albedo with a gray square to its left. Drag your picture into this square. This is what answers should look like.


2 Answers

FunctionR's answer is probably the more common answer, and I may just be wrong here, but I believe the difference between Load() and Load<T>() is that Load<T>() checks for meta-data. "Hole" is not a Sprite, it's an image file. Load() finds that image file and loads it as it's default type for the file type, in this case Texture2D.

In other words, you can't use as Sprite because you cannot cast a Texture2D to a Sprite. You CAN, however, use

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

Sprite.Create(texture, rect, pivot);

but this requires you to know the size of the Sprite you were trying to load.

In summary, Load() treats it based solely on the file type you're loading, Load<T>() includes metadata.

like image 166
Mars Avatar answered Nov 15 '22 08:11

Mars


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

You have another "Hole" in your Resources folder. This other-Hole is not a Sprite. Therefore when you use as Sprite it simply can't be casted to one and won't throw an exception (on that line) because:

The as operator is like a cast operation. However, if the conversion isn't possible, as returns null instead of raising an exception.


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

In the working code you specify which file you want, the Sprite, so it finds the correct one.

like image 23
apxcode Avatar answered Nov 15 '22 09:11

apxcode