2016-03-25 13 views
1

Unity'de bilt-in küpünün yüzlerine yerleştirilen dokuları değiştirmeye ve yeniden boyutlandırmaya çalışıyorum. Herhangi bir sorun olmadan ben bu kodla her yüzünde farklı bir görüntü koymak başardı:Doku küpü haritası neden tüm küpler için değişti?

void Start() { 
Mesh mesh = GetComponent<MeshFilter>().mesh; 
Vector2[] UVs = new Vector2[mesh.vertices.Length]; 
// Front 
UVs[0] = new Vector2(0.0f, 0.0f); 
UVs[1] = new Vector2(0.333f, 0.0f); 
UVs[2] = new Vector2(0.0f, 0.333f); 
UVs[3] = new Vector2(0.333f, 0.333f); 
// Top 
UVs[4] = new Vector2(0.334f, 0.333f); 
UVs[5] = new Vector2(0.666f, 0.333f); 
UVs[8] = new Vector2(0.334f, 0.0f); 
UVs[9] = new Vector2(0.666f, 0.0f); 
// Back 
UVs[6] = new Vector2(1.0f, 0.0f); 
UVs[7] = new Vector2(0.667f, 0.0f); 
UVs[10] = new Vector2(1.0f, 0.333f); 
UVs[11] = new Vector2(0.667f, 0.333f); 
// Bottom 
UVs[12] = new Vector2(0.0f, 0.334f); 
UVs[13] = new Vector2(0.0f, 0.666f); 
UVs[14] = new Vector2(0.333f, 0.666f); 
UVs[15] = new Vector2(0.333f, 0.334f); 
// Left 
UVs[16] = new Vector2(0.334f, 0.334f); 
UVs[17] = new Vector2(0.334f, 0.666f); 
UVs[18] = new Vector2(0.666f, 0.666f); 
UVs[19] = new Vector2(0.666f, 0.334f); 
// Right   
UVs[20] = new Vector2(0.667f, 0.334f); 
UVs[21] = new Vector2(0.667f, 0.666f); 
UVs[22] = new Vector2(1.0f, 0.666f); 
UVs[23] = new Vector2(1.0f, 0.334f); 
mesh.uv = UVs; 
GetComponent<MeshFilter>().mesh = mesh 
} 

Bu çalışır, ancak küp/shader bağlı tek bir doku (texture atlası ??) kullanır. İki farklı doku seti kullanmanın mümkün olup olmadığını merak ediyorum. Örneğin, doku 1 parçaları ile 4 yüze ve doku 2 parçalarıyla 2 yüze sahibim. Veya 6 farklı kod kullanarak doku atlası oluşturmak mümkündür. dokular? Bunun için PackTexture() yöntemi kullanılabilir mi?

cevap

1

Daha fazla doku kullanmak için ayrı bir alt ağa ihtiyacınız vardır. Ayrı subMesh Birliği ile diğer materyalleri ve diğer dokuları birleştirebilirsiniz. Bu kodu içeren bir komut dosyası oluşturmak ve bir küp ile bir GameObject ekleyin Örneğin

http://docs.unity3d.com/ScriptReference/Mesh.SetTriangles.html

de

bak.

void Awake() 
{ 
    Mesh currentMesh = this.GetComponent<MeshFilter>().mesh; 

    int[] submesh0 = new int[]{0,2,3,0,3,1,8,4,5,8,5,9,10,6,7,10,7,11,12,13,14,12,14,15}; 
    int[] submesh1 = new int[]{16,17,18,16,18,19, 20,21,22,20,22,23}; 

    currentMesh.subMeshCount=2; 

    currentMesh.SetTriangles(submesh0,0); 
    currentMesh.SetTriangles(submesh1,1); 
} 

uyanık sonra küp iki materyal eklemek ve diğer diğer 2 kişilik, 4 yüz bir malzeme için kullanır.

Lütfen bunun en iyi yol olmadığını unutmayın. İki malzeme arası bozulma optimizasyonu kullanmak ve iki ayrı çizim çağrısı (daha pahalı) gerekir.

+0

Merhaba. Teşekkürler, ama eğer küpe bağlı iki alt şerite sahip olacak olursam, altı küp yüz dokusuna sahip olan ve farklı altı yüz dokusuna sahip olan bir sekansa sahip olacak olursam, ilk dokudan dört yüzü ve ikinci dokudan iki yüzü kullanabilir miyim? –

+0

Sadece bunu yapmak için bir örnek ekliyorum ... – Klamore74

+0

Merhaba, Ben Texture2D.PackTextures kullanarak ve her opf paketlenmiş dokular için UV'leri ayarlayarak benim sorunumu çözdüm. Yine de teşekkürler :) –

İlgili konular