123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126 |
- using UnityEngine;
- using UnityEditor;
- using System.Collections.Generic;
- public class InstantiateQuadsEditor : EditorWindow
- {
- [MenuItem("Tools/Instantiate Quads")]
- public static void ShowWindow()
- {
- GetWindow<InstantiateQuadsEditor>("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<Material>(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<Texture>("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<Texture>("L14/GCJ02_L14_28x28" + 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 = "L14" + 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/L14");
- quad.GetComponent<MeshRenderer>().material = mat;
- }
- }
- }
- }
|