void updateMesh() { if (_meshDirty) { int tilesCount = _tiles.DL_COUNT(); Vector3[] vertices = new Vector3[tilesCount * 4]; Vector3[] normals = new Vector3[vertices.Length]; Vector2[] uvs = new Vector2[vertices.Length]; int[] triangles = new int[tilesCount * 6]; int tileIndex = 0; for (var ent = _tiles.head; ent != null; ent = ent.next) { Tile tile = ent.obj; CCSpriteFrame spriteFrame = tile.spriteFrame; Rect uTextureRect = spriteFrame.textureRect; uTextureRect.position /= UIWindow.PIXEL_PER_UNIT; uTextureRect.size /= UIWindow.PIXEL_PER_UNIT; float uTextureWidth = spriteFrame.texture.width / UIWindow.PIXEL_PER_UNIT; float uTextureHeight = spriteFrame.texture.height / UIWindow.PIXEL_PER_UNIT; float uTextureRectWidth = uTextureRect.width; float uTextureRectHeigh = uTextureRect.height; Vector2 uSpriteOffset = spriteFrame.offset / UIWindow.PIXEL_PER_UNIT; Vector2 center = uSpriteOffset; float centerX = center.x; float centerY = center.y; float uViewWidth = uTextureRectWidth, uViewHeight = uTextureRectHeigh; if (spriteFrame.rotated) { uViewWidth = uTextureRectHeigh; uViewHeight = uTextureRectWidth; } int verticesIndex = tileIndex * 4; vertices [verticesIndex + 0] = new Vector3(centerX - uViewWidth / 2, centerY + uViewHeight / 2, 0); vertices [verticesIndex + 1] = new Vector3(centerX + uViewWidth / 2, centerY + uViewHeight / 2, 0); vertices [verticesIndex + 2] = new Vector3(centerX + uViewWidth / 2, centerY - uViewHeight / 2, 0); vertices [verticesIndex + 3] = new Vector3(centerX - uViewWidth / 2, centerY - uViewHeight / 2, 0); int trianglesIndex = tileIndex * 6; triangles [trianglesIndex + 0] = verticesIndex + 0; triangles [trianglesIndex + 1] = verticesIndex + 1; triangles [trianglesIndex + 2] = verticesIndex + 2; triangles [trianglesIndex + 3] = verticesIndex + 2; triangles [trianglesIndex + 4] = verticesIndex + 3; triangles [trianglesIndex + 5] = verticesIndex + 0; float uLeft = uTextureRect.xMin / uTextureWidth; float vBottom = uTextureRect.yMin / uTextureHeight; float uRight = uTextureRect.xMax / uTextureWidth; float vTop = uTextureRect.yMax / uTextureHeight; if (!spriteFrame.rotated) { uvs [verticesIndex + 0] = new Vector2(uLeft, vTop); //top-left uvs [verticesIndex + 1] = new Vector2(uRight, vTop); //top-right uvs [verticesIndex + 2] = new Vector2(uRight, vBottom); //bottom-right uvs [verticesIndex + 3] = new Vector2(uLeft, vBottom); //bottom-left } else { uvs [verticesIndex + 0] = new Vector2(uRight, vTop); //top-right uvs [verticesIndex + 1] = new Vector2(uRight, vBottom); //bottom-right uvs [verticesIndex + 2] = new Vector2(uLeft, vBottom); //bottom-left uvs [verticesIndex + 3] = new Vector2(uLeft, vTop); //top-left } //apply transform if (!CGAffineTransform.IsIdentity(tile.transform)) { for (int i = 0; i < 4; i++) { Vector2 vertex = vertices [verticesIndex + i]; vertex = CGAffineTransform.CGPointApplyAffineTransform(vertex, tile.transform); vertices [verticesIndex + i] = vertex; } } tileIndex++; } for (int i = 0; i < normals.Length; i++) { normals [i] = Vector3.back; } Mesh mesh = this.meshFilter.sharedMesh; if (mesh == null) { mesh = new Mesh(); } mesh.vertices = vertices; mesh.triangles = triangles; mesh.normals = normals; mesh.uv = uvs; this.meshFilter.sharedMesh = mesh; _meshDirty = false; } }