2015-08-13 12 views
9

Bu eğitim setini takip ediyorum: https://www.youtube.com/watch?v=owBt9SNKXCI&index=6&list=PLbghT7MmckI4qGA0Wm_TZS8LVrqS47I9R, bir karo harita düzenini dinamik olarak oluşturmak için. Bir noktaya çalışır, ancak 128 x 128 boyutlu fayanslarla çok garip bir düzen oluşturur. Unity3D'de, bir tilemap eğitimini takip ediyorum. Bununla birlikte, UV düzeni garip geliyor. Bunu nasıl düzeltebilirim?

enter image description here

Açıkçası bu garip bölümleme olmamalıydı, ama bunu neden neler olduğunu izini gibi olamaz. İşte birkaç küçük farklılıklar quill18creates versiyonu sans çoğunlukla aynıdır kod benim versiyonudur:

using UnityEngine; 
using System.Collections; 

[ExecuteInEditMode] 
public class TileMap : MonoBehaviour { 

    public int size_x = 100; 
    public int size_z = 50; 
    public float tileSize = 1.0f; 

    public Texture2D terrainTiles; 
    int tileResolution = 128; 

    // Use this for initialization 
    void Start() { 
     BuildMesh(); 
    } 

    Color[][] ChopUpTiles() { 
     int numTilesPerRow = terrainTiles.width/tileResolution; 
     int numRows = terrainTiles.height/tileResolution; 

     Color[][] tiles = new Color[numTilesPerRow*numRows][]; 

     for(int y=0; y < numRows; y++) { 
      for(int x=0; x < numTilesPerRow; x++) { 
       tiles[y * numTilesPerRow + x] = terrainTiles.GetPixels(x*tileResolution , y*tileResolution, tileResolution, tileResolution); 
      } 
     } 

     return tiles; 
    } 

    void BuildTexture() { 
     //DTileMap map = new DTileMap(size_x, size_z); 

     int texWidth = size_x * tileResolution; 
     int texHeight = size_z * tileResolution; 
     Texture2D texture = new Texture2D(texWidth, texHeight); 

     Color[][] tiles = ChopUpTiles(); 


     for(int y=0; y < size_z; y++) { 
      for(int x=0; x < size_x; x++) { 
       Color[] p = tiles[Mathf.RoundToInt(Random.Range(0, 5))]; 
       texture.SetPixels(x * tileResolution, y * tileResolution, tileResolution, tileResolution, p); 
      } 
     } 

     //texture.filterMode = FilterMode.Bilinear; 
     texture.wrapMode = TextureWrapMode.Clamp; 
     texture.Apply(); 

     MeshRenderer mesh_renderer = GetComponent<MeshRenderer>(); 
     mesh_renderer.sharedMaterials[0].mainTexture = texture; 
    } 

    public void BuildMesh() { 
     int numTiles = size_x * size_z; 
     int numTris = numTiles * 2; 

     int vsize_x = size_x + 1; 
     int vsize_z = size_z + 1; 
     int numVerts = vsize_x * vsize_z; 

     // Generate the mesh data 
     Vector3[] vertices = new Vector3[ numVerts ]; 
     Vector3[] normals = new Vector3[numVerts]; 
     Vector2[] uv = new Vector2[numVerts]; 

     int[] triangles = new int[ numTris * 3 ]; 

     int x, z; 
     for(z=0; z < vsize_z; z++) { 
      for(x=0; x < vsize_x; x++) { 
       vertices[ z * vsize_x + x ] = new Vector3(x*tileSize, 0, -z*tileSize); 
       normals[ z * vsize_x + x ] = Vector3.up; 
       uv[ (z * vsize_x) + x ] = new Vector2((float)x/size_x, (float)z/size_z); 
      } 
     } 
     Debug.Log ("Done Verts!"); 

     for(z=0; z < size_z; z++) { 
      for(x=0; x < size_x; x++) { 
       int squareIndex = z * size_x + x; 
       int triOffset = squareIndex * 6; 
       triangles[triOffset + 0] = z * vsize_x + x +   0; 
       triangles[triOffset + 2] = z * vsize_x + x + vsize_x + 0; 
       triangles[triOffset + 1] = z * vsize_x + x + vsize_x + 1; 

       triangles[triOffset + 3] = z * vsize_x + x +   0; 
       triangles[triOffset + 5] = z * vsize_x + x + vsize_x + 1; 
       triangles[triOffset + 4] = z * vsize_x + x +   1; 
      } 
     } 

     // Create a new Mesh and populate with the data 
     Mesh mesh = new Mesh(); 
     mesh.vertices = vertices; 
     mesh.triangles = triangles; 
     mesh.normals = normals; 
     mesh.uv = uv; 

     // Assign our mesh to our filter/renderer/collider 
     MeshFilter mesh_filter = GetComponent<MeshFilter>(); 
     MeshCollider mesh_collider = GetComponent<MeshCollider>(); 

     mesh_filter.mesh = mesh; 
     mesh_collider.sharedMesh = mesh; 


     BuildTexture(); 
    } 
} 
+0

