|
@@ -1,126 +0,0 @@
|
|
|
-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++)
|
|
|
- {
|
|
|
-
|
|
|
- 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(textures[i * hor + j], "Assets/Art/Material/Minimap");
|
|
|
- quad.GetComponent<MeshRenderer>().material = mat;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-}
|