Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using Boo.Lang;
- using UnityEditor;
- using UnityEngine;
- namespace BaseAssets.Tools
- {
- public class MaterialSwapperEditor : EditorWindow
- {
- private GameObject source;
- private List<GameObject> currentGameObjects;
- private List<List<Material>> currentMaterials;
- private List<Material> uniqueMaterials;
- private List<Material> uniqueAssigneeMaterials;
- [MenuItem("Project Tools/Material Swapper")]
- private static void ShowWindow()
- {
- var window = GetWindow<MaterialSwapperEditor>();
- window.titleContent = new GUIContent("Material Swapper");
- window.Show();
- }
- private void OnGUI()
- {
- source = (GameObject) EditorGUILayout.ObjectField("Source", source, typeof(GameObject));
- if (GUILayout.Button("Pull"))
- {
- currentGameObjects = new List<GameObject>();
- currentMaterials = new List<List<Material>>();
- uniqueMaterials = new List<Material>();
- uniqueAssigneeMaterials = new List<Material>();
- Transform[] allChildren = source.GetComponentsInChildren<Transform>();
- foreach (Transform child in allChildren)
- {
- if (child.GetComponent<SkinnedMeshRenderer>())
- {
- currentGameObjects.Add(child.gameObject);
- currentMaterials.Add(new List<Material>());
- for (int i = 0; i < child.GetComponent<SkinnedMeshRenderer>().sharedMaterials.Length; i++)
- {
- currentMaterials[currentMaterials.Count - 1].Add(child.GetComponent<SkinnedMeshRenderer>().sharedMaterials[i]);
- if (!uniqueMaterials.Contains(child.GetComponent<SkinnedMeshRenderer>().sharedMaterials[i]))
- {
- uniqueMaterials.Add(child.GetComponent<SkinnedMeshRenderer>().sharedMaterials[i]);
- uniqueAssigneeMaterials.Add(child.GetComponent<SkinnedMeshRenderer>().sharedMaterials[i]);
- }
- }
- }
- }
- }
- if (currentGameObjects == null) return;
- if (currentMaterials == null) return;
- if (uniqueMaterials == null) return;
- if (uniqueAssigneeMaterials == null) return;
- for (int i = 0; i < currentMaterials.Count; i++)
- {
- GUI.enabled = false;
- EditorGUILayout.ObjectField(currentGameObjects[i], typeof(GameObject));
- GUI.enabled = true;
- for (int j = 0; j < currentMaterials[i].Count; j++)
- {
- EditorGUILayout.ObjectField(currentMaterials[i][j], typeof(Material));
- }
- }
- EditorGUILayout.Space();
- for (int i = 0; i < uniqueMaterials.Count; i++)
- {
- EditorGUILayout.BeginHorizontal();
- EditorGUILayout.ObjectField(uniqueMaterials[i], typeof(Material));
- uniqueAssigneeMaterials[i] = (Material) EditorGUILayout.ObjectField(uniqueAssigneeMaterials[i], typeof(Material));
- EditorGUILayout.EndHorizontal();
- }
- if (GUILayout.Button("Swap"))
- {
- Undo.RecordObject(source, "Swapped Materials");
- Transform[] allChildren = source.GetComponentsInChildren<Transform>();
- foreach (Transform child in allChildren)
- {
- if (child.GetComponent<SkinnedMeshRenderer>())
- {
- for (int i = 0; i < child.GetComponent<SkinnedMeshRenderer>().sharedMaterials.Length; i++)
- {
- for (int j = 0; j < uniqueMaterials.Count; j++)
- {
- Material[] materials = child.GetComponent<SkinnedMeshRenderer>().sharedMaterials;
- if (child.GetComponent<SkinnedMeshRenderer>().sharedMaterials[i] == uniqueMaterials[j])
- {
- materials[i] = uniqueAssigneeMaterials[j];
- }
- child.GetComponent<SkinnedMeshRenderer>().sharedMaterials = materials;
- }
- }
- }
- }
- bool uneven = false;
- if (uniqueAssigneeMaterials.Count == uniqueMaterials.Count)
- {
- for (int i = 0; i < uniqueAssigneeMaterials.Count; i++)
- {
- uniqueAssigneeMaterials[i] = uniqueMaterials[i];
- }
- }
- else
- {
- uniqueAssigneeMaterials = new List<Material>();
- uneven = true;
- }
- currentGameObjects = new List<GameObject>();
- currentMaterials = new List<List<Material>>();
- uniqueMaterials = new List<Material>();
- Transform[] allChildren2 = source.GetComponentsInChildren<Transform>();
- foreach (Transform child in allChildren2)
- {
- if (child.GetComponent<SkinnedMeshRenderer>())
- {
- currentGameObjects.Add(child.gameObject);
- currentMaterials.Add(new List<Material>());
- for (int i = 0; i < child.GetComponent<SkinnedMeshRenderer>().sharedMaterials.Length; i++)
- {
- currentMaterials[currentMaterials.Count - 1].Add(child.GetComponent<SkinnedMeshRenderer>().sharedMaterials[i]);
- if (!uniqueMaterials.Contains(child.GetComponent<SkinnedMeshRenderer>().sharedMaterials[i]))
- {
- uniqueMaterials.Add(child.GetComponent<SkinnedMeshRenderer>().sharedMaterials[i]);
- if(uneven) uniqueAssigneeMaterials.Add(child.GetComponent<SkinnedMeshRenderer>().sharedMaterials[i]);
- }
- }
- }
- }
- Undo.FlushUndoRecordObjects();
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement