Unity 4.3 - 2D, как назначить программные спрайты объекту
Я пытаюсь создать объект, который будет отвечать за создание и отображение разных спрайтов, поэтому я хотел бы получить доступ к активам/спрайтам программно вместо перетаскивания спрайта в иерархии под этим объектом.
Есть способ программно создать новый спрайт и назначить то, что у меня есть в папке с ресурсами?
Я также хотел бы иметь некоторую структуру данных с несколькими изображениями, загруженными в начале игры, массивом или словарем или что-то в этом роде, чтобы я мог измениться в зависимости от ситуации, которую мне нужно показать. Но что меня смущает, так как я новичок в Unity, так это то, как создать спрайт, ссылаясь на спрайт программно, используя папку с ресурсами.
отредактировать с прогрессом:
Я создал массив спрайтов вроде этого:
public Sprite[] mySprites;
в Unity Я добавил спрайты внутри массива вручную (я просто перетащил png внутри массива переменных), поэтому на самом деле в этом объекте у меня есть компонент с этим массивом, полным спрайтов
внутри компонента я также сделал это:
public SpriteRenderer renderer;
renderer = transform.GetComponent<SpriteRenderer>();
renderer.sprite = (Sprite)mySprites [0];
У меня нет ошибок, пока я не запустил игру, тогда спрайт НЕ назначен, и я получил следующее:
"Не удалось выполнить PPtr при разыменовании! Кастин из Texture2D в Sprite!"
Я получил эту ошибку даже без кастинга (Sprite) и btw Я не знаю, почему он рассказывает мне о Texture2D, поскольку все что задано как спрайт
Ответы
Ответ 1
Для создания спрайта программно может быть слишком сложно сделать. Вам, вероятно, потребуется создать текстуру в памяти, заполнить данные, а затем записать эту текстуру на диск. После этого вы сможете прочитать это с помощью файла С# или Unity WWW.LoadFromCacheOrDownload.
Вот как вы бы динамически создавали текстуру: http://answers.unity3d.com/questions/9919/how-do-i-create-a-texture-dynamically-in-unity.html
Чтобы загрузить ваши спрайты программно (но не динамически созданные), они должны находиться под папкой с именем Resources (которая является специальной папкой).
т.е. предположим, что у вас есть спрайт с именем MySprite.png под папкой Sprites, которая находится под папкой "Ресурсы". Затем вы загрузите его следующим образом:
renderer.sprite = Resources.Load<Sprite>("Sprites/MySprite");
(обратите внимание, как вы не включаете папку "Ресурсы" и расширение спрайта)
Более подробную информацию вы найдете в Загрузка ресурсов в Runtime.
Не удалось выполнить PPtr при разыменовании!
Я немного искал и узнал из этот пост форума, который обычно случается, когда у вас есть список одного типа, а затем его другой тип. То есть если mySprites был в какой-то момент GameObject [], и вы связали кучу спрайтов, а затем изменили его на Sprite []. И поскольку он специально говорит Texture2D, я предполагаю, что параметры импорта ваших спрайтов (или некоторых из них) установлены в Texture вместо Sprite:
![Sprite import settings]()
Кроме того, все MonoBehaviours уже имеют поле с именем renderer, которое имеет тип Renderer. Я бы предложил вам переименовать это поле, чтобы избежать путаницы, если только вы не использовали это в качестве примера.
Ответ 2
Вот реальный код.. поможет вам
void SetSprite(UI2DSprite uiSprite, Sprite[] sprites, string strKey)
{
foreach (Sprite stexture in sprites)
{
if (stexture.name == strKey)
{
uiSprite.sprite2D = stexture;
break;
}
}
}
используйте его по пути.
UI2DSprite[] uiSprites = tmpObject.GetComponentsInChildren<UI2DSprite>();
Sprite[] sprites = Resources.LoadAll<Sprite>("Textures");
string resName = "icon_favorite_2";
foreach (UI2DSprite uiSprite in uiSprites)
{
if(uiSprite.name = "icon")
SetSprite(uiSprite, sprites , resName);
}