InstantiateQuadsEditor.cs 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. using UnityEngine;
  2. using UnityEditor;
  3. using System.Collections.Generic;
  4. public class InstantiateQuadsEditor : EditorWindow
  5. {
  6. [MenuItem("Tools/Instantiate Quads")]
  7. public static void ShowWindow()
  8. {
  9. GetWindow<InstantiateQuadsEditor>("Instantiate Quads");
  10. }
  11. private GameObject parentObject; // 父对象
  12. private GameObject prefab;
  13. private int hor = 3; // 水平分割数量
  14. private int ver = 2; // 垂直分割数量
  15. void OnGUI()
  16. {
  17. GUILayout.Label("Instantiate Quads Settings", EditorStyles.boldLabel);
  18. // 显示父对象选择器
  19. parentObject = (GameObject)EditorGUILayout.ObjectField("Parent Object", parentObject, typeof(GameObject), true);
  20. // 显示Prefab选择器
  21. prefab = (GameObject)EditorGUILayout.ObjectField("Prefab", prefab, typeof(GameObject), false);
  22. // 显示水平和垂直分割数量输入框
  23. hor = EditorGUILayout.IntField("Horizontal Splits", hor);
  24. ver = EditorGUILayout.IntField("Vertical Splits", ver);
  25. // 添加按钮
  26. if (GUILayout.Button("Instantiate Quads"))
  27. {
  28. if (parentObject == null)
  29. {
  30. Debug.LogError("Parent Object is not assigned.");
  31. return;
  32. }
  33. InstantiateQuads(prefab, hor, ver, parentObject.transform);
  34. }
  35. }
  36. private Material CreateAndSaveMaterial(Texture texture, string assetFolderPath)
  37. {
  38. if (texture == null)
  39. {
  40. Debug.LogError("Texture is null");
  41. return null;
  42. }
  43. // 确保 assetFolderPath 是有效的 Unity 文件夹路径
  44. if (string.IsNullOrEmpty(assetFolderPath) || !AssetDatabase.IsValidFolder(assetFolderPath))
  45. {
  46. Debug.LogError("Invalid asset folder path: " + assetFolderPath);
  47. return null;
  48. }
  49. // 创建一个新的材质
  50. Material mat = new Material(Shader.Find("Unlit/Texture"));
  51. if (mat == null)
  52. {
  53. Debug.LogError("Shader 'Unlit/Texture' not found");
  54. return null;
  55. }
  56. // 设置材质的纹理
  57. mat.mainTexture = texture;
  58. // 为材质创建一个唯一的名称
  59. string materialName = "Material_" + texture.name;
  60. // 生成材质的路径
  61. string materialPath = AssetDatabase.GenerateUniqueAssetPath(System.IO.Path.Combine(assetFolderPath, materialName + ".mat"));
  62. // 保存材质为 Asset
  63. AssetDatabase.CreateAsset(mat, materialPath);
  64. // 刷新 Asset 数据库
  65. AssetDatabase.Refresh();
  66. // 检查是否成功创建
  67. Material createdMat = AssetDatabase.LoadAssetAtPath<Material>(materialPath);
  68. if (createdMat == null)
  69. {
  70. Debug.LogError("Failed to create material at path: " + materialPath);
  71. }
  72. return createdMat;
  73. }
  74. private void InstantiateQuads(GameObject prefab, int hor, int ver, Transform parent)
  75. {
  76. //// 加载所有纹理
  77. //Texture[] textures = Resources.LoadAll<Texture>("L14");
  78. if (prefab == null)
  79. {
  80. Debug.LogError("Prefab is not assigned.");
  81. return;
  82. }
  83. for (int i = 0; i < hor; i++)
  84. {
  85. for (int j = 0; j < ver; j++)
  86. {
  87. Texture texture = Resources.Load<Texture>("L16/GCJ02_L16_18x18" + i + "_" + j);
  88. float startJ = 0 - (hor / 2.0f) + 0.5f;
  89. float starti = 0 + (ver / 2.0f) - 0.5f;
  90. // 实例化Prefab
  91. GameObject quad = Instantiate(prefab, parent);
  92. quad.name = "L16" + i.ToString() + "_" + j.ToString();
  93. // 设置位置
  94. Vector3 localPosition = new Vector3(startJ + j, starti - i, 0);
  95. quad.transform.localPosition = localPosition;
  96. // 为每个实例化的对象创建新的材质,并保存为Asset
  97. Material mat = CreateAndSaveMaterial(texture, "Assets/Art/Material/Minimap/L16");
  98. quad.GetComponent<MeshRenderer>().material = mat;
  99. }
  100. }
  101. }
  102. }