No Unity3D, estou seguindo um tutorial de tilemap. No entanto, o layout UV está saindo estranho. Como posso consertar isso?

9

Estou seguindo este conjunto de tutoriais: link para criar dinamicamente um layout do mapa de azulejos. Ele funciona até certo ponto, mas gera um layout muito estranho com ladrilhos de tamanho 128 x 128.

Éevidentequeoparticionamentoestranhonãodeveriaestaracontecendo,masnãoconsigorastrearoqueestáacontecendo.Aquiestáaminhaversãodocódigo,queépraticamenteidênticaàversãodoquill18createssemalgumaspequenasdiferenças:

usingUnityEngine;usingSystem.Collections;[ExecuteInEditMode]publicclassTileMap:MonoBehaviour{publicintsize_x=100;publicintsize_z=50;publicfloattileSize=1.0f;publicTexture2DterrainTiles;inttileResolution=128;//UsethisforinitializationvoidStart(){BuildMesh();}Color[][]ChopUpTiles(){intnumTilesPerRow=terrainTiles.width/tileResolution;intnumRows=terrainTiles.height/tileResolution;Color[][]tiles=newColor[numTilesPerRow*numRows][];for(inty=0;y<numRows;y++){for(intx=0;x<numTilesPerRow;x++){tiles[y*numTilesPerRow+x]=terrainTiles.GetPixels(x*tileResolution,y*tileResolution,tileResolution,tileResolution);}}returntiles;}voidBuildTexture(){//DTileMapmap=newDTileMap(size_x,size_z);inttexWidth=size_x*tileResolution;inttexHeight=size_z*tileResolution;Texture2Dtexture=newTexture2D(texWidth,texHeight);Color[][]tiles=ChopUpTiles();for(inty=0;y<size_z;y++){for(intx=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();MeshRenderermesh_renderer=GetComponent<MeshRenderer>();mesh_renderer.sharedMaterials[0].mainTexture=texture;}publicvoidBuildMesh(){intnumTiles=size_x*size_z;intnumTris=numTiles*2;intvsize_x=size_x+1;intvsize_z=size_z+1;intnumVerts=vsize_x*vsize_z;//GeneratethemeshdataVector3[]vertices=newVector3[numVerts];Vector3[]normals=newVector3[numVerts];Vector2[]uv=newVector2[numVerts];int[]triangles=newint[numTris*3];intx,z;for(z=0;z<vsize_z;z++){for(x=0;x<vsize_x;x++){vertices[z*vsize_x+x]=newVector3(x*tileSize,0,-z*tileSize);normals[z*vsize_x+x]=Vector3.up;uv[(z*vsize_x)+x]=newVector2((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();
    }   
}
    
por Merlin 13.08.2015 в 23:20
fonte

2 respostas

2

Eu não entendo exatamente qual parte está errada na imagem, mas acho que as mesmas peças estão juntas. Eu tentei o seu código e funciona bem para mim. Mas eu acho que a parte seguinte pode estar causando o problema de agrupamento para você:

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

Em vez disso, você deve fazer:

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

Porque, por outro lado, Random está gerando números flutuantes e talvez eles estejam próximos um do outro que os arredondando para o inteiro dá o mesmo bloco. De uma chance. Além disso, lembre-se de que a largura e a altura da textura sejam divisíveis por 128.

    
por Gökhan Kurt 18.08.2015 / 22:47
fonte
0

Bem, foi definitivamente uma questão de tamanho, mas também havia um problema com o posicionamento. As telhas devem começar no canto inferior esquerdo para o sistema de coordenadas encontrá-las.

    
por Merlin 23.08.2015 / 21:28
fonte