Unity Resources.Load‹Sprite› и как Sprite

Я попытался изменить изображение своего объекта с помощью этого кода (используется как Sprite):

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

Это не сработало, однако это сработало (используется ‹Sprite>):

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

Какая разница?


person Ferenc Dajka    schedule 20.02.2015    source источник
comment
У вас есть несколько файлов в вашем проекте с именем Hole? Одна команда указывает тип актива для поиска, а другая — нет. В зависимости от вашей файловой структуры, из-за этого они могут искать разные результаты.   -  person rutter    schedule 20.02.2015


Ответы (2)


Ответ FunctionR, вероятно, является более распространенным ответом, и я могу ошибаться здесь, но я считаю, что разница между Load() и Load<T>() заключается в том, что Load<T>() проверяет метаданные. Hole — это не Sprite, это файл изображения. Load() находит этот файл изображения и загружает его как тип по умолчанию для типа файла, в данном случае Texture2D.

Другими словами, вы не можете использовать as Sprite, потому что вы не можете cast из Texture2D в Sprite. Однако вы МОЖЕТЕ использовать

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

Sprite.Create(texture, rect, pivot);

но это требует, чтобы вы знали размер Sprite, который вы пытались загрузить.

Таким образом, Load() обрабатывает его исключительно на основе типа загружаемого файла, Load<T>() включает метаданные.

person Mars    schedule 30.03.2016

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

У вас есть еще одна «дыра» в папке «Ресурсы». Эта другая-дыра не является Sprite. Поэтому, когда вы используете as Sprite, он просто не может быть приведен к одному и не будет вызывать исключение (в этой строке), потому что:

Оператор as похож на операцию приведения. Однако, если преобразование невозможно, as возвращает значение null, а не вызывает исключение.


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

В рабочем коде вы указываете, какой файл вам нужен, Sprite, чтобы он нашел правильный.

person apxcode    schedule 20.02.2015
comment
В проводнике Windows у меня есть один файл с именем Hole.png и другой с именем Hole.png.meta, если я Debug.Log(Resources.Load‹Sprite ›(GameObjects/Tiles/Hole)); тогда это Sprite и если я Debug.Log((Resources.Load(GameObjects/Tiles/Hole)));< /b>, то это Texture2D.. Итак, файл .meta является файлом Texture2D? Однако в проводнике проекта Unity у меня есть только один файл ресурсов с именем Hole. - person Ferenc Dajka; 24.02.2015