2014-08-28 30 views
11

Ho una matrice di oggetti Sprite in Unity. Le loro dimensioni variano a seconda dell'immagine caricata. Voglio combinarli uno accanto all'altro come una mappa affiancata in un'immagine. Voglio che siano layout come se steste formando una linea di immagini, una dopo l'altra. (nota: NON uno sopra l'altro) Come posso essere in grado di fare questo?Combina array di oggetti Sprite in One Sprite - Unity

Il motivo per cui sto combinando (solo per quelli che vogliono sapere) è perché sto usando un collisore polygon2D. Dato che ci sono alcuni strani comportamenti che accadono quando utilizzo parallelamente più collider, ho deciso di combinare le immagini prima di aggiungere un grande collisore di poligoni. Nota che queste cose accadono durante il runtime. Non posso semplicemente creare una grande immagine e caricarla perché l'ordine delle immagini è determinato solo in fase di esecuzione.

Spero di ricevere aiuto con questo. Grazie.

+0

hai provato a combinare solo i collider? quello sarebbe il mio primo tentativo in quanto sembrano essere il problema. Se gli sprite sono abbastanza semplici, crea i percorsi manualmente, se non leggi i percorsi dei poligoni originali e aggiungili tutti a uno nuovo o esistente ed elimina il resto. – Tom

+0

@ Tom Ho provato ma non ho trovato un modo per combinare i collisori. Ho scritto un codice che ottiene tutti i punti, quindi rimuovo i punti duplicati e non ho ottenuto il risultato che volevo. Quando l'ho guardato, ho capito che ho bisogno di trovare un modo per determinare percorsi validi. Devo ignorare il percorso che chiude ogni immagine. Ma come faccio a farlo quando le mie immagini variano in forma e dimensioni (composto da molti punti) potresti indicarmi la direzione giusta/meglio ancora aiutarmi con esso. Grazie. – cessmestreet

+0

a seconda del numero di percorsi che si ottengono da tutti i collisori insieme, è sufficiente copiarli senza modificare: conta i percorsi di tutti i collisatori insieme, quindi imposta il percorsoCount del nuovo collisore su quel numero, quindi passa in rassegna tutti i percorsi e li imposta in il nuovo collisore con SetPath(). La mia ipotesi sarebbe <50-100 percorsi è ancora bene. Mi imbatto in problemi quando un algoritmo creava più di 1000 percorsi in quanto richiederebbe l'unità per sempre per creare la mesh dai percorsi. – Tom

risposta

5

C'è il PackTextures method nella classe Texture2D, ma dal momento che rende il tuo atlante quadrato non puoi creare una linea di sprite, quindi c'è un altro modo per farlo leggendo i pixel delle immagini e impostandole su una nuova immagine, è davvero costoso da fare in runtime ma ti dà il risultato.

// your textures to combine 
// !! after importing as sprite change to advance mode and enable read and write property !! 
public Sprite[] textures; 
// just to see on editor nothing to add from editor 
public Texture2D atlas; 
public Material testMaterial; 
public SpriteRenderer testSpriteRenderer; 

int textureWidthCounter = 0; 
int width,height; 
void Start() { 
    // determine your size from sprites 
    width = 0; 
    height = 0; 
    foreach(Sprite t in textures) 
    { 
     width += t.texture.width; 
     // determine the height 
     if(t.texture.height > height)height = t.texture.height; 
    } 

    // make your new texture 
    atlas = new Texture2D(width,height,TextureFormat.RGBA32,false); 
    // loop through your textures 
    for(int i= 0; i<textures.Length; i++) 
    { 
     int y = 0; 
     while (y < atlas.height) { 
      int x = 0; 
      while (x < textures[i].texture.width){ 
       if(y < textures[i].texture.height){ 
        // fill your texture 
        atlas.SetPixel(x + textureWidthCounter, y, textures[i].texture.GetPixel(x,y)); 
       } 
       else { 
        // add transparency 
        atlas.SetPixel(x + textureWidthCounter, y,new Color(0f,0f,0f,0f)); 
       } 
       ++x; 
      } 
      ++y; 
     } 
     atlas.Apply(); 
     textureWidthCounter += textures[i].texture.width; 
    } 
    // for normal renderers 
    if(testMaterial != null)testMaterial.mainTexture = atlas; 
    // for sprite renderer just make a sprite from texture 
    Sprite s = Sprite.Create(atlas,new Rect(0f,0f,atlas.width,atlas.height),new Vector2(0.5f, 0.5f)); 
    testSpriteRenderer.sprite = s; 
    // add your polygon collider 
    testSpriteRenderer.gameObject.AddComponent<PolygonCollider2D>(); 
} 
+0

Grazie per questo. Lo proverò. Quanto sarà costoso? Influenzi notevolmente le prestazioni del mio gioco? Se sì, allora penso che userò semplicemente questo come strumento in modo da poter generare il collisore poligono per il mio oggetto e salvarlo come un prefabbricato. Ma comunque, sei fantastico. Grazie. – cessmestreet

+0

Il risparmio come prefabbricato sarà migliore, dal momento che il metodo utilizza un ciclo annidato a cubetti che potrebbe causare qualche problema se si realizzano trame grandi. Devi testare e trovare ciò che è meglio per la tua situazione – nexx

+0

Yah. Ho appena deciso di usarlo come strumento e salvarlo come prefabbricato. Ho notato che non è possibile creare trame grandi. Ma questo ha funzionato e grazie per questo. Almeno sarebbe più facile per me creare il collisore poligonale. Grazie. – cessmestreet