Bu konuda bir şey yapmak isteyen var mı? Kod için bu fikri sevdim, sadece UV konumlandırma düzeni çalışması gerektiği şekilde çalışan görünmüyor olabilir. – Merlin

+0

Farklılıklar nelerdir? Bakmak istediğin gibi görünüyor. – 31eee384

cevap

2

I bölüm görüntüde sorunun ne tam olarak alamadım ama aynı fayans olduğunu düşünüyorum Birlikte toplanıyorlar. Kodunuzu denedim ve benim için iyi çalışıyor.

Color[] p = tiles[Random.Range(0, 5)]; 

başka bir yol, çünkü Rastgele şamandıra numaralarını oluşturuyor ve belki onlar:

yerine
Color[] p = tiles[Mathf.RoundToInt(Random.Range(0, 5))]; 

Yapmanız gereken: Ama şu kısmı sizin için bir araya koymasında sorunun nedeni olabilecek tahmin Birbirine yakın olarak, tamsayıya yuvarlayarak aynı döşemeyi verir. Bir şans ver. Ayrıca, sadece hatırlatarak, dokunuzun genişliğinin ve boyunun 128 ile bölünebildiğinden emin olun.

+0

Çoğunlukla korkuyorum, buna rağmen ChopUpTiles işlevinin buna neden olabileceğine inanıyorum. Sadece nasıl emin değilim. – Merlin

+0

Sanırım sorunu yeniden ürettim. Birlik içinde sahip olabileceğiniz maksimum doku boyutu 2^14 ila 2^14 arasındadır. Daha büyük bir doku üretmeye çalıştığınızda, doku oluştururken bir istisna verir, ancak örgü yine de oluşturulur. Böylece doku ağ boyunca uzanıyor ve fayanslar birbirine yapışıyor gibi görünüyor. Doku boyutunuzun bir boyutu, size_x * tileResolution' ile kararlaştırılır. Yani daha büyük bir ağ oluşturmaya çalıştığınızda, bu hatayı alacaksınız. –

+0

Her neyse, bu tür bir ağ oluşturmanın kötü bir yolu olduğunu fark ettim. Daha büyük bir dünyaya sahip olmak için birden fazla ağ oluşturabilirsin ama yine de iyi bir yol olmadığını düşünüyorum. Bunun yerine şu şekilde yapmalısınız: Her karo için 4 köşe kullanın. Orijinal dokudaki konumlarına göre uv koordinatlarını atayın. Ve malzemenin içindeki orijinal dokuyu kullanın. Yani yeni bir doku oluşturmayın. Bu şekilde, 64k’den daha az köşesi olduğu sürece herhangi bir boyut ağına sahip olabilirsiniz. Sonra tekrar 64k köşe noktalarının üstesinden gelmenin bir yolu yoktur, böylece daha büyük yapmak istiyorsanız başka bir ağ oluşturmalısınız. –

0

Kesinlikle bir boyut sorunu vardı, ama aynı zamanda konumlandırma ile ilgili bir sorun vardı. Fayanslar, onları bulmak için koordinat sisteminin sol alt köşesinde başlamalıdır.

İlgili konular