com.jaimecamachodev.unityfolders 1.5.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (234) hide show
  1. package/.attestation.p7m +0 -0
  2. package/Editor/FolderIconRecolorUtility.cs +71 -0
  3. package/Editor/FolderIconRecolorUtility.cs.meta +2 -0
  4. package/Editor/FolderIconsManager.cs +168 -0
  5. package/Editor/FolderIconsManager.cs.meta +2 -0
  6. package/Editor/FolderIconsPostprocessor.cs +14 -0
  7. package/Editor/FolderIconsPostprocessor.cs.meta +2 -0
  8. package/Editor/FolderIconsSettings.cs +40 -0
  9. package/Editor/FolderIconsSettings.cs.meta +2 -0
  10. package/Editor/FolderIconsSettingsEditor.cs +147 -0
  11. package/Editor/FolderIconsSettingsEditor.cs.meta +2 -0
  12. package/Editor/FolderIconsSettingsMenu.cs +35 -0
  13. package/Editor/FolderIconsSettingsMenu.cs.meta +2 -0
  14. package/Editor/UnityAssetsRenamer.cs +70 -0
  15. package/Editor/UnityAssetsRenamer.cs.meta +11 -0
  16. package/Editor/UnityFolderOrganizer.cs +215 -0
  17. package/Editor/UnityFolderOrganizer.cs.meta +2 -0
  18. package/Editor/UnityFoldersCreator.cs +118 -0
  19. package/Editor/UnityFoldersCreator.cs.meta +2 -0
  20. package/Editor/UnityMaterialsCreator.cs +386 -0
  21. package/Editor/UnityMaterialsCreator.cs.meta +11 -0
  22. package/Editor/UnityMaterialsOrganizerRenamer.cs +63 -0
  23. package/Editor/UnityMaterialsOrganizerRenamer.cs.meta +11 -0
  24. package/Editor/UnityOrganizeAndRenamer.cs +58 -0
  25. package/Editor/UnityOrganizeAndRenamer.cs.meta +11 -0
  26. package/Editor/UnityPrefabCreator.cs +128 -0
  27. package/Editor/UnityPrefabCreator.cs.meta +11 -0
  28. package/Editor/UnityProjectStructureCreator.cs +51 -0
  29. package/Editor/UnityProjectStructureCreator.cs.meta +2 -0
  30. package/Editor/com.jaimecamacho.unityfolders.Editor.asmdef +16 -0
  31. package/Editor/com.jaimecamacho.unityfolders.Editor.asmdef.meta +7 -0
  32. package/Editor.meta +8 -0
  33. package/FolderIconsSettings/FolderIconsSettings.asset +292 -0
  34. package/FolderIconsSettings/FolderIconsSettings.asset.meta +8 -0
  35. package/FolderIconsSettings.meta +8 -0
  36. package/Folders/5-Skyboxs_Large_tint.png +0 -0
  37. package/Folders/5-Skyboxs_Large_tint.png.meta +156 -0
  38. package/Folders/5-Skyboxs_Small_tint.png +0 -0
  39. package/Folders/5-Skyboxs_Small_tint.png.meta +156 -0
  40. package/Folders.meta +8 -0
  41. package/Icons/Animations.png +0 -0
  42. package/Icons/Animations.png.meta +156 -0
  43. package/Icons/Audio.png +0 -0
  44. package/Icons/Audio.png.meta +156 -0
  45. package/Icons/Editor.png +0 -0
  46. package/Icons/Editor.png.meta +156 -0
  47. package/Icons/Fonts.png +0 -0
  48. package/Icons/Fonts.png.meta +156 -0
  49. package/Icons/Materials.png +0 -0
  50. package/Icons/Materials.png.meta +156 -0
  51. package/Icons/Models.png +0 -0
  52. package/Icons/Models.png.meta +156 -0
  53. package/Icons/Plugins.png +0 -0
  54. package/Icons/Plugins.png.meta +156 -0
  55. package/Icons/Prefabs.png +0 -0
  56. package/Icons/Prefabs.png.meta +156 -0
  57. package/Icons/Presets.png +0 -0
  58. package/Icons/Presets.png.meta +156 -0
  59. package/Icons/Resources.png +0 -0
  60. package/Icons/Resources.png.meta +156 -0
  61. package/Icons/Scenes.png +0 -0
  62. package/Icons/Scenes.png.meta +156 -0
  63. package/Icons/Scripts.png +0 -0
  64. package/Icons/Scripts.png.meta +156 -0
  65. package/Icons/Settings.png +0 -0
  66. package/Icons/Settings.png.meta +156 -0
  67. package/Icons/Shaders.png +0 -0
  68. package/Icons/Shaders.png.meta +156 -0
  69. package/Icons/Sprites.png +0 -0
  70. package/Icons/Sprites.png.meta +156 -0
  71. package/Icons/Textures.png +0 -0
  72. package/Icons/Textures.png.meta +156 -0
  73. package/Icons/X16/-Test14.png +0 -0
  74. package/Icons/X16/-Test14.png.meta +130 -0
  75. package/Icons/X16/-Test3.png +0 -0
  76. package/Icons/X16/-Test3.png.meta +130 -0
  77. package/Icons/X16/1-3D.png +0 -0
  78. package/Icons/X16/1-3D.png.meta +130 -0
  79. package/Icons/X16/1-Programming.png +0 -0
  80. package/Icons/X16/1-Programming.png.meta +130 -0
  81. package/Icons/X16/10-Lighting.png +0 -0
  82. package/Icons/X16/10-Lighting.png.meta +130 -0
  83. package/Icons/X16/2-Art.png +0 -0
  84. package/Icons/X16/2-Art.png.meta +130 -0
  85. package/Icons/X16/2-VFX V2.png +0 -0
  86. package/Icons/X16/2-VFX V2.png.meta +130 -0
  87. package/Icons/X16/2-VFX.png +0 -0
  88. package/Icons/X16/2-VFX.png.meta +130 -0
  89. package/Icons/X16/3-SFX.png +0 -0
  90. package/Icons/X16/3-SFX.png.meta +130 -0
  91. package/Icons/X16/3-Scenes.png +0 -0
  92. package/Icons/X16/3-Scenes.png.meta +130 -0
  93. package/Icons/X16/4-Directors.png +0 -0
  94. package/Icons/X16/4-Directors.png.meta +130 -0
  95. package/Icons/X16/4-Presets.png +0 -0
  96. package/Icons/X16/4-Presets.png.meta +130 -0
  97. package/Icons/X16/5-Settings.png +0 -0
  98. package/Icons/X16/5-Settings.png.meta +130 -0
  99. package/Icons/X16/5-Skyboxes v2.png +0 -0
  100. package/Icons/X16/5-Skyboxes v2.png.meta +130 -0
  101. package/Icons/X16/5-Skyboxes.png +0 -0
  102. package/Icons/X16/5-Skyboxes.png.meta +130 -0
  103. package/Icons/X16/6-Videos.png +0 -0
  104. package/Icons/X16/6-Videos.png.meta +130 -0
  105. package/Icons/X16/7-SolidMats.png +0 -0
  106. package/Icons/X16/7-SolidMats.png.meta +130 -0
  107. package/Icons/X16/8-PostProcessing.png +0 -0
  108. package/Icons/X16/8-PostProcessing.png.meta +130 -0
  109. package/Icons/X16/9-UI.png +0 -0
  110. package/Icons/X16/9-UI.png.meta +130 -0
  111. package/Icons/X16/Animation_X16.png +0 -0
  112. package/Icons/X16/Animation_X16.png.meta +130 -0
  113. package/Icons/X16/Art_X16.png +0 -0
  114. package/Icons/X16/Art_X16.png.meta +130 -0
  115. package/Icons/X16/Audio_X16.png +0 -0
  116. package/Icons/X16/Audio_X16.png.meta +130 -0
  117. package/Icons/X16/C_Animation_X16.png +0 -0
  118. package/Icons/X16/C_Animation_X16.png.meta +130 -0
  119. package/Icons/X16/C_Audio_X16.png +0 -0
  120. package/Icons/X16/C_Audio_X16.png.meta +130 -0
  121. package/Icons/X16/C_Material_X16.png +0 -0
  122. package/Icons/X16/C_Material_X16.png.meta +130 -0
  123. package/Icons/X16/C_Mesh_X16.png +0 -0
  124. package/Icons/X16/C_Mesh_X16.png.meta +130 -0
  125. package/Icons/X16/C_Prefab_X16.png +0 -0
  126. package/Icons/X16/C_Prefab_X16.png.meta +130 -0
  127. package/Icons/X16/C_Script_X16.png +0 -0
  128. package/Icons/X16/C_Script_X16.png.meta +130 -0
  129. package/Icons/X16/C_VFX_X16.png +0 -0
  130. package/Icons/X16/C_VFX_X16.png.meta +130 -0
  131. package/Icons/X16/Director_X16.png +0 -0
  132. package/Icons/X16/Director_X16.png.meta +130 -0
  133. package/Icons/X16/Folder_X16.png +0 -0
  134. package/Icons/X16/Folder_X16.png.meta +130 -0
  135. package/Icons/X16/Light_X16.png +0 -0
  136. package/Icons/X16/Light_X16.png.meta +130 -0
  137. package/Icons/X16/Material_X16.png +0 -0
  138. package/Icons/X16/Material_X16.png.meta +130 -0
  139. package/Icons/X16/Mesh_X16.png +0 -0
  140. package/Icons/X16/Mesh_X16.png.meta +130 -0
  141. package/Icons/X16/PostPro_X16.png +0 -0
  142. package/Icons/X16/PostPro_X16.png.meta +130 -0
  143. package/Icons/X16/Prefab_X16.png +0 -0
  144. package/Icons/X16/Prefab_X16.png.meta +130 -0
  145. package/Icons/X16/Preset2_X16.png +0 -0
  146. package/Icons/X16/Preset2_X16.png.meta +130 -0
  147. package/Icons/X16/Preset_X16.png +0 -0
  148. package/Icons/X16/Preset_X16.png.meta +130 -0
  149. package/Icons/X16/SFX_X16.png +0 -0
  150. package/Icons/X16/SFX_X16.png.meta +130 -0
  151. package/Icons/X16/Scene_X16.png +0 -0
  152. package/Icons/X16/Scene_X16.png.meta +130 -0
  153. package/Icons/X16/Script_X16.png +0 -0
  154. package/Icons/X16/Script_X16.png.meta +130 -0
  155. package/Icons/X16/Settings2_X16.png +0 -0
  156. package/Icons/X16/Settings2_X16.png.meta +130 -0
  157. package/Icons/X16/Settings3_X16.png +0 -0
  158. package/Icons/X16/Settings3_X16.png.meta +130 -0
  159. package/Icons/X16/Settings_X16.png +0 -0
  160. package/Icons/X16/Settings_X16.png.meta +130 -0
  161. package/Icons/X16/Shader_X16.png +0 -0
  162. package/Icons/X16/Shader_X16.png.meta +130 -0
  163. package/Icons/X16/Skybox_X16.png +0 -0
  164. package/Icons/X16/Skybox_X16.png.meta +130 -0
  165. package/Icons/X16/SolidMats_X16.png +0 -0
  166. package/Icons/X16/SolidMats_X16.png.meta +130 -0
  167. package/Icons/X16/Text_X16.png +0 -0
  168. package/Icons/X16/Text_X16.png.meta +130 -0
  169. package/Icons/X16/UI_X16.png +0 -0
  170. package/Icons/X16/UI_X16.png.meta +130 -0
  171. package/Icons/X16/VFX_X16.png +0 -0
  172. package/Icons/X16/VFX_X16.png.meta +130 -0
  173. package/Icons/X16/Video_X16.png +0 -0
  174. package/Icons/X16/Video_X16.png.meta +130 -0
  175. package/Icons/X16.meta +8 -0
  176. package/Icons/x256/1-3Dx256.png +0 -0
  177. package/Icons/x256/1-3Dx256.png.meta +130 -0
  178. package/Icons/x256/1-Programmingx256.png +0 -0
  179. package/Icons/x256/1-Programmingx256.png.meta +130 -0
  180. package/Icons/x256/10-Lightingx256.png +0 -0
  181. package/Icons/x256/10-Lightingx256.png.meta +130 -0
  182. package/Icons/x256/2-Artx256.png +0 -0
  183. package/Icons/x256/2-Artx256.png.meta +130 -0
  184. package/Icons/x256/2-VFXx256.png +0 -0
  185. package/Icons/x256/2-VFXx256.png.meta +130 -0
  186. package/Icons/x256/3-SFXx256.png +0 -0
  187. package/Icons/x256/3-SFXx256.png.meta +130 -0
  188. package/Icons/x256/3-Scenesx256.png +0 -0
  189. package/Icons/x256/3-Scenesx256.png.meta +130 -0
  190. package/Icons/x256/4-Directorsx256.png +0 -0
  191. package/Icons/x256/4-Directorsx256.png.meta +130 -0
  192. package/Icons/x256/4-Presetsx256.png +0 -0
  193. package/Icons/x256/4-Presetsx256.png.meta +130 -0
  194. package/Icons/x256/5-Settingsx256.png +0 -0
  195. package/Icons/x256/5-Settingsx256.png.meta +130 -0
  196. package/Icons/x256/5-Skyboxes v2x256.png +0 -0
  197. package/Icons/x256/5-Skyboxes v2x256.png.meta +130 -0
  198. package/Icons/x256/6-Videosx256.png +0 -0
  199. package/Icons/x256/6-Videosx256.png.meta +130 -0
  200. package/Icons/x256/7-SolidMatsx256.png +0 -0
  201. package/Icons/x256/7-SolidMatsx256.png.meta +130 -0
  202. package/Icons/x256/8-PostProcessingx256.png +0 -0
  203. package/Icons/x256/8-PostProcessingx256.png.meta +130 -0
  204. package/Icons/x256/9-UIx256.png +0 -0
  205. package/Icons/x256/9-UIx256.png.meta +130 -0
  206. package/Icons/x256/B_Folder_White.png +0 -0
  207. package/Icons/x256/B_Folder_White.png.meta +130 -0
  208. package/Icons/x256/C_Animation_X256.png +0 -0
  209. package/Icons/x256/C_Animation_X256.png.meta +130 -0
  210. package/Icons/x256/C_Audio_X256.png +0 -0
  211. package/Icons/x256/C_Audio_X256.png.meta +130 -0
  212. package/Icons/x256/C_Material_X256.png +0 -0
  213. package/Icons/x256/C_Material_X256.png.meta +130 -0
  214. package/Icons/x256/C_Mesh_X256.png +0 -0
  215. package/Icons/x256/C_Mesh_X256.png.meta +130 -0
  216. package/Icons/x256/C_Prefab_X256.png +0 -0
  217. package/Icons/x256/C_Prefab_X256.png.meta +130 -0
  218. package/Icons/x256/C_Script_X256.png +0 -0
  219. package/Icons/x256/C_Script_X256.png.meta +130 -0
  220. package/Icons/x256/C_VFX_X256.png +0 -0
  221. package/Icons/x256/C_VFX_X256.png.meta +130 -0
  222. package/Icons/x256/Folder_White.png +0 -0
  223. package/Icons/x256/Folder_White.png.meta +156 -0
  224. package/Icons/x256/Shader_X256.png +0 -0
  225. package/Icons/x256/Shader_X256.png.meta +130 -0
  226. package/Icons/x256.meta +8 -0
  227. package/Icons.meta +8 -0
  228. package/PSD/PSD.psd +0 -0
  229. package/PSD/PSD.psd.meta +130 -0
  230. package/PSD/PSDx256.psd +0 -0
  231. package/PSD/PSDx256.psd.meta +130 -0
  232. package/PSD.meta +8 -0
  233. package/package.json +29 -0
  234. package/package.json.meta +7 -0
