568 lines
22 KiB
C#
568 lines
22 KiB
C#
#if UNITY_EDITOR
|
|
using MonKey.Extensions;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text.RegularExpressions;
|
|
using UnityEditor;
|
|
using UnityEngine;
|
|
using Object = UnityEngine.Object;
|
|
|
|
namespace MonKey.Editor.Commands
|
|
{
|
|
public static class NamingUtilities
|
|
{
|
|
[Command("Sort By Name", "Sort all the selected GameObjects by name in the hierarchy",
|
|
DefaultValidation = DefaultValidation.AT_LEAST_TWO_GAME_OBJECTS, QuickName = "SN",
|
|
Category = "Naming")]
|
|
public static void SortByName()
|
|
{
|
|
List<GameObject> freeObjects = new List<GameObject>();
|
|
Dictionary<Transform, List<GameObject>> selectedObjectsByParent
|
|
= new Dictionary<Transform, List<GameObject>>();
|
|
|
|
int undoID = MonkeyEditorUtils.CreateUndoGroup("Order Siblings");
|
|
foreach (GameObject gameObject in Selection.gameObjects)
|
|
{
|
|
Transform parent = gameObject.transform.parent;
|
|
if (parent == null)
|
|
freeObjects.Add(gameObject);
|
|
else if (selectedObjectsByParent.ContainsKey(parent))
|
|
{
|
|
selectedObjectsByParent[parent].Add(gameObject);
|
|
}
|
|
else
|
|
{
|
|
selectedObjectsByParent.Add(parent, new List<GameObject>());
|
|
selectedObjectsByParent[parent].Add(gameObject);
|
|
}
|
|
}
|
|
|
|
SortSiblings(freeObjects);
|
|
foreach (List<GameObject> gameObjects in selectedObjectsByParent.Values)
|
|
{
|
|
SortSiblings(gameObjects);
|
|
}
|
|
|
|
Undo.CollapseUndoOperations(undoID);
|
|
}
|
|
|
|
private static void SortSiblings(List<GameObject> siblings)
|
|
{
|
|
siblings.Sort(new GameObjectComparer());
|
|
for (int i = 0; i < siblings.Count; i++)
|
|
{
|
|
if (siblings[i].transform.parent)
|
|
Undo.RegisterFullObjectHierarchyUndo(siblings[i].transform.parent,
|
|
"Sibling Index");
|
|
else
|
|
{
|
|
Undo.RegisterFullObjectHierarchyUndo(siblings[i], "Sibling Index");
|
|
}
|
|
|
|
siblings[i].transform.SetSiblingIndex(i);
|
|
}
|
|
}
|
|
|
|
[Command("Nicify Name",
|
|
"Changes a c# name type to a name containing spaces and easier to read",
|
|
QuickName = "NN", DefaultValidation = DefaultValidation.AT_LEAST_ONE_OBJECT,
|
|
Category = "Naming")]
|
|
public static void NicifyName()
|
|
{
|
|
List<string> newNames = new List<string>();
|
|
|
|
foreach (var o in MonkeyEditorUtils.OrderedSelectedObjects)
|
|
{
|
|
newNames.Add(o.name.NicifyVariableName());
|
|
}
|
|
|
|
RenameSelection(newNames.ToArray());
|
|
}
|
|
|
|
[Command("Remove Unity Duplicate Terms",
|
|
"Removes the terms created in the names of the selected objects when you duplicate an object",
|
|
QuickName = "RUD", DefaultValidation = DefaultValidation.AT_LEAST_ONE_OBJECT,
|
|
Category = "Naming")]
|
|
public static void RenameRemoveUnityDuplicateTerms()
|
|
{
|
|
List<string> newNames = new List<string>();
|
|
|
|
foreach (var o in MonkeyEditorUtils.OrderedSelectedObjects)
|
|
{
|
|
newNames.Add(StringExt.RemoveUnityCloneTerms(o.name));
|
|
}
|
|
|
|
RenameSelection(newNames.ToArray());
|
|
}
|
|
|
|
[Command("Rename Replace Term", "Replaces a term by another one in the names of the objects selected",
|
|
DefaultValidation = DefaultValidation.AT_LEAST_ONE_OBJECT, QuickName = "RRT",
|
|
MenuItemLink = "RenameReplace", MenuItemLinkTypeOwner = "MonkeyMenuItems",
|
|
Category = "Naming")]
|
|
public static void ReplaceNameTerm(
|
|
[CommandParameter(Help = "The term to look for in the name")]
|
|
string termToLookFor,
|
|
[CommandParameter(Help = "The text that will replace the " +
|
|
"term you are looking for (by default will just remove it)")]
|
|
string toReplaceWith = "",
|
|
[CommandParameter(Help = "if true, will consider capital letters as normal letters")]
|
|
bool ignoreCase = true)
|
|
{
|
|
int undoID = MonkeyEditorUtils.CreateUndoGroup("Replace in Names");
|
|
int i = 0;
|
|
foreach (Object o in MonkeyEditorUtils.OrderedSelectedObjects)
|
|
{
|
|
if (EditorUtility.DisplayCancelableProgressBar("Replacing Terms in name...",
|
|
"MonKey is renaming the objects, please wait!",
|
|
(float) i / MonkeyEditorUtils.OrderedSelectedObjects.Count()))
|
|
break;
|
|
|
|
Undo.RecordObject(o, "renaming");
|
|
|
|
string finalReplacement = toReplaceWith;
|
|
|
|
if (AssetDatabase.Contains(o))
|
|
{
|
|
finalReplacement = finalReplacement.GetSafeForFileName();
|
|
}
|
|
|
|
o.RenameObjectAndAsset(o.name.Replace(termToLookFor, finalReplacement, ignoreCase));
|
|
i++;
|
|
}
|
|
|
|
EditorUtility.ClearProgressBar();
|
|
|
|
Undo.CollapseUndoOperations(undoID);
|
|
}
|
|
|
|
[Command("Rename", "Renames all the selected objects with new names specified",
|
|
DefaultValidation = DefaultValidation.AT_LEAST_ONE_OBJECT, QuickName = "R",
|
|
MenuItemLink = "RenameSelection", MenuItemLinkTypeOwner = "MonkeyMenuItems",
|
|
Category = "Naming")]
|
|
public static void RenameSelection(
|
|
[CommandParameter(Help = "The Names to use (if less names than select objects, will loop)")]
|
|
string[] newNames)
|
|
{
|
|
int i = 0;
|
|
int j = 0;
|
|
int undoID = MonkeyEditorUtils.CreateUndoGroup("Selection Rename");
|
|
foreach (var o in MonkeyEditorUtils.OrderedSelectedObjects)
|
|
{
|
|
if (!o)
|
|
continue;
|
|
|
|
if (i >= newNames.Length)
|
|
i = 0;
|
|
|
|
if (EditorUtility.DisplayCancelableProgressBar("Renaming Selection...",
|
|
"MonKey is renaming the objects, please wait!",
|
|
(float) j / MonkeyEditorUtils.OrderedSelectedObjects.Count()))
|
|
break;
|
|
|
|
Undo.RecordObject(o, "renaming");
|
|
|
|
o.RenameObjectAndAsset(newNames[i]);
|
|
|
|
i++;
|
|
j++;
|
|
}
|
|
|
|
EditorUtility.ClearProgressBar();
|
|
|
|
Undo.CollapseUndoOperations(undoID);
|
|
}
|
|
|
|
[Command("Fix Asset Names", QuickName = "FAN",
|
|
Help = "Renames the assets selected so that the file name is the same as the object name",
|
|
DefaultValidation = DefaultValidation.AT_LEAST_ONE_OBJECT,
|
|
Category = "Naming")]
|
|
public static void FixAssetNames()
|
|
{
|
|
int i = 0;
|
|
foreach (var o in Selection.objects)
|
|
{
|
|
if (EditorUtility.DisplayCancelableProgressBar("Fixing Asset Names...",
|
|
"MonKey is renaming the objects, please wait!",
|
|
(float) i / Selection.objects.Count()))
|
|
break;
|
|
|
|
if (AssetDatabase.Contains(o))
|
|
{
|
|
AssetDatabase.RenameAsset(AssetDatabase.GetAssetPath(o), o.name);
|
|
}
|
|
|
|
i++;
|
|
}
|
|
|
|
EditorUtility.ClearProgressBar();
|
|
}
|
|
|
|
[Command("Rename Replace Terms Progressive",
|
|
"Replaces a term by a different one for each selected objects names", QuickName = "RPT",
|
|
DefaultValidation = DefaultValidation.AT_LEAST_ONE_OBJECT,
|
|
Category = "Naming")]
|
|
public static void ReplaceNameTerm(
|
|
[CommandParameter(Help = "The term to look for in the name")]
|
|
string termToLookFor,
|
|
[CommandParameter(Help = "The texts that will replace the " +
|
|
"term, one by one (and then looped to the start if less terms than objects ")]
|
|
string[] toReplaceWith,
|
|
[CommandParameter(Help = "if true, will consider capital letters as normal letters")]
|
|
bool ignoreCase = true)
|
|
{
|
|
int undoID = MonkeyEditorUtils.CreateUndoGroup("Replace in Names");
|
|
int i = 0;
|
|
int j = 0;
|
|
|
|
foreach (Object o in MonkeyEditorUtils.OrderedSelectedObjects)
|
|
{
|
|
Undo.RecordObject(o, "renaming");
|
|
|
|
if (i >= toReplaceWith.Length)
|
|
i -= toReplaceWith.Length;
|
|
|
|
if (EditorUtility.DisplayCancelableProgressBar("Renaming Selection...",
|
|
"MonKey is renaming the objects, please wait!",
|
|
(float) j / MonkeyEditorUtils.OrderedSelectedObjects.Count()))
|
|
break;
|
|
|
|
string finalReplacement = toReplaceWith[i];
|
|
|
|
if (AssetDatabase.Contains(o))
|
|
finalReplacement = finalReplacement.GetSafeForFileName();
|
|
|
|
o.RenameObjectAndAsset(o.name.Replace(termToLookFor, finalReplacement, ignoreCase));
|
|
|
|
i++;
|
|
j++;
|
|
}
|
|
|
|
EditorUtility.ClearProgressBar();
|
|
Undo.CollapseUndoOperations(undoID);
|
|
}
|
|
|
|
|
|
[Command("Rename From Last", "Replaces text from the last occurrence of a specified term",
|
|
QuickName = "RL", DefaultValidation = DefaultValidation.AT_LEAST_ONE_OBJECT,
|
|
Category = "Naming")]
|
|
public static void ReplaceNameFromLast(
|
|
[CommandParameter(Help = "The last tern from which the replacement will apply (term included)")]
|
|
string lastTermSeparator = " ",
|
|
[CommandParameter(Help = "The text to replace the end of the name with")]
|
|
string replacement = "")
|
|
{
|
|
int undoID = MonkeyEditorUtils.CreateUndoGroup("Replace after in Names");
|
|
int i = 0;
|
|
foreach (Object o in MonkeyEditorUtils.OrderedSelectedObjects)
|
|
{
|
|
Undo.RecordObject(o, "renaming");
|
|
|
|
if (EditorUtility.DisplayCancelableProgressBar("Renaming Selection...",
|
|
"MonKey is renaming the objects, please wait!",
|
|
(float) i / MonkeyEditorUtils.OrderedSelectedObjects.Count()))
|
|
break;
|
|
|
|
string finalReplacement = o.name.ReplaceFromLast(lastTermSeparator, replacement);
|
|
|
|
if (AssetDatabase.Contains(o))
|
|
finalReplacement = finalReplacement.GetSafeForFileName();
|
|
|
|
o.RenameObjectAndAsset(finalReplacement);
|
|
i++;
|
|
}
|
|
|
|
EditorUtility.ClearProgressBar();
|
|
Undo.CollapseUndoOperations(undoID);
|
|
}
|
|
|
|
[Command("Rename After Last", "Replaces text after the last occurrence of a specified term",
|
|
QuickName = "RAL", DefaultValidation = DefaultValidation.AT_LEAST_ONE_OBJECT,
|
|
Category = "Naming")]
|
|
public static void ReplaceNameAfterLast(
|
|
[CommandParameter(Help = "The last term after which the replacement will apply (term included)")]
|
|
string lastTermSeparator = " ",
|
|
[CommandParameter(Help = "The text to replace the end of the name with")]
|
|
string replacement = "")
|
|
{
|
|
int undoID = MonkeyEditorUtils.CreateUndoGroup("Replace after in Names");
|
|
int i = 0;
|
|
foreach (Object o in MonkeyEditorUtils.OrderedSelectedObjects)
|
|
{
|
|
Undo.RecordObject(o, "renaming");
|
|
|
|
if (EditorUtility.DisplayCancelableProgressBar("Renaming Selection...",
|
|
"MonKey is renaming the objects, please wait!",
|
|
(float) i / MonkeyEditorUtils.OrderedSelectedObjects.Count()))
|
|
break;
|
|
|
|
string finalReplacement = o.name.ReplaceAfterLast(lastTermSeparator, replacement);
|
|
|
|
if (AssetDatabase.Contains(o))
|
|
finalReplacement = finalReplacement.GetSafeForFileName();
|
|
|
|
o.RenameObjectAndAsset(finalReplacement);
|
|
i++;
|
|
}
|
|
|
|
EditorUtility.ClearProgressBar();
|
|
|
|
Undo.CollapseUndoOperations(undoID);
|
|
}
|
|
|
|
|
|
[Command("Rename From First", "Replaces text from the first occurrence of a specified term",
|
|
QuickName = "RF", DefaultValidation = DefaultValidation.AT_LEAST_ONE_OBJECT,
|
|
Category = "Naming")]
|
|
public static void ReplaceNameFromFirst(
|
|
[CommandParameter(Help = "The first term from which the replacement will apply (term included)")]
|
|
string lastTermSeparator = " ",
|
|
[CommandParameter(Help = "The text to replace the end of the name with")]
|
|
string replacement = "")
|
|
{
|
|
int undoID = MonkeyEditorUtils.CreateUndoGroup("Replace after in Names");
|
|
int i = 0;
|
|
foreach (Object o in MonkeyEditorUtils.OrderedSelectedObjects)
|
|
{
|
|
Undo.RecordObject(o, "renaming");
|
|
|
|
if (EditorUtility.DisplayCancelableProgressBar("Renaming Selection...",
|
|
"MonKey is renaming the objects, please wait!",
|
|
(float) i / MonkeyEditorUtils.OrderedSelectedObjects.Count()))
|
|
break;
|
|
|
|
string finalReplacement = o.name.ReplaceFromFirst(lastTermSeparator, replacement);
|
|
|
|
if (AssetDatabase.Contains(o))
|
|
finalReplacement = finalReplacement.GetSafeForFileName();
|
|
|
|
o.RenameObjectAndAsset(finalReplacement);
|
|
i++;
|
|
}
|
|
|
|
EditorUtility.ClearProgressBar();
|
|
|
|
Undo.CollapseUndoOperations(undoID);
|
|
}
|
|
|
|
[Command("Rename Until", QuickName = "RE",
|
|
Help = "Replaces text until the first occurrence of a specified term",
|
|
DefaultValidation = DefaultValidation.AT_LEAST_ONE_OBJECT,
|
|
Category = "Naming")]
|
|
public static void ReplaceNameUntilFirst(
|
|
[CommandParameter(Help = "The first term until which the replacement will apply")]
|
|
string term = " ",
|
|
[CommandParameter(Help = "The text to replace the start of the name with")]
|
|
string replacement = "")
|
|
{
|
|
int undoID = MonkeyEditorUtils.CreateUndoGroup("Replace before in Names");
|
|
int i = 0;
|
|
foreach (Object o in MonkeyEditorUtils.OrderedSelectedObjects)
|
|
{
|
|
Undo.RecordObject(o, "renaming");
|
|
|
|
if (EditorUtility.DisplayCancelableProgressBar("Renaming Selection...",
|
|
"MonKey is renaming the objects, please wait!",
|
|
(float) i / MonkeyEditorUtils.OrderedSelectedObjects.Count()))
|
|
break;
|
|
|
|
string finalReplacement = o.name.ReplaceUntil(term, replacement);
|
|
|
|
if (AssetDatabase.Contains(o))
|
|
finalReplacement = finalReplacement.GetSafeForFileName();
|
|
|
|
o.RenameObjectAndAsset(finalReplacement);
|
|
i++;
|
|
}
|
|
|
|
EditorUtility.ClearProgressBar();
|
|
Undo.CollapseUndoOperations(undoID);
|
|
}
|
|
|
|
|
|
[Command("Rename Add Prefixes", "Adds prefixes to the names of the selected objects.", QuickName = "RPR",
|
|
DefaultValidation = DefaultValidation.AT_LEAST_ONE_OBJECT,
|
|
Category = "Naming")]
|
|
public static void AddNamePrefixes(
|
|
[CommandParameter(Help = "The prefixes to add to the selected objects." +
|
|
" The prefixes will be apply one after the other to the objects" +
|
|
" (and loop back to the start)", PreventDefaultValueUsage = true)]
|
|
string[] prefixes)
|
|
{
|
|
int undoID = MonkeyEditorUtils.CreateUndoGroup("Replace after in Names");
|
|
int i = 0;
|
|
int j = 0;
|
|
foreach (Object o in MonkeyEditorUtils.OrderedSelectedObjects)
|
|
{
|
|
Undo.RecordObject(o, "renaming");
|
|
|
|
if (i >= prefixes.Length)
|
|
i -= prefixes.Length;
|
|
|
|
if (EditorUtility.DisplayCancelableProgressBar("Renaming Selection...",
|
|
"MonKey is renaming the objects, please wait!",
|
|
(float) j / MonkeyEditorUtils.OrderedSelectedObjects.Count()))
|
|
break;
|
|
|
|
string finalReplacement = prefixes[i] + o.name;
|
|
|
|
if (AssetDatabase.Contains(o))
|
|
finalReplacement = finalReplacement.GetSafeForFileName();
|
|
|
|
o.RenameObjectAndAsset(finalReplacement);
|
|
i++;
|
|
j++;
|
|
}
|
|
|
|
EditorUtility.ClearProgressBar();
|
|
|
|
Undo.CollapseUndoOperations(undoID);
|
|
}
|
|
|
|
[Command("Rename Add Name Suffixes", "Adds suffixes to the names of the selected objects.",
|
|
DefaultValidation = DefaultValidation.AT_LEAST_ONE_OBJECT, QuickName = "RNS",
|
|
Category = "Naming")]
|
|
public static void AddNameSuffixes(
|
|
[CommandParameter(Help = "The suffixes to add to the selected objects." +
|
|
" The suffixes will be apply one after the other to the objects" +
|
|
" (and loop back to the start)", PreventDefaultValueUsage = true)]
|
|
string[] suffixes)
|
|
{
|
|
int undoID = MonkeyEditorUtils.CreateUndoGroup("Replace after in Names");
|
|
int i = 0;
|
|
int j = 0;
|
|
|
|
foreach (Object o in MonkeyEditorUtils.OrderedSelectedObjects)
|
|
{
|
|
Undo.RecordObject(o, "renaming");
|
|
|
|
if (EditorUtility.DisplayCancelableProgressBar("Renaming Selection...",
|
|
"MonKey is renaming the objects, please wait!",
|
|
(float) j / MonkeyEditorUtils.OrderedSelectedObjects.Count()))
|
|
break;
|
|
|
|
if (i >= suffixes.Length)
|
|
i -= suffixes.Length;
|
|
|
|
string finalReplacement = o.name + suffixes[i];
|
|
|
|
if (AssetDatabase.Contains(o))
|
|
finalReplacement = finalReplacement.GetSafeForFileName();
|
|
|
|
o.RenameObjectAndAsset(finalReplacement);
|
|
i++;
|
|
}
|
|
|
|
EditorUtility.ClearProgressBar();
|
|
Undo.CollapseUndoOperations(undoID);
|
|
}
|
|
|
|
[Command("Rename Add Order Number",
|
|
"Adds a number at the end of the selected objects depending on the order of selection",
|
|
DefaultValidation = DefaultValidation.AT_LEAST_ONE_OBJECT, QuickName = "RON",
|
|
MenuItemLink = "RenameAddOrderNumber", MenuItemLinkTypeOwner = "MonkeyMenuItems",
|
|
Category = "Naming")]
|
|
public static void RenameAddNumberInOrder(
|
|
[CommandParameter(Help = "The number to start the counting with")]
|
|
int startingNumber = 0,
|
|
[CommandParameter(Help = "the text to include before the number")]
|
|
string beforeNumber = " ",
|
|
[CommandParameter(Help = "the text to include after the number")]
|
|
string afterNumber = "")
|
|
{
|
|
int undoID = MonkeyEditorUtils.CreateUndoGroup("Replace after in Names");
|
|
int i = startingNumber;
|
|
int j = 0;
|
|
foreach (Object o in new List<Object>(MonkeyEditorUtils.OrderedSelectedObjects))
|
|
{
|
|
Undo.RecordObject(o, "renaming");
|
|
|
|
if (EditorUtility.DisplayCancelableProgressBar("Renaming Selection...",
|
|
"MonKey is renaming the objects, please wait!",
|
|
(float) j / MonkeyEditorUtils.OrderedSelectedObjects.Count()))
|
|
break;
|
|
|
|
o.RenameObjectAndAsset(o.name + beforeNumber + i + afterNumber);
|
|
|
|
j++;
|
|
i++;
|
|
}
|
|
|
|
EditorUtility.ClearProgressBar();
|
|
Undo.CollapseUndoOperations(undoID);
|
|
}
|
|
|
|
[Command("Rename Update Order Number",
|
|
"Updates the numbers in the selected objects' names to reflect the order",
|
|
DefaultValidation = DefaultValidation.AT_LEAST_ONE_OBJECT, QuickName = "RUO",
|
|
MenuItemLink = "RenameUpdateOrderNumber", MenuItemLinkTypeOwner = "MonkeyMenuItems",
|
|
Category = "Naming")]
|
|
public static void RenameUpdateNumberInOrder(
|
|
[CommandParameter(Help = "The number to start the counting with")]
|
|
int startingNumber = 0)
|
|
{
|
|
int undoID = MonkeyEditorUtils.CreateUndoGroup("Update Numbers in Names");
|
|
int i = startingNumber;
|
|
int j = 0;
|
|
|
|
foreach (Object o in MonkeyEditorUtils.OrderedSelectedObjects)
|
|
{
|
|
Undo.RecordObject(o, "renaming");
|
|
|
|
if (EditorUtility.DisplayCancelableProgressBar("Renaming Selection...",
|
|
"MonKey is renaming the objects, please wait!",
|
|
(float) j / MonkeyEditorUtils.OrderedSelectedObjects.Count()))
|
|
break;
|
|
|
|
string newName = Regex.Replace(o.name, "[0-9]{1,}", i.ToString());
|
|
|
|
if (newName == o.name)
|
|
{
|
|
if (o.name.Contains(i.ToString()))
|
|
continue;
|
|
|
|
newName = newName + " " + i;
|
|
}
|
|
|
|
o.RenameObjectAndAsset(newName);
|
|
i++;
|
|
j++;
|
|
}
|
|
|
|
EditorUtility.ClearProgressBar();
|
|
Undo.CollapseUndoOperations(undoID);
|
|
}
|
|
|
|
|
|
public class ObjectComparer : IComparer<Object>
|
|
{
|
|
public int Compare(Object x, Object y)
|
|
{
|
|
if (x != null && y != null)
|
|
{
|
|
bool xIsFolder = !AssetDatabase.GetAssetPath(x).Contains(".");
|
|
bool yIsFolder = !AssetDatabase.GetAssetPath(y).Contains(".");
|
|
|
|
if ((xIsFolder && yIsFolder) || (!xIsFolder && !yIsFolder))
|
|
{
|
|
return EditorUtility.NaturalCompare(x.name, y.name);
|
|
}
|
|
|
|
return xIsFolder ? -1 : 1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
public class GameObjectComparer : IComparer<GameObject>
|
|
{
|
|
public int Compare(GameObject x, GameObject y)
|
|
{
|
|
if (x != null && y != null)
|
|
return EditorUtility.NaturalCompare(x.name, y.name);
|
|
return 0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
#endif |