2014-08-28 33 views
11

Unity'de bir dizi Sprite nesnesi var. Boyutları, yüklenen görüntüye bağlı olarak değişir. Ben bunları bir görüntüye kiremitli bir harita gibi yan yana birleştirmek istiyorum. Onları, birbiri ardına gelen bir görüntü dizisi oluşturuyormuş gibi düzen olmasını istiyorum. (not: diğerinin üstünde DEĞİL) Bunu nasıl yapabilirim?Sprite nesnesinin bir dizisini One Sprite - Unity olarak birleştirin

Neden birleştirdiğimin nedeni (sadece bilmek isteyenlere) çünkü bir polygon2D Collider kullanıyorum. Birden fazla çarpıştırıcıyı yan yana kullandığımda bazı garip davranışlar meydana geldiğinden, sadece büyük bir çokgen çarpıştırıcı eklemeden önce görüntüleri birleştirmeye karar verdim. Bu şeylerin çalışma zamanı sırasında gerçekleştiğini unutmayın. Sadece büyük bir resim oluşturamıyorum ve bunu yükleyemiyorum çünkü resimlerin sırası sadece çalışma zamanında belirleniyor.

Bu konuda biraz yardım almayı umuyorum. Teşekkürler.

+0

Sadece çarpıştırıcıları birleştirmeyi denediniz mi? Bu benim ilk denemem olurdu çünkü onlar problem gibi görünüyorlar. Spritelar oldukça basitse, sadece orijinal polygonCollider'lardan yolları okumaz ve hepsini yenisine veya varolan bir tanesine ekle ve geri kalanını silerseniz, yolları elle oluşturun. – Tom

+0

@ Denedim ama çarpışmaları birleştirmenin bir yolunu bulamadım. Bütün noktaları alan bir kod yazdım, ardından kopyalanan noktaları kaldırdım ve istediğim sonucu alamadım. Ona baktığımda, geçerli yolları belirlemenin bir yolunu bulmam gerektiğini anladım. Her görüntüyü kapatan yolu görmezden gelmeliyim. Fakat görüntülerim şekil ve boyutlarda değiştiğinde (bir çok noktadan oluşur) bunu bana doğru yöne/daha iyi bir noktaya yönlendirebilir misiniz, ancak bana yardımcı olabilirsiniz. Teşekkürler. – cessmestreet

+0

, tüm çarpıştırıcılardan aldığınız yolların sayısına bağlı olarak, bunları değiştirmeden kopyalayabilirsiniz: Tüm çarpıştırıcıların yollarını birlikte sayın, sonra yeni çarpıştırıcınızın yolunu bu sayıya ayarlayın, sonra tüm yollar arasında dolaşın ve bunları SetPath() ile yeni çarpıştırıcı. Tahminim <50-100 yolu hala iyi. Bir algoritma, örgüleri yollardan yapmak için sonsuza kadar birlik olacağı için 1000'den fazla yol oluşturduğunda problemlerle karşılaşıyorum. – Tom

cevap

5

Texture2D sınıfında PackTextures method var, ancak atlas meydanınızı bir seri çizgi haline getiremediğinizden, görüntülerin piksellerini okuyarak ve bunları yeni görüntüye ayarlayarak bunu yapmanın başka bir yolu var, gerçekten çalışma zamanında yapmak pahalı ama size sonuç verir.

// 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

Bunun için teşekkür ederiz. Denerim. Ne kadar pahalı olacak? Oyunumun performansını büyük ölçüde etkiler mi? Evet ise, o zaman bunu bir araç olarak kullanacağımı düşünüyorum, böylece nesnem için çokgen çarpıştırıcısını oluşturabilirim ve bir prefabrik olarak saklayabilirim. Ama her iki şekilde de, harikasınız. Teşekkürler. – cessmestreet

+0

Prefabrik olarak kaydetme yöntemi bükümlü iç içe geçmiş döngü kullandığından, bence siz büyük dokular yapıyorsanız, bazı sorunlara neden olabilirsiniz. Durumunuz için neyin en iyi olduğunu test etmeli ve bulmalıyız – nexx

+0

Yah. Sadece bir araç olarak kullanmaya karar verdim ve prefabrik olarak sakladım. Büyük dokuları yaratamayacağını fark ettim. Ama, bu çalıştı ve bunun için teşekkür ederim. En azından poligon çarpıştırıcısını yaratmam benim için daha kolay olurdu. Teşekkürler. – cessmestreet