/// <summary> /// Set existing numbers based on the naming scheme set in the project settings /// </summary> /// <param name="objects">The list of objects to get the names from</param> /// <param name="ExistingNumbers">The list of ExistingNumbers to set</param> /// <param name="namingScheme">The naming scheme to use</param> void SetExistingNumbers(List <GameObject> objects, List <int> ExistingNumbers, EditorSettings.NamingScheme namingScheme) { foreach (GameObject obj in objects) { string name = obj.name; if (name.Contains(prefab.name) && name.Any(char.IsDigit)) { int num = 0; switch (namingScheme) { case EditorSettings.NamingScheme.SpaceParenthesis: char[] charsToTrim = { '(', ')' }; num = GetExistingNumber(name, name.Split(' '), charsToTrim); break; case EditorSettings.NamingScheme.Dot: num = GetExistingNumber(name, name.Split('.')); break; case EditorSettings.NamingScheme.Underscore: num = GetExistingNumber(name, name.Split('_')); break; } if (num != 0) { ExistingNumbers.Add(num); } else { Debug.LogError("The selected object cannot be renamed, as there are several naming schemes used"); } } } }
/// <summary> /// Gets the currently selected game objects. /// </summary> void GetSelection() { namingScheme = EditorSettings.gameObjectNamingScheme; if (editMode && Selection.activeGameObject != null && (prefab == null || (!SearchWithTag && !SearchWithLayer))) { if (prefab == null) // get the prefab 1st { PrefabAssetType t = PrefabUtility.GetPrefabAssetType(Selection.activeGameObject); if (t == PrefabAssetType.Regular || t == PrefabAssetType.Variant) { prefab = Selection.activeGameObject; oldPrefab = Selection.activeGameObject; } } else // get the other objects { ResetPreview(); objectPreview.Clear(); objectsToReplace.Clear(); foreach (var obj in Selection.gameObjects) { if (obj != prefab) { objectsToReplace.Add(obj); } } } } if (editMode && prefab != null && (SearchWithTag || SearchWithLayer)) { if (SearchWithTag) { ResetPreview(); objectPreview.Clear(); objectsToReplace.Clear(); GameObject[] allGameObjects = GameObject.FindObjectsOfType <GameObject>(); foreach (var gg in allGameObjects) { if (gg.tag == TagForSearch) { if (gg != prefab) { objectsToReplace.Add(gg); } } } } else if (SearchWithLayer) { ResetPreview(); objectPreview.Clear(); objectsToReplace.Clear(); GameObject[] allGameObjects = GameObject.FindObjectsOfType <GameObject>(); foreach (var gg in allGameObjects) { if (gg.layer == LayerForSearch) { if (gg != prefab) { objectsToReplace.Add(gg); } } } } } else if (editMode && Selection.activeGameObject == null && prefab != null && !SearchWithTag && !SearchWithLayer) { ResetPreview(); objectPreview.Clear(); objectsToReplace.Clear(); } }
/// <summary> /// Draws the window content: object list, configuration and execution buttons. /// </summary> void OnGUI() { #region Draw Top Buttons GUILayout.BeginHorizontal(EditorStyles.toolbar); { editMode = GUILayout.Toggle(editMode, new GUIContent("Start replacing", "Start using this feature"), EditorStyles.toggle); GUILayout.FlexibleSpace(); } GUILayout.EndHorizontal(); #endregion #region "TAG LAYER" SearchWithTag = GUILayout.Toggle(!SearchWithLayer ? SearchWithTag : false, "Apply Search By Tag", EditorStyles.toggle); SearchWithLayer = GUILayout.Toggle(!SearchWithTag ? SearchWithLayer : false, "Apply Search By Layer"); if (SearchWithTag) { GUILayout.Space(5); TagForSearch = EditorGUILayout.TagField("Set tag : ", TagForSearch); } else if (SearchWithLayer) { GUILayout.Space(5); LayerForSearch = EditorGUILayout.LayerField("Set layer : ", LayerForSearch); } #endregion "TAG LAYER" if (GUI.changed) { if (editMode) { GetSelection(); } else { ResetPreview(); } } GUILayout.Space(10); if (editMode) { namingScheme = EditorSettings.gameObjectNamingScheme; RenamePreview(); #region Draw Prefab and List GUILayout.Label("Prefab: ", EditorStyles.boldLabel); prefab = (GameObject)EditorGUILayout.ObjectField(prefab, typeof(GameObject), true); if (oldPrefab != prefab) { GetSelection(); oldPrefab = prefab; } GUILayout.Space(10); if (prefab != null) { if (objectsToReplace.Count > 0) { GUILayout.Label(new GUIContent("Objects to be Replaced:", (!SearchWithTag && !SearchWithLayer) ? "Multi-select all the objects you want to replace with your Prefab" : ""), EditorStyles.boldLabel); objectPreview.Sort(new NaturalComparer()); scrollPosition = GUILayout.BeginScrollView(scrollPosition, EditorStyles.helpBox); { GUILayout.BeginHorizontal(EditorStyles.helpBox); { string previewText = "No Preview"; if (replacementPreferences.renameObjects && !replacementPreferences.orderHierarchyToPreview) { previewText = "Preview of Renaming"; } else if (replacementPreferences.orderHierarchyToPreview && !replacementPreferences.renameObjects) { previewText = "Preview of Hierarchy Order"; } else if (replacementPreferences.orderHierarchyToPreview && replacementPreferences.renameObjects) { previewText = "Preview of Renaming and Hierarchy Order"; } GUILayout.Label(previewText, EditorStyles.miniLabel); } GUILayout.EndHorizontal(); foreach (string go in objectPreview) { GUILayout.BeginHorizontal(EditorStyles.toolbar); GUILayout.Label(go); GUILayout.EndHorizontal(); } GUILayout.Space(2); } GUILayout.EndScrollView(); GUILayout.Space(5); replacementPreferences.renameObjects = GUILayout.Toggle(replacementPreferences.renameObjects, "Rename replaced objects", EditorStyles.toggle); replacementPreferences.orderHierarchyToPreview = GUILayout.Toggle(replacementPreferences.orderHierarchyToPreview, "Oder hierarchy to preview", EditorStyles.toggle); GUILayout.Space(10); replacementPreferences.applyRotation = GUILayout.Toggle(replacementPreferences.applyRotation, "Apply rotation", EditorStyles.toggle); replacementPreferences.applyScale = GUILayout.Toggle(replacementPreferences.applyScale, "Apply scale", EditorStyles.toggle); } else if (!SearchWithTag && !SearchWithLayer) { GUILayout.Label(new GUIContent("Multi-select all the objects you want to replace with your Prefab"), EditorStyles.boldLabel); } } else { GUILayout.Label("Select a Prefab to replace objects with", EditorStyles.boldLabel); } #endregion #region Draw Bottom Buttons GUILayout.Space(5); GUILayout.BeginHorizontal(); { if (prefab != null && objectsToReplace.Count > 0) { if (GUILayout.Button("Apply")) { foreach (GameObject go in objectsToReplace) { Replace(go); DestroyImmediate(go); } if (replacementPreferences.renameObjects) { Rename(); } editMode = false; EditorSceneManager.MarkSceneDirty(EditorSceneManager.GetActiveScene()); // Important so that we don't forget to save! } else if (GUILayout.Button("Cancel")) { objectsToReplace.Clear(); objectPreview.Clear(); ResetPreview(); prefab = null; } } } GUILayout.EndHorizontal(); #endregion } else { objectsToReplace.Clear(); objectPreview.Clear(); newObjects.Clear(); prefab = null; } }