Advertisement
Guest User

Untitled

a guest
Oct 21st, 2019
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.59 KB | None | 0 0
  1. using Boo.Lang;
  2. using UnityEditor;
  3. using UnityEngine;
  4.  
  5. namespace BaseAssets.Tools
  6. {
  7. public class MaterialSwapperEditor : EditorWindow
  8. {
  9. private GameObject source;
  10.  
  11. private List<GameObject> currentGameObjects;
  12. private List<List<Material>> currentMaterials;
  13. private List<Material> uniqueMaterials;
  14. private List<Material> uniqueAssigneeMaterials;
  15.  
  16. [MenuItem("Project Tools/Material Swapper")]
  17. private static void ShowWindow()
  18. {
  19. var window = GetWindow<MaterialSwapperEditor>();
  20. window.titleContent = new GUIContent("Material Swapper");
  21. window.Show();
  22. }
  23.  
  24. private void OnGUI()
  25. {
  26. source = (GameObject) EditorGUILayout.ObjectField("Source", source, typeof(GameObject));
  27.  
  28. if (GUILayout.Button("Pull"))
  29. {
  30. currentGameObjects = new List<GameObject>();
  31. currentMaterials = new List<List<Material>>();
  32. uniqueMaterials = new List<Material>();
  33. uniqueAssigneeMaterials = new List<Material>();
  34.  
  35. Transform[] allChildren = source.GetComponentsInChildren<Transform>();
  36. foreach (Transform child in allChildren)
  37. {
  38. if (child.GetComponent<SkinnedMeshRenderer>())
  39. {
  40. currentGameObjects.Add(child.gameObject);
  41. currentMaterials.Add(new List<Material>());
  42. for (int i = 0; i < child.GetComponent<SkinnedMeshRenderer>().sharedMaterials.Length; i++)
  43. {
  44. currentMaterials[currentMaterials.Count - 1].Add(child.GetComponent<SkinnedMeshRenderer>().sharedMaterials[i]);
  45.  
  46. if (!uniqueMaterials.Contains(child.GetComponent<SkinnedMeshRenderer>().sharedMaterials[i]))
  47. {
  48. uniqueMaterials.Add(child.GetComponent<SkinnedMeshRenderer>().sharedMaterials[i]);
  49. uniqueAssigneeMaterials.Add(child.GetComponent<SkinnedMeshRenderer>().sharedMaterials[i]);
  50. }
  51. }
  52. }
  53. }
  54. }
  55.  
  56. if (currentGameObjects == null) return;
  57. if (currentMaterials == null) return;
  58. if (uniqueMaterials == null) return;
  59. if (uniqueAssigneeMaterials == null) return;
  60.  
  61. for (int i = 0; i < currentMaterials.Count; i++)
  62. {
  63. GUI.enabled = false;
  64. EditorGUILayout.ObjectField(currentGameObjects[i], typeof(GameObject));
  65. GUI.enabled = true;
  66.  
  67. for (int j = 0; j < currentMaterials[i].Count; j++)
  68. {
  69. EditorGUILayout.ObjectField(currentMaterials[i][j], typeof(Material));
  70. }
  71. }
  72.  
  73. EditorGUILayout.Space();
  74.  
  75. for (int i = 0; i < uniqueMaterials.Count; i++)
  76. {
  77. EditorGUILayout.BeginHorizontal();
  78. EditorGUILayout.ObjectField(uniqueMaterials[i], typeof(Material));
  79. uniqueAssigneeMaterials[i] = (Material) EditorGUILayout.ObjectField(uniqueAssigneeMaterials[i], typeof(Material));
  80. EditorGUILayout.EndHorizontal();
  81. }
  82.  
  83. if (GUILayout.Button("Swap"))
  84. {
  85. Undo.RecordObject(source, "Swapped Materials");
  86.  
  87. Transform[] allChildren = source.GetComponentsInChildren<Transform>();
  88. foreach (Transform child in allChildren)
  89. {
  90. if (child.GetComponent<SkinnedMeshRenderer>())
  91. {
  92. for (int i = 0; i < child.GetComponent<SkinnedMeshRenderer>().sharedMaterials.Length; i++)
  93. {
  94. for (int j = 0; j < uniqueMaterials.Count; j++)
  95. {
  96. Material[] materials = child.GetComponent<SkinnedMeshRenderer>().sharedMaterials;
  97.  
  98. if (child.GetComponent<SkinnedMeshRenderer>().sharedMaterials[i] == uniqueMaterials[j])
  99. {
  100. materials[i] = uniqueAssigneeMaterials[j];
  101. }
  102.  
  103. child.GetComponent<SkinnedMeshRenderer>().sharedMaterials = materials;
  104. }
  105. }
  106. }
  107. }
  108.  
  109. bool uneven = false;
  110. if (uniqueAssigneeMaterials.Count == uniqueMaterials.Count)
  111. {
  112. for (int i = 0; i < uniqueAssigneeMaterials.Count; i++)
  113. {
  114. uniqueAssigneeMaterials[i] = uniqueMaterials[i];
  115. }
  116. }
  117. else
  118. {
  119. uniqueAssigneeMaterials = new List<Material>();
  120. uneven = true;
  121. }
  122.  
  123.  
  124. currentGameObjects = new List<GameObject>();
  125. currentMaterials = new List<List<Material>>();
  126. uniqueMaterials = new List<Material>();
  127.  
  128. Transform[] allChildren2 = source.GetComponentsInChildren<Transform>();
  129. foreach (Transform child in allChildren2)
  130. {
  131. if (child.GetComponent<SkinnedMeshRenderer>())
  132. {
  133. currentGameObjects.Add(child.gameObject);
  134. currentMaterials.Add(new List<Material>());
  135. for (int i = 0; i < child.GetComponent<SkinnedMeshRenderer>().sharedMaterials.Length; i++)
  136. {
  137. currentMaterials[currentMaterials.Count - 1].Add(child.GetComponent<SkinnedMeshRenderer>().sharedMaterials[i]);
  138.  
  139. if (!uniqueMaterials.Contains(child.GetComponent<SkinnedMeshRenderer>().sharedMaterials[i]))
  140. {
  141. uniqueMaterials.Add(child.GetComponent<SkinnedMeshRenderer>().sharedMaterials[i]);
  142. if(uneven) uniqueAssigneeMaterials.Add(child.GetComponent<SkinnedMeshRenderer>().sharedMaterials[i]);
  143. }
  144. }
  145. }
  146. }
  147.  
  148. Undo.FlushUndoRecordObjects();
  149. }
  150. }
  151. }
  152. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement