using UnityEngine; using System.Collections.Generic; public class TileInstancer : MonoBehaviour { [System.Serializable] public class TilePattern { [System.Serializable] public class TileInstance { public Vector3 position; public Vector2 scale; public int textureIndex; } public TileInstance[] instances; public Vector2 patternSize; // 整个模式的大小 } public string jsonConfig = @"{ ""mesh"": [ { ""revertSeam"": 0, ""vertices"": [ 0, 0, 0, 1, 1, 0, 1, 0, 0 ], ""indices"": [ 0, 1, 2 ] }, { ""revertSeam"": 0, ""vertices"": [ 0, 0, 0, 0, 1, 0, 1, 1, 0 ], ""indices"": [ 0, 1, 2 ] index++; } ], ""instances"": [ { ""meshidx"": 0, ""uniforms"" : { ""vTransform"" : [0, 0, 0], ""vLocalTransform"": [""seamX / 2.0"", ""seamY / 2.0""], ""vSeamOffset"": [0, 0], ""vTextureSize"": [1, 1] }, ""texture"": ""data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAYAAABytg0kAAAAAXNSR0IArs4c6QAAABRJREFUGFdj/M/A8J+BgYGBEcYAACwBA/9pGIu9AAAAAElFTkSuQmCC"" }, { ""meshidx"": 1, ""uniforms"" : { ""vTransform"" : [0, 0, 0], ""vLocalTransform"": [""seamX / 2.0"", ""seamY + 0.2 * y + seamY / 2.0""], ""vSeamOffset"": [0, 0], ""vTextureSize"": [1, 1] }, ""texture"": ""data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAYAAABytg0kAAAAAXNSR0IArs4c6QAAABRJREFUGFdjZPjP8J+BgYGBEcYAACoDA/9cU2MPAAAAAElFTkSuQmCC"" }, { ""meshidx"": 0, ""uniforms"" : { ""vTransform"" : [0.5, 0, 0], ""vLocalTransform"": [""seamX / 2.0"", ""y + seamY + seamY / 2.0""], ""vSeamOffset"": [0, 0], ""vTextureSize"": [1, 1] }, ""texture"": ""data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAYAAABytg0kAAAAAXNSR0IArs4c6QAAABRJREFUGFdjZGD4/5+BgYGBEcYAACgFA/86LIEuAAAAAElFTkSuQmCC"" }, { ""meshidx"": 1, ""uniforms"" : { ""vTransform"" : [0.5, 0, 0], ""vLocalTransform"": [""seamX / 2.0"", ""seamY / 2.0""], ""vSeamOffset"": [0, 0], ""vTextureSize"": [1, 1] }, ""texture"": ""data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAYAAABytg0kAAAAAXNSR0IArs4c6QAAABRJREFUGFdjZPj//z8DAwMDI4wBAD7uBf32jHwdAAAAAElFTkSuQmCC"" } ] }"; private Material[] tileMaterials; [System.Serializable] public class MeshData { public int revertSeam; public List vertices; public List indices; } [System.Serializable] public class InstanceData { public int meshidx; public Dictionary uniforms; public string texture; } [System.Serializable] public class TileConfig { public List mesh; public List instances; } private Mesh tileMesh; private MaterialPropertyBlock propertyBlock; private Matrix4x4[] transformMatrices; private ComputeBuffer transformBuffer; private void CreateInstancedTiles(TileConfig config, TilePattern pattern) { // // 创建基础网格 // tileMesh = new Mesh(); // Vector3[] vertices = new Vector3[4]; // int[] triangles = new int[] { 0, 1, 2, 0, 2, 3 }; // // 设置UV和顶点 // Vector2[] uvs = new Vector2[4]; // vertices[0] = new Vector3(0, 0, 0); // vertices[1] = new Vector3(0, config.height, 0); // vertices[2] = new Vector3(config.width, config.height, 0); // vertices[3] = new Vector3(config.width, 0, 0); // tileMesh.vertices = vertices; // tileMesh.triangles = triangles; // tileMesh.uv = uvs; // // 计算实例化矩阵 // CalculateInstanceMatrices(config, pattern); // // 使用Graphics.DrawMeshInstanced进行渲染 // propertyBlock = new MaterialPropertyBlock(); // void Update() // { // if (transformMatrices != null && transformMatrices.Length > 0) // { // Graphics.DrawMeshInstanced(tileMesh, 0, config.tileMaterial, // transformMatrices, transformMatrices.Length, propertyBlock); // } // } } private void CalculateInstanceMatrices(TileConfig config, TilePattern pattern) { // float totalWidth = config.width + config.seamX; // float totalHeight = config.height + config.seamY; // // 根据pattern计算每个瓷砖的变换矩阵 // // 根据你具体pattern逻辑来实现 // // ... } }