@@ -0,0 +1,386 @@
1
+ using UnityEditor;
2
+ using UnityEngine;
3
+ using System.IO;
4
+ using System.Collections.Generic;
5
+
6
+ public static class UnityMaterialsCreator
7
+ {
8
+ [MenuItem("Tools/JaimeCamachoDev/UnityFolders/Crear Materiales", false, 23)]
9
+ [MenuItem("Assets/JaimeCamachoDev/UnityFolders/Crear Materiales", false, 23)]
10
+ private static void CreateMaterialsMenu()
11
+ {
12
+ string folderPath = GetSelectedPathOrFallback();
13
+
14
+ if (!AssetDatabase.IsValidFolder(folderPath))
15
+ {
16
+ Debug.LogWarning("Por favor selecciona una carpeta válida para crear materiales.");
17
+ return;
18
+ }
19
+
20
+ CreateMaterialsInFolder(folderPath);
21
+ }
22
+
23
+ internal static void CreateMaterialsInFolder(string folderPath)
24
+ {
25
+ Shader shader = FindShaderByName("Universal Render Pipeline/Lit");
26
+ if (shader == null)
27
+ {
28
+ Debug.LogError("No se encontró el shader 'Universal Render Pipeline/Lit'.");
29
+ return;
30
+ }
31
+
32
+ var textureSets = new Dictionary<string, TextureSet>();
33
+ string[] textureGuids = AssetDatabase.FindAssets("t:Texture2D", new[] { folderPath });
34
+ foreach (string guid in textureGuids)
35
+ {
36
+ string path = AssetDatabase.GUIDToAssetPath(guid);
37
+ string name = Path.GetFileNameWithoutExtension(path);
38
+ Texture2D tex = AssetDatabase.LoadAssetAtPath<Texture2D>(path);
39
+
40
+ if (name.EndsWith("_ColorAlpha"))
41
+ {
42
+ string key = name.Substring(0, name.Length - "_ColorAlpha".Length);
43
+ if (!textureSets.TryGetValue(key, out TextureSet set))
44
+ set = textureSets[key] = new TextureSet();
45
+ set.baseMap = tex;
46
+ }
47
+ else if (name.EndsWith("_Normal"))
48
+ {
49
+ string key = name.Substring(0, name.Length - "_Normal".Length);
50
+ if (!textureSets.TryGetValue(key, out TextureSet set))
51
+ set = textureSets[key] = new TextureSet();
52
+ set.normalMap = tex;
53
+ }
54
+ else if (name.EndsWith("_MetalSmooth"))
55
+ {
56
+ string key = name.Substring(0, name.Length - "_MetalSmooth".Length);
57
+ if (!textureSets.TryGetValue(key, out TextureSet set))
58
+ set = textureSets[key] = new TextureSet();
59
+ set.metalSmoothMap = tex;
60
+ }
61
+ else if (name.EndsWith("_AO"))
62
+ {
63
+ string key = name.Substring(0, name.Length - "_AO".Length);
64
+ if (!textureSets.TryGetValue(key, out TextureSet set))
65
+ set = textureSets[key] = new TextureSet();
66
+ set.occlusionMap = tex;
67
+ }
68
+ }
69
+ TextureSet unnamedSet = null;
70
+ foreach (KeyValuePair<string, TextureSet> kvp in textureSets)
71
+ {
72
+ if (string.IsNullOrEmpty(kvp.Key))
73
+ {
74
+ unnamedSet = kvp.Value;
75
+ continue;
76
+ }
77
+
78
+ CreateMaterialAsset(folderPath, kvp.Key, kvp.Value, shader);
79
+ }
80
+
81
+ string[] modelGuids = AssetDatabase.FindAssets("t:Model", new[] { folderPath });
82
+ foreach (string guid in modelGuids)
83
+ {
84
+ string modelPath = AssetDatabase.GUIDToAssetPath(guid);
85
+ GameObject model = AssetDatabase.LoadAssetAtPath<GameObject>(modelPath);
86
+ if (model == null)
87
+ continue;
88
+
89
+ string modelPrefix = model.name;
90
+ if (modelPrefix.EndsWith("_Geo"))
91
+ modelPrefix = modelPrefix.Substring(0, modelPrefix.Length - 4);
92
+
93
+ Renderer[] renderers = model.GetComponentsInChildren<Renderer>();
94
+ foreach (Renderer renderer in renderers)
95
+ {
96
+ Material[] mats = renderer.sharedMaterials;
97
+ for (int i = 0; i < mats.Length; i++)
98
+ {
99
+ string matName = mats[i] != null ? mats[i].name : modelPrefix;
100
+ if (textureSets.TryGetValue(matName, out TextureSet set) && set.material != null)
101
+ {
102
+ mats[i] = set.material;
103
+ }
104
+ else if (textureSets.TryGetValue(modelPrefix, out set) && set.material != null)
105
+ {
106
+ mats[i] = set.material;
107
+ }
108
+ else if (unnamedSet != null)
109
+ {
110
+ if (!textureSets.TryGetValue(modelPrefix, out set))
111
+ {
112
+ set = new TextureSet
113
+ {
114
+ baseMap = unnamedSet.baseMap,
115
+ normalMap = unnamedSet.normalMap,
116
+ metalSmoothMap = unnamedSet.metalSmoothMap,
117
+ occlusionMap = unnamedSet.occlusionMap
118
+ };
119
+ CreateMaterialAsset(folderPath, modelPrefix, set, shader);
120
+ textureSets[modelPrefix] = set;
121
+ }
122
+ mats[i] = set.material;
123
+ }
124
+ }
125
+ renderer.sharedMaterials = mats;
126
+ EditorUtility.SetDirty(renderer);
127
+ }
128
+ EditorUtility.SetDirty(model);
129
+ }
130
+
131
+ AssetDatabase.SaveAssets();
132
+ AssetDatabase.Refresh();
133
+ Debug.Log($"Materiales creados y asignados en {folderPath}.");
134
+ }
135
+
136
+ internal static void CreateLitMaterialsInFolder(string folderPath)
137
+ {
138
+ Shader shader = FindShaderByName("Universal Render Pipeline/Lit");
139
+ if (shader == null)
140
+ {
141
+ Debug.LogError("No se encontró el shader 'Universal Render Pipeline/Lit'.");
142
+ return;
143
+ }
144
+
145
+ var textureSets = new Dictionary<string, LitTextureSet>();
146
+ string[] textureGuids = AssetDatabase.FindAssets("t:Texture2D", new[] { folderPath });
147
+ foreach (string guid in textureGuids)
148
+ {
149
+ string path = AssetDatabase.GUIDToAssetPath(guid);
150
+ string name = Path.GetFileNameWithoutExtension(path);
151
+ Texture2D tex = AssetDatabase.LoadAssetAtPath<Texture2D>(path);
152
+
153
+ if (name.EndsWith("_ColorAlpha"))
154
+ {
155
+ string key = name.Substring(0, name.Length - "_ColorAlpha".Length);
156
+ if (!textureSets.TryGetValue(key, out LitTextureSet set))
157
+ set = textureSets[key] = new LitTextureSet();
158
+ set.baseMap = tex;
159
+ }
160
+ else if (name.EndsWith("_Normal"))
161
+ {
162
+ string key = name.Substring(0, name.Length - "_Normal".Length);
163
+ if (!textureSets.TryGetValue(key, out LitTextureSet set))
164
+ set = textureSets[key] = new LitTextureSet();
165
+ set.normalMap = tex;
166
+ }
167
+ else if (name.EndsWith("_Emission"))
168
+ {
169
+ string key = name.Substring(0, name.Length - "_Emission".Length);
170
+ if (!textureSets.TryGetValue(key, out LitTextureSet set))
171
+ set = textureSets[key] = new LitTextureSet();
172
+ set.emissionMap = tex;
173
+ }
174
+ else if (name.EndsWith("_MaskMap") || name.Equals("MaskMap"))
175
+ {
176
+ string key = name.EndsWith("_MaskMap") ? name.Substring(0, name.Length - "_MaskMap".Length) : string.Empty;
177
+ if (!textureSets.TryGetValue(key, out LitTextureSet set))
178
+ set = textureSets[key] = new LitTextureSet();
179
+ set.maskMap = tex;
180
+ }
181
+ }
182
+
183
+ LitTextureSet unnamedSet = null;
184
+ foreach (KeyValuePair<string, LitTextureSet> kvp in textureSets)
185
+ {
186
+ if (string.IsNullOrEmpty(kvp.Key))
187
+ {
188
+ unnamedSet = kvp.Value;
189
+ continue;
190
+ }
191
+
192
+ CreateLitMaterialAsset(folderPath, kvp.Key, kvp.Value, shader);
193
+ }
194
+
195
+ string[] modelGuids = AssetDatabase.FindAssets("t:Model", new[] { folderPath });
196
+ foreach (string guid in modelGuids)
197
+ {
198
+ string modelPath = AssetDatabase.GUIDToAssetPath(guid);
199
+ GameObject model = AssetDatabase.LoadAssetAtPath<GameObject>(modelPath);
200
+ if (model == null)
201
+ continue;
202
+
203
+ string modelPrefix = model.name;
204
+ if (modelPrefix.EndsWith("_Geo"))
205
+ modelPrefix = modelPrefix.Substring(0, modelPrefix.Length - 4);
206
+
207
+ Renderer[] renderers = model.GetComponentsInChildren<Renderer>();
208
+ foreach (Renderer renderer in renderers)
209
+ {
210
+ Material[] mats = renderer.sharedMaterials;
211
+ for (int i = 0; i < mats.Length; i++)
212
+ {
213
+ string matName = mats[i] != null ? mats[i].name : modelPrefix;
214
+ if (textureSets.TryGetValue(matName, out LitTextureSet set) && set.material != null)
215
+ {
216
+ mats[i] = set.material;
217
+ }
218
+ else if (textureSets.TryGetValue(modelPrefix, out set) && set.material != null)
219
+ {
220
+ mats[i] = set.material;
221
+ }
222
+ else if (unnamedSet != null)
223
+ {
224
+ if (!textureSets.TryGetValue(modelPrefix, out set))
225
+ {
226
+ set = new LitTextureSet
227
+ {
228
+ baseMap = unnamedSet.baseMap,
229
+ normalMap = unnamedSet.normalMap,
230
+ emissionMap = unnamedSet.emissionMap,
231
+ maskMap = unnamedSet.maskMap
232
+ };
233
+ CreateLitMaterialAsset(folderPath, modelPrefix, set, shader);
234
+ textureSets[modelPrefix] = set;
235
+ }
236
+ mats[i] = set.material;
237
+ }
238
+ }
239
+ renderer.sharedMaterials = mats;
240
+ EditorUtility.SetDirty(renderer);
241
+ }
242
+ EditorUtility.SetDirty(model);
243
+ }
244
+
245
+ AssetDatabase.SaveAssets();
246
+ AssetDatabase.Refresh();
247
+ Debug.Log($"Materiales LIT creados y asignados en {folderPath}.");
248
+ }
249
+
250
+ private static Material CreateMaterialAsset(string folderPath, string prefix, TextureSet set, Shader shader)
251
+ {
252
+ if (string.IsNullOrEmpty(prefix))
253
+ return null;
254
+
255
+ string matPath = AssetDatabase.GenerateUniqueAssetPath(Path.Combine(folderPath, prefix + ".mat"));
256
+ Material mat = new Material(shader);
257
+ if (set.baseMap != null)
258
+ mat.SetTexture("_BaseMap", set.baseMap);
259
+ if (set.normalMap != null)
260
+ {
261
+ mat.SetTexture("_BumpMap", set.normalMap);
262
+ mat.EnableKeyword("_NORMALMAP");
263
+ }
264
+ if (set.metalSmoothMap != null)
265
+ {
266
+ mat.SetTexture("_MetallicGlossMap", set.metalSmoothMap);
267
+ mat.EnableKeyword("_METALLICSPECGLOSSMAP");
268
+ mat.SetFloat("_Metallic", 1f);
269
+ }
270
+ if (set.occlusionMap != null)
271
+ mat.SetTexture("_OcclusionMap", set.occlusionMap);
272
+ AssetDatabase.CreateAsset(mat, matPath);
273
+ set.material = mat;
274
+ return mat;
275
+ }
276
+
277
+ private static Material CreateLitMaterialAsset(string folderPath, string prefix, LitTextureSet set, Shader shader)
278
+ {
279
+ if (string.IsNullOrEmpty(prefix))
280
+ return null;
281
+
282
+ string matPath = AssetDatabase.GenerateUniqueAssetPath(Path.Combine(folderPath, prefix + ".mat"));
283
+ Material mat = new Material(shader);
284
+ if (set.baseMap != null)
285
+ {
286
+ AssignTextureIfAvailable(mat, "_BaseMap", set.baseMap);
287
+ ValidateAssignedTexture(mat, "_BaseMap", set.baseMap, prefix, "Base Map");
288
+ }
289
+ if (set.normalMap != null)
290
+ {
291
+ AssignTextureIfAvailable(mat, "_BumpMap", set.normalMap);
292
+ ValidateAssignedTexture(mat, "_BumpMap", set.normalMap, prefix, "Normal Map");
293
+ mat.EnableKeyword("_NORMALMAP");
294
+ }
295
+ if (set.maskMap != null)
296
+ {
297
+ AssignTextureIfAvailable(mat, "_MaskMap", set.maskMap);
298
+ AssignTextureIfAvailable(mat, "_MetallicGlossMap", set.maskMap);
299
+ AssignTextureIfAvailable(mat, "_OcclusionMap", set.maskMap);
300
+ ValidateAssignedTexture(mat, "_MaskMap", set.maskMap, prefix, "Mask Map");
301
+ ValidateAssignedTexture(mat, "_MetallicGlossMap", set.maskMap, prefix, "Metallic Map");
302
+ ValidateAssignedTexture(mat, "_OcclusionMap", set.maskMap, prefix, "Occlusion Map");
303
+ mat.EnableKeyword("_METALLICSPECGLOSSMAP");
304
+ mat.SetFloat("_Metallic", 1f);
305
+ mat.SetFloat("_OcclusionStrength", 1f);
306
+ }
307
+ if (set.emissionMap != null)
308
+ {
309
+ mat.SetTexture("_EmissionMap", set.emissionMap);
310
+ mat.EnableKeyword("_EMISSION");
311
+ mat.SetColor("_EmissionColor", Color.white);
312
+ }
313
+ AssetDatabase.CreateAsset(mat, matPath);
314
+ set.material = mat;
315
+ return mat;
316
+ }
317
+
318
+ private static void AssignTextureIfAvailable(Material material, string propertyName, Texture texture)
319
+ {
320
+ if (material.HasProperty(propertyName))
321
+ material.SetTexture(propertyName, texture);
322
+ }
323
+
324
+ private static void ValidateAssignedTexture(Material material, string propertyName, Texture expectedTexture, string materialPrefix, string channelName)
325
+ {
326
+ if (!material.HasProperty(propertyName))
327
+ {
328
+ Debug.LogWarning($"El material {materialPrefix} no tiene la propiedad {propertyName} esperada para asignar la textura {channelName}.");
329
+ return;
330
+ }
331
+
332
+ if (material.GetTexture(propertyName) != expectedTexture)
333
+ {
334
+ Debug.LogWarning($"No se pudo asignar correctamente la textura {channelName} al material {materialPrefix} en la propiedad {propertyName}.");
335
+ }
336
+ }
337
+
338
+ private static Shader FindShaderByName(string shaderName)
339
+ {
340
+ string[] guids = AssetDatabase.FindAssets(shaderName + " t:Shader");
341
+ if (guids != null && guids.Length > 0)
342
+ {
343
+ string path = AssetDatabase.GUIDToAssetPath(guids[0]);
344
+ return AssetDatabase.LoadAssetAtPath<Shader>(path);
345
+ }
346
+ Shader shader = Shader.Find(shaderName);
347
+ if (shader == null)
348
+ shader = Shader.Find("Shader Graphs/" + shaderName);
349
+ return shader;
350
+ }
351
+
352
+ private static string GetSelectedPathOrFallback()
353
+ {
354
+ string path = "Assets";
355
+
356
+ foreach (Object obj in Selection.GetFiltered(typeof(Object), SelectionMode.Assets))
357
+ {
358
+ path = AssetDatabase.GetAssetPath(obj);
359
+ if (!string.IsNullOrEmpty(path) && File.Exists(path))
360
+ {
361
+ path = Path.GetDirectoryName(path);
362
+ break;
363
+ }
364
+ }
365
+ return path;
366
+ }
367
+
368
+ private class TextureSet
369
+ {
370
+ public Texture2D baseMap;
371
+ public Texture2D normalMap;
372
+ public Texture2D metalSmoothMap;
373
+ public Texture2D occlusionMap;
374
+ public Material material;
375
+ }
376
+
377
+ private class LitTextureSet
378
+ {
379
+ public Texture2D baseMap;
380
+ public Texture2D normalMap;
381
+ public Texture2D emissionMap;
382
+ public Texture2D maskMap;
383
+ public Material material;
384
+ }
385
+ }
386
+
@@ -0,0 +1,11 @@
1
+ fileFormatVersion: 2
2
+ guid: 0cc53e5ec5db467288a0c990c729c42c
3
+ MonoImporter:
4
+ externalObjects: {}
5
+ serializedVersion: 2
6
+ defaultReferences: []
7
+ executionOrder: 0
8
+ icon: {instanceID: 0}
9
+ userData:
10
+ assetBundleName:
11
+ assetBundleVariant:
@@ -0,0 +1,63 @@
1
+ using UnityEditor;
2
+ using UnityEngine;
3
+ using System.IO;
4
+
5
+ public static class UnityMaterialsOrganizerRenamer
6
+ {
7
+ [MenuItem("Tools/JaimeCamachoDev/UnityFolders/Crear Material, Ordenar y Renombrar", false, 24)]
8
+ [MenuItem("Assets/JaimeCamachoDev/UnityFolders/Crear Material, Ordenar y Renombrar", false, 24)]
9
+ private static void CreateMaterialOrganizeAndRenameMenu()
10
+ {
11
+ string folderPath = GetSelectedPathOrFallback();
12
+
13
+ if (!AssetDatabase.IsValidFolder(folderPath))
14
+ {
15
+ Debug.LogWarning("Por favor selecciona una carpeta válida para crear materiales, organizar y renombrar.");
16
+ return;
17
+ }
18
+
19
+ CreateMaterialOrganizeAndRenameWizard.Show(folderPath);
20
+ }
21
+
22
+ private static string GetSelectedPathOrFallback()
23
+ {
24
+ string path = "Assets";
25
+
26
+ foreach (Object obj in Selection.GetFiltered(typeof(Object), SelectionMode.Assets))
27
+ {
28
+ path = AssetDatabase.GetAssetPath(obj);
29
+ if (!string.IsNullOrEmpty(path) && File.Exists(path))
30
+ {
31
+ path = Path.GetDirectoryName(path);
32
+ break;
33
+ }
34
+ }
35
+ return path;
36
+ }
37
+
38
+ private class CreateMaterialOrganizeAndRenameWizard : ScriptableWizard
39
+ {
40
+ public string newFolderName = "New Folder";
41
+ private string folderPath;
42
+
43
+ public static void Show(string folderPath)
44
+ {
45
+ var wizard = DisplayWizard<CreateMaterialOrganizeAndRenameWizard>(
46
+ "Crear Material, Ordenar y Renombrar", "Aplicar", "Cancelar");
47
+ wizard.folderPath = folderPath;
48
+ }
49
+
50
+ private void OnWizardCreate()
51
+ {
52
+ UnityMaterialsCreator.CreateMaterialsInFolder(folderPath);
53
+
54
+ string newFolderPath = UnityFolderOrganizer.OrganizeInChildFolder(folderPath, newFolderName);
55
+ if (string.IsNullOrEmpty(newFolderPath))
56
+ return;
57
+
58
+ UnityAssetsRenamer.RenameAssetsInFolder(newFolderPath);
59
+
60
+ Debug.Log($"Materiales creados, carpeta organizada y assets renombrados en {newFolderPath}.");
61
+ }
62
+ }
63
+ }
@@ -0,0 +1,11 @@
1
+ fileFormatVersion: 2
2
+ guid: 3c2bb0cf0a5e405c8dce7490ecbd8a5e
3
+ MonoImporter:
4
+ externalObjects: {}
5
+ serializedVersion: 2
6
+ defaultReferences: []
7
+ executionOrder: 0
8
+ icon: {instanceID: 0}
9
+ userData:
10
+ assetBundleName:
11
+ assetBundleVariant:
@@ -0,0 +1,58 @@
1
+ using UnityEditor;
2
+ using UnityEngine;
3
+ using System.IO;
4
+
5
+ public static class UnityOrganizeAndRenamer
6
+ {
7
+ [MenuItem("Tools/JaimeCamachoDev/UnityFolders/Ordenar y Renombrar", false, 22)]
8
+ [MenuItem("Assets/JaimeCamachoDev/UnityFolders/Ordenar y Renombrar", false, 22)]
9
+ private static void OrganizeAndRenameMenu()
10
+ {
11
+ string folderPath = GetSelectedPathOrFallback();
12
+
13
+ if (!AssetDatabase.IsValidFolder(folderPath))
14
+ {
15
+ Debug.LogWarning("Por favor selecciona una carpeta válida para organizar y renombrar.");
16
+ return;
17
+ }
18
+
19
+ OrganizeAndRenameWizard.Show(folderPath);
20
+ }
21
+
22
+ private static string GetSelectedPathOrFallback()
23
+ {
24
+ string path = "Assets";
25
+
26
+ foreach (Object obj in Selection.GetFiltered(typeof(Object), SelectionMode.Assets))
27
+ {
28
+ path = AssetDatabase.GetAssetPath(obj);
29
+ if (!string.IsNullOrEmpty(path) && File.Exists(path))
30
+ {
31
+ path = Path.GetDirectoryName(path);
32
+ break;
33
+ }
34
+ }
35
+ return path;
36
+ }
37
+
38
+ private class OrganizeAndRenameWizard : ScriptableWizard
39
+ {
40
+ public string newFolderName = "New Folder";
41
+ private string folderPath;
42
+
43
+ public static void Show(string folderPath)
44
+ {
45
+ var wizard = DisplayWizard<OrganizeAndRenameWizard>("Ordenar y Renombrar", "Aplicar", "Cancelar");
46
+ wizard.folderPath = folderPath;
47
+ }
48
+
49
+ private void OnWizardCreate()
50
+ {
51
+ string newFolderPath = UnityFolderOrganizer.OrganizeInChildFolder(folderPath, newFolderName);
52
+ if (!string.IsNullOrEmpty(newFolderPath))
53
+ {
54
+ UnityAssetsRenamer.RenameAssetsInFolder(newFolderPath);
55
+ }
56
+ }
57
+ }
58
+ }
@@ -0,0 +1,11 @@
1
+ fileFormatVersion: 2
2
+ guid: 898984cc15ea4c0e933e8d0de25d897f
3
+ MonoImporter:
4
+ externalObjects: {}
5
+ serializedVersion: 2
6
+ defaultReferences: []
7
+ executionOrder: 0
8
+ icon: {instanceID: 0}
9
+ userData:
10
+ assetBundleName:
11
+ assetBundleVariant:
@@ -0,0 +1,128 @@
1
+ using UnityEditor;
2
+ using UnityEngine;
3
+ using System.IO;
4
+
5
+ public static class UnityPrefabCreator
6
+ {
7
+ [MenuItem("Tools/JaimeCamachoDev/UnityFolders/Crear Prefab MAS", false, 25)]
8
+ [MenuItem("Assets/JaimeCamachoDev/UnityFolders/Crear Prefab MAS", false, 25)]
9
+ private static void CreatePrefabMASMenu()
10
+ {
11
+ string folderPath = GetSelectedPathOrFallback();
12
+
13
+ if (!AssetDatabase.IsValidFolder(folderPath))
14
+ {
15
+ Debug.LogWarning("Por favor selecciona una carpeta válida para crear el prefab.");
16
+ return;
17
+ }
18
+
19
+ CreatePrefabWizard.Show(folderPath, PrefabCreationMode.MAS);
20
+ }
21
+
22
+ [MenuItem("Tools/JaimeCamachoDev/UnityFolders/Crear Prefab LIT", false, 26)]
23
+ [MenuItem("Assets/JaimeCamachoDev/UnityFolders/Crear Prefab LIT", false, 26)]
24
+ private static void CreatePrefabLITMenu()
25
+ {
26
+ string folderPath = GetSelectedPathOrFallback();
27
+
28
+ if (!AssetDatabase.IsValidFolder(folderPath))
29
+ {
30
+ Debug.LogWarning("Por favor selecciona una carpeta válida para crear el prefab.");
31
+ return;
32
+ }
33
+
34
+ CreatePrefabWizard.Show(folderPath, PrefabCreationMode.LIT);
35
+ }
36
+
37
+ internal static void CreatePrefabsInFolder(string folderPath)
38
+ {
39
+ string meshFolder = Path.Combine(folderPath, "Mesh");
40
+ string prefabFolder = Path.Combine(folderPath, "Prefab");
41
+
42
+ if (!AssetDatabase.IsValidFolder(prefabFolder))
43
+ AssetDatabase.CreateFolder(folderPath, "Prefab");
44
+
45
+ string[] modelGuids = AssetDatabase.FindAssets("t:Model", new[] { meshFolder });
46
+ foreach (string guid in modelGuids)
47
+ {
48
+ string modelPath = AssetDatabase.GUIDToAssetPath(guid);
49
+ GameObject model = AssetDatabase.LoadAssetAtPath<GameObject>(modelPath);
50
+ if (model == null)
51
+ continue;
52
+
53
+ string prefix = model.name;
54
+ if (prefix.EndsWith("_Geo"))
55
+ prefix = prefix.Substring(0, prefix.Length - 4);
56
+
57
+ string prefabPath = AssetDatabase.GenerateUniqueAssetPath(Path.Combine(prefabFolder, prefix + ".prefab"));
58
+ GameObject instance = PrefabUtility.InstantiatePrefab(model) as GameObject;
59
+ instance.name = prefix;
60
+ PrefabUtility.SaveAsPrefabAsset(instance, prefabPath);
61
+ Object.DestroyImmediate(instance);
62
+ }
63
+
64
+ AssetDatabase.SaveAssets();
65
+ AssetDatabase.Refresh();
66
+ }
67
+
68
+ private static string GetSelectedPathOrFallback()
69
+ {
70
+ string path = "Assets";
71
+
72
+ foreach (Object obj in Selection.GetFiltered(typeof(Object), SelectionMode.Assets))
73
+ {
74
+ path = AssetDatabase.GetAssetPath(obj);
75
+ if (!string.IsNullOrEmpty(path) && File.Exists(path))
76
+ {
77
+ path = Path.GetDirectoryName(path);
78
+ break;
79
+ }
80
+ }
81
+ return path;
82
+ }
83
+
84
+ private enum PrefabCreationMode
85
+ {
86
+ MAS,
87
+ LIT
88
+ }
89
+
90
+ private class CreatePrefabWizard : ScriptableWizard
91
+ {
92
+ public string newFolderName = "New Folder";
93
+ private string folderPath;
94
+ private PrefabCreationMode mode;
95
+
96
+ public static void Show(string folderPath, PrefabCreationMode mode)
97
+ {
98
+ string title = mode == PrefabCreationMode.MAS ? "Crear Prefab MAS" : "Crear Prefab LIT";
99
+ var wizard = DisplayWizard<CreatePrefabWizard>(
100
+ title, "Aplicar", "Cancelar");
101
+ wizard.folderPath = folderPath;
102
+ wizard.mode = mode;
103
+ }
104
+
105
+ private void OnWizardCreate()
106
+ {
107
+ switch (mode)
108
+ {
109
+ case PrefabCreationMode.MAS:
110
+ UnityMaterialsCreator.CreateMaterialsInFolder(folderPath);
111
+ break;
112
+ case PrefabCreationMode.LIT:
113
+ UnityMaterialsCreator.CreateLitMaterialsInFolder(folderPath);
114
+ break;
115
+ }
116
+
117
+ string newFolderPath = UnityFolderOrganizer.OrganizeInChildFolder(folderPath, newFolderName);
118
+ if (string.IsNullOrEmpty(newFolderPath))
119
+ return;
120
+
121
+ UnityAssetsRenamer.RenameAssetsInFolder(newFolderPath);
122
+
123
+ CreatePrefabsInFolder(newFolderPath);
124
+
125
+ Debug.Log($"Materiales, prefab y assets listos en {newFolderPath}.");
126
+ }
127
+ }
128
+ }
@@ -0,0 +1,11 @@
1
+ fileFormatVersion: 2
2
+ guid: 8e992ca32bbc488eb8897cd8b7d5b6fa
3
+ MonoImporter:
4
+ externalObjects: {}
5
+ serializedVersion: 2
6
+ defaultReferences: []
7
+ executionOrder: 0
8
+ icon: {instanceID: 0}
9
+ userData:
10
+ assetBundleName:
11
+ assetBundleVariant: