在Unity3D中,我遵循一个tilemap教程。(In Unity3D, I am following a tilemap tutorial. However, the UV layout is c

编程入门 行业动态 更新时间:2024-10-09 22:18:48
在Unity3D中,我遵循一个tilemap教程。(In Unity3D, I am following a tilemap tutorial. However, the UV layout is coming out strange. How can I fix this?)

我正在学习以下教程集: https : //www.youtube.com/watch?v=owBt9SNKXCI&index=6&list=PLbghT7MmckI4qGA0Wm_TZS8LVrqS47I9R动态构建瓦片地图布局。 它适用于某个点,但它会生成一个非常奇怪的布局,其中包含128 x 128大小的图块。

显然,奇怪的分区不应该发生,但我似乎无法追查是什么导致它。 这是我的代码版本,它与quill18creates的版本几乎完全相同,只是有一些小的区别:

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(); } }

I'm following this tutorial set: https://www.youtube.com/watch?v=owBt9SNKXCI&index=6&list=PLbghT7MmckI4qGA0Wm_TZS8LVrqS47I9R to dynamically build a tile map layout. It works to a point, but it generates a very strange layout with 128 x 128 sized tiles.

Clearly that strange partitioning shouldn't be happening, but I cannot seem to track down what's going on to cause it. Here is my version of the code, which is mostly identical to quill18creates's version sans a few small differences:

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(); } }

最满意答案

我并不完全明确图像中哪些部分是错误的,但我认为这是相同的瓷砖混合在一起。 我试过你的代码,它适合我。 但我想下面的部分可能会导致你一起出现问题:

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

相反,你应该这样做:

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

因为,另一种方式,随机产生浮点数,也许它们彼此靠近,将它们四舍五入成为相同的拼贴。 试一试。 另外提醒一下,确保纹理的宽度和高度可以被128整除。

I don't get exactly what part is wrong in the image but I think it is that the same tiles are lumping together. I tried your code and it works well for me. But I guess the following part could be causing the lumping together problem for you:

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

Instead you should do:

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

Because, the other way, Random is generating float numbers and maybe they are near the each other that rounding them to the integer gives same tile. Give it a try. Also just reminding, make sure the width and the height of your texture is divisible by 128.

更多推荐

本文发布于:2023-07-06 07:23:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1047304.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:教程   tutorial   Unity3D   tilemap   UV

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!