using UnityEngine; using System.Collections.Generic; using Unity.VisualScripting; [System.Serializable] public class TextureConfig { public Texture2D texture; public Vector2 position = new Vector2(0.25f, 0.25f); public Vector2 scale = new Vector2(0.5f, 0.5f); public float rotation = 0f; } public class DynamicTileController : MonoBehaviour { public Material material; public List textureConfigs = new List(); [Header("通用设置")] [Range(0, 0.25f)] public float borderSize = 0.1f; [Range(0, 0.5f)] public float outerGapWidth = 0f; private const int MAX_TEXTURES = 6; void Update() { UpdateMaterial(); } void UpdateMaterial() { // 限制最大贴图数量 int count = Mathf.Min(textureConfigs.Count, MAX_TEXTURES); material.SetInt("_TextureCount", 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]; Texture2DArray textureArray = new Texture2DArray(512, 512, count, TextureFormat.RGBA32, false); // 更新贴图和配置 for (int i = 0; i < count; i++) { var config = textureConfigs[i]; // 设置贴图 // material.SetTexture($"_Textures{i}", config.texture); // 填充数组 // textures[i] = config.texture; textureArray.SetPixels(config.texture.GetPixels(), i); positions[i] = new Vector4(config.position.x, config.position.y, 0, 0); scales[i] = new Vector4(config.scale.x, config.scale.y, 0, 0); rotations[i] = config.rotation; } // 设置数组到着色器 material.SetTexture("_Textures", textureArray); material.SetVectorArray("_Positions", positions); material.SetVectorArray("_Scales", scales); material.SetFloatArray("_Rotations", rotations); // 设置通用参数 material.SetFloat("_BorderSize", borderSize); material.SetFloat("_OuterGapWidth", outerGapWidth); } // 添加新的贴图配置 public void AddTextureConfig(Texture2D texture) { if (textureConfigs.Count >= MAX_TEXTURES) { Debug.LogWarning("已达到最大贴图数量限制"); return; } var config = new TextureConfig { texture = texture, position = new Vector2(Random.Range(0.2f, 0.8f), Random.Range(0.2f, 0.8f)), scale = new Vector2(0.4f, 0.4f), rotation = 0f }; textureConfigs.Add(config); } // 移除贴图配置 public void RemoveTextureConfig(int index) { if (index >= 0 && index < textureConfigs.Count) { textureConfigs.RemoveAt(index); } } }