Unity 4.3 – 2D, come assegnare sprite programmaticamente a un object

Sto cercando di creare un object che sarà responsabile della creazione e della visualizzazione di sprite diversi, quindi vorrei accedere direttamente alle risorse / sprite a livello di codice invece di trascinare e rilasciare uno sprite nella gerarchia sotto quell’object.

C’è un modo per creare un nuovo sprite al livello di programmazione e assegnare quello che ho nella cartella delle risorse?

Mi piacerebbe anche avere una sorta di struttura dati con alcune immagini caricate all’inizio del gioco, una matrice o un dizionario o qualcosa del genere in modo da poter cambiare in base ad alcune situazioni che le immagini devo mostrare. Ma ciò che mi confonde da quando sono nuovo a Unity è come creare uno sprite prendendo il riferimento allo sprite a livello di programmazione usando la cartella assets.

modifica con avanzamento:

Ho creato una serie di sprite come questa:

public Sprite[] mySprites; 

in Unity ho aggiunto sprite all’interno dell’array manualmente (ho appena trascinato png all’interno dell’array di variabili) quindi in questo Object ho un componente con questo array pieno di sprite

all’interno del componente ho anche fatto questo:

 public SpriteRenderer renderer; renderer = transform.GetComponent(); renderer.sprite = (Sprite)mySprites [0]; 

Non ho avuto errori finché non ho eseguito il gioco, quindi lo sprite NON è stato assegnato e ho ottenuto questo:

“Cast di PPtr fallito durante il dereferenziamento! Castin da Texture2D a Sprite!”

Ho ricevuto questo errore anche senza casting (Sprite) e non so perché mi stia raccontando di Texture2D da quando è stato impostato come sprite

Creare uno sprite a livello di codice potrebbe essere un po ‘troppo difficile da fare. Probabilmente dovresti creare una Texture in memoria, inserire i dati e poi scrivere quella texture sul disco. Dopodiché dovresti essere in grado di leggerlo usando il file di C # o il http://WWW.LoadFromCacheOrDownload di Unity .

Ecco come si crea una texture in modo dinamico: http://answers.unity3d.com/questions/9919/how-do-i-create-a-texte-dynamically-in-unity.html


Per caricare gli sprite a livello di codice (non quelli creati dynamicmente però), devono essere sotto una cartella con il nome Risorse (che è una cartella speciale ).

Suppongo che tu abbia uno sprite chiamato MySprite.png sotto una cartella chiamata Sprites che si trova in una cartella denominata Risorse. Dovresti quindi caricarlo in questo modo:

 renderer.sprite = Resources.Load("Sprites/MySprite"); 

(nota come non includere la cartella Risorse e l’estensione dello sprite)

Puoi trovare maggiori dettagli nella documentazione di caricamento delle risorse in runtime .


Cast di PPtr fallito durante il dereferenziamento!

Ho fatto delle ricerche e ho scoperto da questo post sul forum che di solito accade quando hai un elenco di un tipo e poi lo hai cambiato in un altro tipo. Vale a dire se mySprites era a un certo punto GameObject [] e hai collegato un gruppo di Sprites e poi lo hai cambiato in Sprite []. E poiché dice specificatamente Texture2D, suppongo che le impostazioni di importazione dei tuoi Sprites (o alcune di esse) siano impostate su Texture invece che su Sprite:

Impostazioni di importazione Sprite


Inoltre, tutti i MonoBehaviours hanno già un campo chiamato renderer , che è di tipo Renderer . Ti suggerirei di rinominare quel campo per evitare confusione, a meno che tu non lo abbia usato solo come esempio.

Ecco il codice reale .. ti aiuterà

 void SetSprite(UI2DSprite uiSprite, Sprite[] sprites, string strKey) { foreach (Sprite stexture in sprites) { if (stexture.name == strKey) { uiSprite.sprite2D = stexture; break; } } } 

usalo seguendo il modo ..

 UI2DSprite[] uiSprites = tmpObject.GetComponentsInChildren(); Sprite[] sprites = Resources.LoadAll("Textures"); string resName = "icon_favorite_2"; foreach (UI2DSprite uiSprite in uiSprites) { if(uiSprite.name = "icon") SetSprite(uiSprite, sprites , resName); }