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);

 }