using UnityEngine; using System.Collections.Generic; using System; using Unity.VisualScripting; public class FixedCombineTileController : 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; // 整个模式的大小 } private 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 ] } ], ""instances"": [ { ""meshidx"": 0, ""uniforms"" : { ""vTransform"" : [0, 0, 0], ""vLocalTransform"": [0.25, 0.25], ""vSeamOffset"": [0, 0], ""vTextureSize"": [0.5, 0.5] }, ""texture"": ""data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAYAAABytg0kAAAAAXNSR0IArs4c6QAAABRJREFUGFdj/M/A8J+BgYGBEcYAACwBA/9pGIu9AAAAAElFTkSuQmCC"" }, { ""meshidx"": 1, ""uniforms"" : { ""vTransform"" : [0, 0, 0], ""vLocalTransform"": [0.75, 0.25], ""vSeamOffset"": [0, 0], ""vTextureSize"": [0.5, 0.5] }, ""texture"": ""data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAYAAABytg0kAAAAAXNSR0IArs4c6QAAABRJREFUGFdjZPjP8J+BgYGBEcYAACoDA/9cU2MPAAAAAElFTkSuQmCC"" }, { ""meshidx"": 0, ""uniforms"" : { ""vTransform"" : [0, 0, 0], ""vLocalTransform"": [0.25, 0.75], ""vSeamOffset"": [0, 0], ""vTextureSize"": [0.5, 0.5] }, ""texture"": ""data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAYAAABytg0kAAAAAXNSR0IArs4c6QAAABRJREFUGFdjZGD4/5+BgYGBEcYAACgFA/86LIEuAAAAAElFTkSuQmCC"" }, { ""meshidx"": 1, ""uniforms"" : { ""vTransform"" : [0.5, 0, 0], ""vLocalTransform"": [0.75, 0.75], ""vSeamOffset"": [0, 0], ""vTextureSize"": [0.5, 0.5] }, ""texture"": ""data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAYAAABytg0kAAAAAXNSR0IArs4c6QAAABRJREFUGFdjZPj//z8DAwMDI4wBAD7uBf32jHwdAAAAAElFTkSuQmCC"" } ] }"; [System.Serializable] public class MeshData { public int revertSeam; public List vertices; public List indices; } [System.Serializable] public class TileUniformData { public float[] vTransform; public float[] vLocalTransform; public float[] vSeamOffset; public float[] vTextureSize; } [System.Serializable] public class InstanceData { public int meshidx; public TileUniformData uniforms; public string texture; } [System.Serializable] public class TileConfig { public List mesh; public List instances; } public Material material; private Mesh tileMesh; private MaterialPropertyBlock propertyBlock; private Matrix4x4[] transformMatrices; private ComputeBuffer transformBuffer; void Start() { // propertyBlock = new MaterialPropertyBlock(); UpdateTexture(jsonConfig); } void UpdateTexture(string inConfig) { TileConfig config = JsonUtility.FromJson(inConfig); // // 创建网格 // tileMesh = new Mesh(); // tileMesh.SetVertices(new List // { // new Vector3(0, 0, 0), // new Vector3(1, 1, 0), // new Vector3(1, 0, 0) // }); // tileMesh.SetIndices(new List { 0, 1, 2 }, MeshTopology.Triangles, 0); // // 创建实例数 // transformMatrices = new Matrix4x4[config.instances.Count]; int MAX_TEXTURES = config.instances.Count; Vector4[] positions = new Vector4[MAX_TEXTURES]; Vector4[] scales = new Vector4[MAX_TEXTURES]; float[] rotations = new float[MAX_TEXTURES]; // Texture2D[] textures = new Texture2D[MAX_TEXTURES]; material.SetInt("_TextureCount", MAX_TEXTURES); for (int i = 0; i < config.instances.Count; i++) { int index = i + 1; TileUniformData uniform = config.instances[i].uniforms; Texture2D texture = Base64ToTexture.ConvertBase64ToTexture(config.instances[i].texture); material.SetTexture($"_Tex{index}", texture); positions[i] = new Vector4(uniform.vLocalTransform[0], uniform.vLocalTransform[1], 0, 0); scales[i] = new Vector4(uniform.vTextureSize[0], uniform.vTextureSize[1], 0, 0); rotations[i] = uniform.vTransform[2] * Mathf.Deg2Rad; material.SetVector($"_Position{index}", positions[i]); material.SetVector($"_Scale{index}", scales[i]); material.SetFloat($"_Rotation{index}", rotations[i]); } // // 设置数组到着色器 // material.SetVectorArray("_Positions", positions); // material.SetVectorArray("_Scales", scales); // material.SetFloatArray("_Rotations", rotations); // 设置通用参数 material.SetFloat("_BorderSize", 0.02f); material.SetFloat("_OuterGapWidth", 0f); material.SetColor("_BorderColor", new Color(128 / 255f, 128 / 255f, 128 / 255f, 1)); } }