2015-02-20 35 views
5

Próbowałem zmienić wizerunek mojego obiektu z tego kodu (używane jak Sprite cast):Unity Resources.Load <Sprite> vs jak Sprite

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

to nie działa, to jednak pracował (Używane < Sprite>):

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

Jaka jest różnica?

+1

Czy masz wiele plików w projekcie o nazwie "Hole"? Jedno polecenie określa typ zasobu do wyszukania, ale drugie nie. W zależności od struktury pliku, mogą one wyszukiwać różne wyniki z tego powodu. – rutter

Odpowiedz

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

Masz kolejny "Otwór" w swoim folderze Zasoby. Ten inny-Hole nie jest Sprite. Dlatego podczas korzystania as Sprite to po prostu nie można rzutować na jeden i nie rzuci wyjątek (na tej linii), ponieważ:

operatora as jest jak operacja szarego. Jeśli jednak konwersja nie jest możliwa, zwraca wartość null zamiast zgłaszać wyjątek.


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

W kodzie roboczego można określić, który plik chcesz To Sprite, więc znajdzie właściwy.

+0

W Eksploratorze Windows mam jeden plik o nazwie ** Hole.png ** i inny o nazwie ** Hole.png.meta ** jeśli I ** Debug.Log (Resources.Load ("GameObjects/Tiles/Hole ")); ** to jest ** Sprite ** i jeśli mam ** Debug.Log ((Resources.Load (" GameObjects/Tiles/Hole ")); ** to jest to ** Texture2D **. Więc plik **. Meta ** jest plikiem Texture2D? W eksploratorze projektu Unity mam jednak tylko jeden plik Resource o nazwie Hole. –

4

odpowiedź FunctionR jest prawdopodobnie bardziej powszechne odpowiedź, a może po prostu być źle tutaj, ale uważam, że różnica pomiędzy Load() i Load<T>() jest to, że Load<T>() sprawdza meta-danych. "Hole" nie jest Sprite, jest to plik obrazu. Load() znajduje plik obrazu i ładuje go jako domyślny typ pliku, w tym przypadku Texture2D.

Innymi słowy, nie można używać as Sprite ponieważ nie można castTexture2D do Sprite. Można jednak użyć

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

ale to wymaga, aby poznać wielkość Sprite starasz się załadować.

Podsumowując, Load() traktuje je w oparciu o typ pliku, który ładujesz, Load<T>() zawiera metadane.