using UnityEngine; using UnityEditor; using System.Collections.Generic; public class InstantiateQuadsEditor : EditorWindow { [MenuItem("Tools/Instantiate Quads")] public static void ShowWindow() { GetWindow("Instantiate Quads"); } private GameObject parentObject; // 父对象 private GameObject prefab; private int hor = 3; // 水平分割数量 private int ver = 2; // 垂直分割数量 void OnGUI() { GUILayout.Label("Instantiate Quads Settings", EditorStyles.boldLabel); // 显示父对象选择器 parentObject = (GameObject)EditorGUILayout.ObjectField("Parent Object", parentObject, typeof(GameObject), true); // 显示Prefab选择器 prefab = (GameObject)EditorGUILayout.ObjectField("Prefab", prefab, typeof(GameObject), false); // 显示水平和垂直分割数量输入框 hor = EditorGUILayout.IntField("Horizontal Splits", hor); ver = EditorGUILayout.IntField("Vertical Splits", ver); // 添加按钮 if (GUILayout.Button("Instantiate Quads")) { if (parentObject == null) { Debug.LogError("Parent Object is not assigned."); return; } InstantiateQuads(prefab, hor, ver, parentObject.transform); } } private Material CreateAndSaveMaterial(Texture texture, string assetFolderPath) { if (texture == null) { Debug.LogError("Texture is null"); return null; } // 确保 assetFolderPath 是有效的 Unity 文件夹路径 if (string.IsNullOrEmpty(assetFolderPath) || !AssetDatabase.IsValidFolder(assetFolderPath)) { Debug.LogError("Invalid asset folder path: " + assetFolderPath); return null; } // 创建一个新的材质 Material mat = new Material(Shader.Find("Unlit/Texture")); if (mat == null) { Debug.LogError("Shader 'Unlit/Texture' not found"); return null; } // 设置材质的纹理 mat.mainTexture = texture; // 为材质创建一个唯一的名称 string materialName = "Material_" + texture.name; // 生成材质的路径 string materialPath = AssetDatabase.GenerateUniqueAssetPath(System.IO.Path.Combine(assetFolderPath, materialName + ".mat")); // 保存材质为 Asset AssetDatabase.CreateAsset(mat, materialPath); // 刷新 Asset 数据库 AssetDatabase.Refresh(); // 检查是否成功创建 Material createdMat = AssetDatabase.LoadAssetAtPath(materialPath); if (createdMat == null) { Debug.LogError("Failed to create material at path: " + materialPath); } return createdMat; } private void InstantiateQuads(GameObject prefab, int hor, int ver, Transform parent) { //// 加载所有纹理 //Texture[] textures = Resources.LoadAll("L14"); if (prefab == null) { Debug.LogError("Prefab is not assigned."); return; } for (int i = 0; i < hor; i++) { for (int j = 0; j < ver; j++) { Texture texture = Resources.Load("L16/GCJ02_L16_18x18" + i + "_" + j); float startJ = 0 - (hor / 2.0f) + 0.5f; float starti = 0 + (ver / 2.0f) - 0.5f; // 实例化Prefab GameObject quad = Instantiate(prefab, parent); quad.name = "L16" + i.ToString() + "_" + j.ToString(); // 设置位置 Vector3 localPosition = new Vector3(startJ + j, starti - i, 0); quad.transform.localPosition = localPosition; // 为每个实例化的对象创建新的材质,并保存为Asset Material mat = CreateAndSaveMaterial(texture, "Assets/Art/Material/Minimap/L16"); quad.GetComponent().material = mat; } } } }