SHARE
TWEET

Untitled

a guest Oct 21st, 2019 74 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top