Net.Like.Xue.Tokyo/Assets/Plugins/MonKey Commander/Editor/MonKey/Sample Commands/SelectionUtilities.cs

1475 lines
61 KiB
C#
Raw Normal View History

2024-11-03 16:42:23 +08:00
#if UNITY_EDITOR
using MonKey.Commands;
using MonKey.Editor.Internal;
using MonKey.Extensions;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using UnityEditor;
#if UNITY_2022_1_OR_NEWER
using UnityEditor.SceneManagement;
#else
#endif
using UnityEngine;
using Object = UnityEngine.Object;
namespace MonKey.Editor.Commands
{
public static class SelectionUtilities
{
public static bool IsAssetAFolder(Object obj)
{
string path = "";
if (obj == null)
{
return false;
}
path = AssetDatabase.GetAssetPath(obj.GetInstanceID());
if (path.Length > 0)
{
if (Directory.Exists(path))
{
return true;
}
return false;
}
return false;
}
internal static Type HierarchyWindowType = Type.GetType("UnityEditorInternal.SceneHierarchyWindow");
internal static EditorWindow hierarchyWindow;
internal static void SetSelectionActiveVersionIndependent(Object obj)
{
Object[] objs = Selection.objects;
#if UNITY_2017_1_OR_NEWER
Selection.SetActiveObjectWithContext(obj, obj);
#else
Selection.activeObject = obj;
#endif
EditorGUIUtility.PingObject(obj);
Selection.objects = objs;
EditorApplication.RepaintHierarchyWindow();
FocusHierarchyWindow();
}
private static void FocusHierarchyWindow()
{
if (hierarchyWindow == null)
{
Object[] potentialWindows = Resources.FindObjectsOfTypeAll(typeof(EditorWindow));
foreach (var potentialWindow in potentialWindows)
{
EditorWindow window = potentialWindow as EditorWindow;
if (window && window.titleContent.text == "Hierarchy")
{
hierarchyWindow = potentialWindow as EditorWindow;
}
}
}
if (hierarchyWindow != null)
hierarchyWindow.Focus();
}
public enum SelectionCombineRestrictedCombine
{
REPLACE,
UNION,
INTERSECTION,
SEARCH_IN_CHILDREN,
SEARCH_EXCLUDING_SELECTION,
SELECTION_EXCLUDING_SEARCH
}
public static void SelectionCombine(SelectionCombineRestrictedCombine comb, params Object[] newSelection)
{
var prev = Selection.objects;
switch (comb)
{
case SelectionCombineRestrictedCombine.REPLACE:
Selection.objects = newSelection;
return;
case SelectionCombineRestrictedCombine.INTERSECTION:
Selection.objects = prev.Intersect(newSelection).ToArray();
return;
case SelectionCombineRestrictedCombine.UNION:
Selection.objects = prev.Union(newSelection).ToArray();
return;
case SelectionCombineRestrictedCombine.SEARCH_EXCLUDING_SELECTION:
Selection.objects = newSelection.Except(prev).ToArray();
return;
case SelectionCombineRestrictedCombine.SELECTION_EXCLUDING_SEARCH:
Selection.objects = prev.Except(newSelection).ToArray();
return;
case SelectionCombineRestrictedCombine.SEARCH_IN_CHILDREN:
Selection.objects = newSelection.Where(_ => Selection.objects.Any(yo => IsInChildren(yo, _)))
.ToArray();
return;
}
}
private static bool IsInChildren(Object parent, Object toCheck)
{
if (parent is GameObject goParent)
{
if (toCheck is GameObject go)
{
return go.transform.GetAllParentTransforms().Contains(goParent.transform);
}
if (toCheck is Component comp)
{
return goParent.GetComponentsInChildren(comp.GetType()).Contains(comp);
}
return false;
}
return false;
}
public enum SelectionCombineType
{
UNION,
INTERSECTION,
SAVED_MINUS_CURRENT,
CURRENT_MINUS_SAVED,
}
[Command("Save Selection",
"Saves the currently selected objects to be reused later," +
" or combined using the Combine Saved Selection Command")]
public static void SaveSelection()
{
MonKeySelectionUtils.SelectionSave.Clear();
MonKeySelectionUtils.SelectionSave.AddRange(Selection.objects);
}
[Command("Deselect Assets", "Deselects assets present in the selection", QuickName = "DA")]
public static void UnSelectAssets()
{
var list = Selection.objects.ToList();
list.RemoveAll(AssetDatabase.Contains);
Selection.objects = list.ToArray();
}
[Command("Deselect Scene Objects", "Deselects assets present in the selection", QuickName = "DSO")]
public static void UnSelectSceneObjects()
{
var list = Selection.objects.ToList();
list.RemoveAll(_ => !AssetDatabase.Contains(_));
Selection.objects = list.ToArray();
}
[Command("Select Saved Selection",
"Selects the current saved selected objects")]
public static void SelectSavedSelection()
{
Selection.objects = MonKeySelectionUtils.SelectionSave.ToArray();
}
[Command("Combine Saved Selection",
"Combines the current selection with the previously saved selection (with teh save selection command) with boolean logic",
Category = "Selection", QuickName = "CS")]
public static void SelectionCombineWthSaved(SelectionCombineType combination)
{
List<Object> currentSelection = new List<Object>(Selection.objects);
switch (combination)
{
case SelectionCombineType.UNION:
currentSelection.AddRange(MonKeySelectionUtils.SelectionSave);
break;
case SelectionCombineType.CURRENT_MINUS_SAVED:
currentSelection.RemoveAll(_ => MonKeySelectionUtils.SelectionSave.Contains(_));
break;
case SelectionCombineType.INTERSECTION:
currentSelection.RemoveAll(_ => !MonKeySelectionUtils.SelectionSave.Contains(_));
break;
case SelectionCombineType.SAVED_MINUS_CURRENT:
var previous = MonKeySelectionUtils.SelectionSave;
previous.RemoveAll(_ => currentSelection.Contains(_));
currentSelection = previous;
break;
default:
break;
}
Selection.objects = currentSelection.ToArray();
}
[Command("Select Common Parent",
Help = "Selects the common parent of all the selected objects",
QuickName = "SCP",
ValidationMethodName = "ValidationAnyGameObject",
MenuItemLink = "SelectParent", MenuItemLinkTypeOwner = "MonkeyMenuItems",
Category = "Selection")]
public static void SelectParent()
{
Transform trans = ParentingUtilities.FindEarliestCommonParent(Selection.gameObjects);
if (trans)
{
Selection.objects = new Object[] { trans.gameObject };
SetSelectionActiveVersionIndependent(trans.gameObject);
}
else
{
Debug.Log("Monkey Select Parent: No Common Parent Found");
}
}
[Command("Select Parents",
Help = "Selects the parents of all the selected objects",
QuickName = "SPA",
ValidationMethodName = "ValidationAnyGameObject",
Category = "Selection")]
public static void SelectParents()
{
Selection.objects =
Selection.gameObjects.Convert(_ => _.transform.parent)
.Where(_ => _).Convert(_ => _.gameObject as Object).ToArray();
if (Selection.objects.Length > 0)
SetSelectionActiveVersionIndependent(Selection.objects[0]);
else
{
Debug.LogWarning("MonKey Warning: No Objects were selected");
}
}
[Command("Select GameObjects With Name Terms", QuickName = "SGT",
Help = "Selects all objects that contain the specified terms in their name",
MenuItemLink = "SelectWithTerms", MenuItemLinkTypeOwner = "MonkeyMenuItems",
Category = "Selection")]
public static void SelectSceneObjectsWithTerms(
[CommandParameter(Help = "The terms to look for")]
string[] termsToLookFor,
[CommandParameter(Help = "How to combine the search with the current selection",
OverrideName = "Selection Combining")]
SelectionCombineRestrictedCombine comb = SelectionCombineRestrictedCombine.REPLACE)
{
IEnumerable<Object> newObjs = Resources.FindObjectsOfTypeAll<Transform>()
.Where(_ => SceneObjectWithTermSearch(_, termsToLookFor))
.Convert(_ => (Object)_.gameObject);
SelectionCombine(comb, newObjs.ToArray());
if (Selection.objects.Length > 0)
SetSelectionActiveVersionIndependent(Selection.objects[0]);
else
{
Debug.LogWarning("MonKey Warning: No Objects were selected");
}
}
private static bool SceneObjectWithTermSearch(Transform t, string[] termsToLookFor)
{
bool anyTerm = false;
if (!t.gameObject.scene.IsValid())
return false;
foreach (var s in termsToLookFor)
{
anyTerm = t.name.ToLowerInvariant().Contains(s.ToLowerInvariant());
if (anyTerm)
break;
}
return anyTerm;
}
[Command("Select Assets With Terms", QuickName = "SAT",
Help = "Selects all assets that contain the specified terms in their name",
MenuItemLink = "SelectWithTermsAssets", MenuItemLinkTypeOwner = "MonkeyMenuItems",
Category = "Selection")]
public static void SelectAssetsWithTerm(
[CommandParameter(Help = "The terms to look for")]
string[] termsToLookFor,
[CommandParameter(Help = "How to combine the search with the current selection",
OverrideName = "Selection Combining")]
SelectionCombineRestrictedCombine comb = SelectionCombineRestrictedCombine.REPLACE)
{
List<string> paths = new List<string>();
foreach (string s in termsToLookFor)
{
paths.AddRange(
AssetDatabase.FindAssets(s.ToLowerInvariant()).Where(_ => !paths.Contains(_)));
}
IEnumerable<Object> objs =
paths.Convert(_ =>
AssetDatabase.LoadAssetAtPath<Object>(AssetDatabase.GUIDToAssetPath(_)));
SelectionCombine(comb, objs.ToArray());
if (Selection.objects.Length > 0)
SetSelectionActiveVersionIndependent(Selection.objects[0]);
else
{
Debug.LogWarning("MonKey Warning: No Objects were selected");
}
}
[Command("Select Siblings",
Help = "Selects the siblings of all the selected objects",
QuickName = "SS",
ValidationMethodName = "ValidationAnyGameObject",
MenuItemLink = "SelectSiblings", MenuItemLinkTypeOwner = "MonkeyMenuItems",
Category = "Selection")]
public static void SelectSiblings()
{
List<Object> objectsToSelect = new List<Object>();
foreach (var gameObject in Selection.gameObjects.Where(_ => _.scene.IsValid()))
{
if (gameObject.transform.parent)
foreach (Transform t in gameObject.transform.parent)
{
objectsToSelect.Add(t.gameObject);
}
else
{
objectsToSelect.AddRange(gameObject.scene.GetRootGameObjects());
}
}
Selection.objects = Selection.objects.Append(objectsToSelect.Where(_ => !Selection.objects.Contains(_)))
.ToArray();
if (Selection.objects.Length > 0)
SetSelectionActiveVersionIndependent(Selection.objects[0]);
else
{
Debug.LogWarning("MonKey Warning: No Objects were selected");
}
}
[Command("Find Asset", "Selects an asset and pings it in the project folder",
AlwaysShow = true, QuickName = "FA", Order = -5,
MenuItemLink = "SelectAssetHotKeyOverride", MenuItemLinkTypeOwner = "MonkeyMenuItems",
Category = "Selection")]
public static void FindAsset(
[CommandParameter(Help = "The name of the asset you wish to select",
AutoCompleteMethodName = "AssetNamesSuggestions",
ForceAutoCompleteUsage = true, OverrideTypeName = "Asset Name",
PreventDefaultValueUsage = true)]
string assetName)
{
Object selected =
AssetDatabase.LoadAssetAtPath<Object>(assetName);
Selection.objects = new[] { selected };
EditorUtility.FocusProjectWindow();
SetSelectionActiveVersionIndependent(selected);
}
[Command("Find Asset Of Type", "Selects an asset of a type and pings it in the project folder",
QuickName = "FAT",
Category = "Selection")]
public static void FindAssetOfType(
[CommandParameter(AutoCompleteMethodName = "AssetTypeAuto",
Help = "The type of asset to look for",
ForceAutoCompleteUsage = true, PreventDefaultValueUsage = true)]
Type assetType,
[CommandParameter(Help = "The name of the asset you wish to select",
AutoCompleteMethodName = "AssetNamesOfTypeSuggestions",
ForceAutoCompleteUsage = true, OverrideTypeName = "Asset Name",
PreventDefaultValueUsage = true)]
string assetName)
{
Object selected =
AssetDatabase.LoadAssetAtPath<Object>(assetName);
Selection.objects = new[] { selected };
EditorUtility.FocusProjectWindow();
SetSelectionActiveVersionIndependent(selected);
}
public static TypeAutoComplete AssetTypeAuto()
{
return new TypeAutoComplete();
}
public static AssetNameAutoComplete AssetNamesOfTypeSuggestions()
{
Type type = (Type)MonkeyEditorUtils.GetParsedParameter(0);
Debug.Log(type.ToString());
Debug.Log(MonkeyEditorUtils.GetParsedParameter(0));
return new AssetNameAutoComplete() { CustomType = type.Name, IncludeDirectories = false };
}
[Command("Find Asset With Preview", "Selects an asset and ping it in the project folder. " +
"Slower than Find Asset, as it needs to fetch previews.",
AlwaysShow = true, QuickName = "FAP", Order = -5,
Category = "Selection")]
public static void FindAssetPrev(
[CommandParameter(Help = "The name of the asset you wish to select",
AutoCompleteMethodName = "AssetNamesSuggestionsPrev",
ForceAutoCompleteUsage = true, OverrideTypeName = "Asset Name",
PreventDefaultValueUsage = true)]
string assetName)
{
Object selected =
AssetDatabase.LoadAssetAtPath<Object>(assetName);
Selection.objects = new[] { selected };
EditorUtility.FocusProjectWindow();
SetSelectionActiveVersionIndependent(selected);
}
[Command("Find Folder", "Selects a folder and ping it in the project folder",
QuickName = "FF", Order = 0,
Category = "Selection")]
public static void FindFolder(
[CommandParameter(Help = "The name of the folder you wish to select",
AutoCompleteMethodName = "FolderNamesSuggestions", ForceAutoCompleteUsage = true)]
string assetName)
{
Object selected =
AssetDatabase.LoadAssetAtPath<Object>(assetName);
Selection.objects = new[] { selected };
EditorUtility.FocusProjectWindow();
SetSelectionActiveVersionIndependent(selected);
}
[Command("Find GameObject", "Selects a GameObject in one of the opened scene",
AlwaysShow = true, QuickName = "FG", Order = -5,
MenuItemLink = "SelectGameObjectHotKeyOverride",
MenuItemLinkTypeOwner = "MonkeyMenuItems",
Category = "Selection")]
public static void FindGameObject(
[CommandParameter(Help = "The name of the GameObject you wish to select",
ForceAutoCompleteUsage = true)]
GameObject gameObject)
{
Selection.objects = new Object[] { gameObject };
SetSelectionActiveVersionIndependent(gameObject);
}
[Command("Find GameObject In Children",
"Finds a GameObject under the currently selected GameObjects",
QuickName = "FGC", Order = -1,
MenuItemLink = "SelectWithTermsChildren", MenuItemLinkTypeOwner = "MonkeyMenuItems",
Category = "Selection")]
public static void SelectGameObjectInChildren(
[CommandParameter(Help = "The name of the GameObject you wish to select",
ForceAutoCompleteUsage = true, AutoCompleteMethodName = "GameObjectInChildren")]
GameObject gameObject)
{
Selection.objects = new Object[] { gameObject };
SetSelectionActiveVersionIndependent(gameObject);
}
private static CommandParameterAutoComplete<GameObject> GameObjectInChildren()
{
CommandParameterObjectAutoComplete<GameObject> autoComplete =
new CommandParameterObjectAutoComplete<GameObject>();
foreach (var transform in Selection.transforms)
{
foreach (Transform subTransform in transform.GetAllSubTransforms())
{
autoComplete.AddValue(subTransform.gameObject.name, subTransform.gameObject);
}
}
return autoComplete;
}
private static AssetNameAutoComplete FolderNamesSuggestions()
{
return new AssetNameAutoComplete() { DirectoryMode = true };
}
private static AssetNameAutoComplete AssetNamesSuggestions()
{
return AutoCompleteManager.AssetNameAutoComplete;
}
private static AssetNameAutoComplete AssetNamesSuggestionsPrev()
{
return new AssetNameAutoComplete() { showAssetPreview = true };
}
[CommandValidation(DefaultValidationMessages.DEFAULT_SELECTED_GAMEOBJECTS)]
private static bool ValidationAnyGameObject()
{
return Selection.gameObjects.Length > 0;
}
[Command("Select Children", "Select the direct children of the selected objects",
QuickName = "SC", ValidationMethodName = "ValidationAnyGameObject",
Category = "Selection")]
public static void SelectChildren(
SelectionCombineRestrictedCombine SelectionCombine = SelectionCombineRestrictedCombine.REPLACE)
{
List<Object> objects = new List<Object>();
foreach (var o in Selection.gameObjects)
{
foreach (Transform t in o.transform)
{
if (!objects.Contains(t))
objects.Add(t.gameObject);
}
}
if (Selection.objects.Length == 0)
{
Debug.LogWarning("MonKey Warning: No Objects were selected");
}
SelectionUtilities.SelectionCombine(SelectionCombine, objects.ToArray());
}
[Command("Select All Children", "Select all the children of the selected objects",
QuickName = "SC", ValidationMethodName = "ValidationAnyGameObject",
Category = "Selection")]
public static void SelectAllChildren(
SelectionCombineRestrictedCombine SelectionCombine = SelectionCombineRestrictedCombine.REPLACE)
{
List<Object> objects = new List<Object>();
foreach (var o in Selection.gameObjects)
{
objects.AddRange(o.GetComponentsInChildren<Transform>().Where(_ => _.gameObject != o)
.Convert(_ => _.gameObject));
}
if (Selection.objects.Length == 0)
{
Debug.LogWarning("MonKey Warning: No Objects were selected");
}
SelectionUtilities.SelectionCombine(SelectionCombine, objects.ToArray());
}
public enum RandomSelectionRange
{
IN_CURRENT_SELECTION,
IN_CHILDREN,
}
[Command("Select Random", "Select Random objects within current selection, children, or all objects",
QuickName = "SC", ValidationMethodName = "ValidationAnyGameObject",
Category = "Selection")]
public static void SelectRandomChildren(float percent = 0.5f,
[CommandParameter(Help = "Where to select random objects",
OverrideName = "Selection Combining")]
RandomSelectionRange comb = RandomSelectionRange.IN_CURRENT_SELECTION)
{
List<Object> pool = new List<Object>();
switch (comb)
{
case RandomSelectionRange.IN_CURRENT_SELECTION:
pool.AddRange(Selection.gameObjects);
break;
case RandomSelectionRange.IN_CHILDREN:
pool.AddRange(Selection.activeGameObject.transform.GetChildren().Convert(_ => _.gameObject));
break;
}
percent = Mathf.Clamp01(percent);
List<Object> selectedObjects = new List<Object>();
pool.Shuffle();
selectedObjects.AddRange(pool.GetRange(0, Mathf.FloorToInt(pool.Count * percent)));
Selection.objects = selectedObjects.ToArray();
if (Selection.objects.Length > 0)
SetSelectionActiveVersionIndependent(Selection.objects[0]);
else
{
Debug.LogWarning("MonKey Warning: No Objects were selected");
}
}
[Command("Add GameObjects To Selection",
"Adds some objects to the currently selected ones", QuickName = "AG",
Category = "Selection")]
public static void AddToSelection(
[CommandParameter(Help = "The objects to add", PreventDefaultValueUsage = true,
ForceAutoCompleteUsage = true)]
GameObject[] objects)
{
Selection.objects = Selection.objects.Append(objects).ToArray();
if (Selection.objects.Length > 0)
SetSelectionActiveVersionIndependent(Selection.objects[0]);
else
{
Debug.LogWarning("MonKey Warning: No Objects were selected");
}
}
[Command("Select Scene Objects of Type",
"Selects all the objects of the specified type", QuickName = "ST",
Category = "Selection")]
public static void SelectOfType(
[CommandParameter(Help = "The Type to Select", PreventDefaultValueUsage = true,
ForceAutoCompleteUsage = true, AutoCompleteMethodName = "SceneTypes")]
Type type,
[CommandParameter(Help = "How to combine the search with the current selection",
OverrideName = "Selection Combining")]
SelectionCombineRestrictedCombine comb = SelectionCombineRestrictedCombine.REPLACE)
{
EditorUtility.DisplayProgressBar("Finding " + type.Name + " in the scene",
"MonKey is still looking for all the object!", .5f);
Object[] objs;
var stage = UnityEditor.SceneManagement.PrefabStageUtility.GetCurrentPrefabStage();
if (stage != null)
{
objs = stage.scene.GetRootGameObjects()[0].GetComponentsInChildren(type)
.Convert(_ => _.gameObject).ToArray();
}
else
{
objs = TransformExt.GetAllTransformedOrderUpToDown(_ => _.GetComponent(type) != null)
.Convert(_ => (Object)_.gameObject).ToArray();
}
SelectionCombine(comb, objs.ToArray());
EditorUtility.ClearProgressBar();
if (Selection.objects.Length > 0)
SetSelectionActiveVersionIndependent(Selection.objects[0]);
else
{
Debug.Log("MonKey found no objects of the corresponding type");
}
}
[Command("Select Children of Type",
"Selects all the children objects of the specified type", QuickName = "SCT",
Category = "Selection")]
public static void SelectChildrenOfType(
[CommandParameter(Help = "The Type to Select", PreventDefaultValueUsage = true,
ForceAutoCompleteUsage = true, AutoCompleteMethodName = "SceneTypes")]
Type type,
[CommandParameter(Help = "How to combine the search with the current selection",
OverrideName = "Selection Combining")]
SelectionCombineRestrictedCombine comb = SelectionCombineRestrictedCombine.REPLACE)
{
EditorUtility.DisplayProgressBar("Finding " + type.Name + " in the children",
"MonKey is still looking for all the object!", .5f);
List<Object> selection = new List<Object>();
foreach (GameObject o in Selection.gameObjects)
{
selection.AddRange(o.GetComponentsInChildren(type)
.Convert(_ => _.gameObject as Object));
}
EditorUtility.ClearProgressBar();
SelectionCombine(comb, selection.ToArray());
if (Selection.objects.Length > 0)
SetSelectionActiveVersionIndependent(Selection.objects[0]);
else
{
Debug.Log("MonKey found no objects of the corresponding type");
}
}
public static TypeAutoComplete AssetTypes()
{
return new TypeAutoComplete(true, false, true, true);
}
public static TypeAutoComplete SceneTypes()
{
return new TypeAutoComplete(false, true, true, false);
}
[Command("Add Asset To Selection", "Adds some assets to the currently selected ones",
QuickName = "AA",
Category = "Selection")]
public static void AddToSelection(
[CommandParameter(Help = "The assets to add", PreventDefaultValueUsage = true,
ForceAutoCompleteUsage = true, AutoCompleteMethodName = "AssetNamesAuto")]
string[] assets)
{
List<Object> objs = new List<Object>();
foreach (var asset in assets)
{
objs.Add(AssetDatabase.LoadAssetAtPath<Object>(asset));
}
Selection.objects = Selection.objects.Append(objs).ToArray();
EditorUtility.FocusProjectWindow();
}
[Command("UnSelect All", "Clears all the selected objects", QuickName = "UNA",
MenuItemLink = "UnSelectAll", MenuItemLinkTypeOwner = "MonkeyMenuItems",
Category = "Selection")]
public static void ClearSelection()
{
Selection.objects = new Object[0];
}
/* [Command("Order Selection By Hierarchy",
"Orders the selection based on the hierarchy as seen in the editor", QuickName = "OSH",
Category = "Selection")]
public static void OrderSelectionByHierarchy(
[CommandParameter(Help=
"if true, sorts from top to bottom, with scene objects first, and assets then")]
bool descending=true)
{
MonkeyEditorUtils.OrderSelectionByHierarchy(descending);
}*/
[Command("UnSelect Children",
"UnSelects all the children objects if their parent is selected",
DefaultValidation = DefaultValidation.AT_LEAST_ONE_GAME_OBJECT, QuickName = "UNC",
Category = "Selection")]
public static void UnSelectChildren()
{
Selection.objects = Selection.transforms.Convert(_ => (Object)_.gameObject).ToArray();
}
[Command("UnSelect Parent", "UnSelects the up most parents of the selection :" +
" intermediate parents will still be selected",
DefaultValidation = DefaultValidation.AT_LEAST_ONE_GAME_OBJECT, QuickName = "UNP",
Category = "Selection")]
public static void UnSelectParents()
{
Selection.objects = Selection.gameObjects.Where(_ => !Selection.transforms.Contains(_.transform) ||
_.transform.childCount == 0).Convert(_ => (Object)_)
.ToArray();
}
public static AssetNameAutoComplete AssetNamesAuto()
{
return new AssetNameAutoComplete();
}
[Command("Select Folders of Objects", "Selects the containing folders of the selected assets",
QuickName = "SF", DefaultValidation = DefaultValidation.AT_LEAST_ONE_ASSET,
Category = "Selection")]
public static void SelectFoldersOfObjects()
{
List<Object> folderObjects = new List<Object>();
foreach (Object o in Selection.objects.Where(AssetDatabase.Contains))
{
if (!o.IsDirectory())
folderObjects.Add(AssetDatabase.LoadAssetAtPath<Object>(
ProjectWindowUtil.GetContainingFolder(AssetDatabase.GetAssetPath(o))));
}
Selection.objects = folderObjects.ToArray();
EditorUtility.FocusProjectWindow();
}
[Command("Select Meshes In Children",
"Selects all the meshes under the selected objects (included)",
QuickName = "SME", DefaultValidation = DefaultValidation.AT_LEAST_ONE_GAME_OBJECT,
Category = "Selection")]
public static void SelectMeshesInChildren()
{
List<Object> selection = new List<Object>();
foreach (var o in MonkeyEditorUtils.OrderedSelectedGameObjects)
{
selection.AddRange(o.GetComponentsInChildren<MeshRenderer>()
.Convert(_ => _.gameObject as Object));
}
Selection.objects = selection.ToArray();
if (Selection.objects.Length > 0)
SetSelectionActiveVersionIndependent(Selection.objects[0]);
else
{
Debug.LogWarning("MonKey Warning: No Objects were selected");
}
}
[Command("Select Previous Selection", QuickName = "SPS",
Help = "Selects the previous selection since the last empty selection ",
MenuItemLink = "SelectPreviousSelection",
MenuItemLinkTypeOwner = "MonkeyMenuItems",
Category = "Selection")]
private static void SelectPreviousSelection()
{
/* List<Object> oldList = MonkeyEditorUtils.OrderedSelectedObjectsInt;
List<Transform> oldListT = MonkeyEditorUtils.OrderedSelectedTransformInt;
MonkeyEditorUtils.OrderedSelectedObjectsInt = new List<Object>(MonkeyEditorUtils.PreviousOrderedSelectedObjects);
MonkeyEditorUtils.OrderedSelectedTransformInt = new List<Transform>(MonkeyEditorUtils.PreviousOrderedSelectedTransform);
Selection.objects = MonkeyEditorUtils.OrderedSelectedObjectsInt.ToArray();
MonkeyEditorUtils.PreviousOrderedSelectedObjects = oldList;
MonkeyEditorUtils.PreviousOrderedSelectedTransform = oldListT;*/
Selection.objects = MonKeySelectionUtils.PreviousSelectionStack.ToArray();
}
/// <summary>
/// Test of ordered Selection
/// </summary>
[Command("Print Ordered Selection",
"Prints the names of teh objects in the order they were selected", QuickName = "POS",
Category = "Selection")]
public static void PrintOrderedSelection()
{
Debug.Log("---------TRANSFORMS---------");
foreach (var transform in MonkeyEditorUtils.OrderedSelectedTransform)
{
Debug.Log(transform);
}
Debug.Log("---------Game Objects---------");
foreach (var go in MonkeyEditorUtils.OrderedSelectedGameObjects)
{
Debug.Log(go.name);
}
Debug.Log("---------Objects---------");
foreach (var o in MonkeyEditorUtils.OrderedSelectedObjects)
{
Debug.Log(o.name);
}
}
[Command("Select Objects With Tag",
"Selects all the objects in the opened scenes that have the given tag",
QuickName = "SOT",
Category = "Selection")]
public static void SelectObjectsWithTag(
[CommandParameter("The tag you wish to look for",
AutoCompleteMethodName = "TagAutoComplete",
ForceAutoCompleteUsage = true,
OverrideTypeName = "Tag Name", PreventDefaultValueUsage = true)]
string tag,
[CommandParameter(Help = "How to combine the search with the current selection",
OverrideName = "Selection Combining")]
SelectionCombineRestrictedCombine comb = SelectionCombineRestrictedCombine.REPLACE)
{
Object[] newObjs;
var stage = UnityEditor.SceneManagement.PrefabStageUtility.GetCurrentPrefabStage();
if (stage != null)
{
newObjs = stage.scene.GetRootGameObjects()[0].GetComponentsInChildren<Transform>()
.Where(_ => _.CompareTag(tag)).Convert(_ => _.gameObject).ToArray();
}
else
{
newObjs = GameObject.FindGameObjectsWithTag(tag)
.Convert(_ => _ as Object).ToArray();
}
SelectionCombine(comb, newObjs.ToArray());
}
public static TagAutoComplete TagAutoComplete()
{
return new TagAutoComplete();
}
public static TypeAutoComplete SelectStringType()
{
return new TypeAutoComplete();
}
public static StaticCommandParameterAutoComplete SelectBoolField()
{
return AutoCompleteManager.FieldAutoComplete(1, typeof(bool));
}
public enum ObjectTargeted
{
SCENE,
ASSET,
BOTH
}
[Command("Select Objects By Bool Value",
"Selects all the object with a defined bool field having defined value", QuickName = "SOBV",
Category = "Selection")]
public static void SelectObjectWithBoolValue(
[CommandParameter(Help = "Should the command included only scene objects or more",
ForceAutoCompleteUsage = true,
DefaultValueMethod = "DefaultTargetObject")]
ObjectTargeted targetedObjects,
[CommandParameter(Help = "The type of object to look for",
AutoCompleteMethodName = "SelectStringType",
ForceAutoCompleteUsage = true,
PreventDefaultValueUsage = true)]
Type objectType,
[CommandParameter(Help = "The name of the field to look for",
AutoCompleteMethodName = "SelectBoolField",
ForceAutoCompleteUsage = true,
PreventDefaultValueUsage = true)]
string fieldName, bool value,
[CommandParameter(Help = "How to combine the search with the current selection",
OverrideName = "Selection Combining")]
SelectionCombineRestrictedCombine comb = SelectionCombineRestrictedCombine.REPLACE)
{
SelectObjectWithMembersWithValue(objectType, fieldName, value, targetedObjects, null, comb);
}
[Command("Select Objects By Object Reference",
"Selects all the object with a defined Unity Object field having a defined value", QuickName = "SOOV",
Category = "Selection")]
public static void SelectObjectWithObjectValue(
[CommandParameter(Help = "Should the command included only scene objects or more",
ForceAutoCompleteUsage = true,
DefaultValueMethod = "DefaultTargetObject")]
ObjectTargeted targetedObjects,
[CommandParameter(Help = "The type of object to look for",
AutoCompleteMethodName = "SelectStringType",
ForceAutoCompleteUsage = true,
PreventDefaultValueUsage = true)]
Type objectType,
[CommandParameter(Help = "The type of field to look for",
AutoCompleteMethodName = "SelectStringTypeSecond",
ForceAutoCompleteUsage = true,
PreventDefaultValueUsage = true)]
Type fieldType,
[CommandParameter(Help = "The name of the field to look for",
AutoCompleteMethodName = "SelectObjectField",
ForceAutoCompleteUsage = true,
PreventDefaultValueUsage = true)]
string fieldName,
[CommandParameter(Help = "The object to check as a reference",
PreventDefaultValueUsage = true, ForceAutoCompleteUsage = true,
AutoCompleteMethodName = "ObjectByTypeAuto")]
Object value, [CommandParameter(Help = "How to combine the search with the current selection",
OverrideName = "Selection Combining")]
SelectionCombineRestrictedCombine comb = SelectionCombineRestrictedCombine.REPLACE)
{
SelectObjectWithMembersWithValue(objectType, fieldName, value, targetedObjects, null, comb);
}
public static ObjectTypeAutoComplete<Object> ObjectByTypeAuto()
{
ObjectTypeAutoComplete<Object> auto = new ObjectTypeAutoComplete<Object>();
auto.SceneObjectsOnly = false;
auto.ParameterType = (Type)MonkeyEditorUtils.GetParsedParameter(2);
return auto;
}
public static TypeAutoComplete SelectStringTypeSecond()
{
var typeFound = (Type)MonkeyEditorUtils.GetParsedParameter(1);
var fields = typeFound.GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance |
BindingFlags.FlattenHierarchy | BindingFlags.Default);
var properties = typeFound.GetProperties(BindingFlags.NonPublic | BindingFlags.Public |
BindingFlags.Instance | BindingFlags.FlattenHierarchy |
BindingFlags.Default & BindingFlags.SetProperty);
var complete = new TypeAutoComplete(false, false, false, false);
foreach (var fieldInfo in fields)
{
if (fieldInfo.FieldType.IsSubclassOf(typeof(Object)) || fieldInfo.FieldType == typeof(Object))
complete.AddNewType(fieldInfo.FieldType.Name, fieldInfo.FieldType);
}
foreach (var fieldInfo in properties)
{
if (fieldInfo.PropertyType.IsSubclassOf(typeof(Object)) || fieldInfo.PropertyType == typeof(Object))
complete.AddNewType(fieldInfo.PropertyType.Name, fieldInfo.PropertyType);
}
return complete;
}
public static StaticCommandParameterAutoComplete SelectObjectField()
{
Type type = (Type)MonkeyEditorUtils.GetParsedParameter(2);
return AutoCompleteManager.FieldAutoComplete(1, type);
}
public static StaticCommandParameterAutoComplete SelectStringField()
{
return AutoCompleteManager.FieldAutoComplete(1, typeof(string));
}
[Command("Select Objects By String Value",
"Selects all the object with a defined string field having defined value", QuickName = "SOSV",
Category = "Selection")]
public static void SelectObjectWithStringValue(
[CommandParameter(Help = "Should the command included only scene objects or more",
ForceAutoCompleteUsage = true,
DefaultValueMethod = "DefaultTargetObject")]
ObjectTargeted targetedObjects,
[CommandParameter(Help = "The type of object to look for",
AutoCompleteMethodName = "SelectStringType",
ForceAutoCompleteUsage = true,
PreventDefaultValueUsage = true)]
Type objectType,
[CommandParameter(Help = "The name of the field to look for",
AutoCompleteMethodName = "SelectStringField",
ForceAutoCompleteUsage = true,
PreventDefaultValueUsage = true)]
string fieldName, string value,
[CommandParameter(Help = "How to combine the search with the current selection",
OverrideName = "Selection Combining")]
SelectionCombineRestrictedCombine comb = SelectionCombineRestrictedCombine.REPLACE)
{
SelectObjectWithMembersWithValue(objectType, fieldName, value, targetedObjects, null, comb);
}
[Command("Select Objects Containing String Value",
"Selects all the object with a defined string field containing a defined value", QuickName = "SOSC",
Category = "Selection")]
public static void SelectObjectsContainingStringValue(
[CommandParameter(Help = "Should the command included only scene objects or more",
ForceAutoCompleteUsage = true,
DefaultValueMethod = "DefaultTargetObject")]
ObjectTargeted targetedObjects,
[CommandParameter(Help = "The type of object to look for",
AutoCompleteMethodName = "SelectStringType",
ForceAutoCompleteUsage = true,
PreventDefaultValueUsage = true)]
Type objectType,
[CommandParameter(Help = "The name of the field to look for",
AutoCompleteMethodName = "SelectStringField",
ForceAutoCompleteUsage = true,
PreventDefaultValueUsage = true)]
string fieldName, string value,
[CommandParameter(Help = "How to combine the search with the current selection",
OverrideName = "Selection Combining")]
SelectionCombineRestrictedCombine comb = SelectionCombineRestrictedCombine.REPLACE)
{
bool Contains(object found, object objectvalueWanted)
{
string foundString = (string)found;
return (foundString.Contains((string)objectvalueWanted));
}
SelectObjectWithMembersWithValue(objectType, fieldName, value, targetedObjects, Contains, comb);
}
public enum CompareMethod
{
EQUAL,
LESSER,
GREATER,
GREATER_OR_EQUAL,
LESSER_OR_EQUAL,
}
[Command("Select Objects By Float Value",
"Selects all the object with a defined float field compared to a float value", QuickName = "SOFV",
Category = "Selection")]
public static void SelectObjectsWithFloatValue(
[CommandParameter(Help = "Should the command included only scene objects or more",
ForceAutoCompleteUsage = true,
DefaultValueMethod = "DefaultTargetObject")]
ObjectTargeted targetedObjects,
[CommandParameter(Help = "The type of object to look for",
AutoCompleteMethodName = "SelectStringType",
ForceAutoCompleteUsage = true,
PreventDefaultValueUsage = true)]
Type objectType,
[CommandParameter(Help = "The name of the field to look for",
AutoCompleteMethodName = "SelectFloatField",
ForceAutoCompleteUsage = true,
PreventDefaultValueUsage = true)]
string fieldName, CompareMethod compare = CompareMethod.EQUAL,
float value = 0,
[CommandParameter(Help = "How to combine the search with the current selection",
OverrideName = "Selection Combining")]
SelectionCombineRestrictedCombine comb = SelectionCombineRestrictedCombine.REPLACE)
{
bool Contains(object found, object objectvalueWanted)
{
float foundFloat = (float)found;
float valueWanted = (float)objectvalueWanted;
switch (compare)
{
case CompareMethod.EQUAL:
return Mathf.Approximately(foundFloat, valueWanted);
case CompareMethod.GREATER:
return foundFloat > valueWanted;
case CompareMethod.GREATER_OR_EQUAL:
return foundFloat >= valueWanted;
case CompareMethod.LESSER:
return foundFloat < valueWanted;
case CompareMethod.LESSER_OR_EQUAL:
return foundFloat <= valueWanted;
default:
return false;
}
}
SelectObjectWithMembersWithValue(objectType, fieldName, value, targetedObjects, Contains, comb);
}
[Command("Select Objects By Vector Magnitude Value",
"Selects all the object with a defined vector field compared to a magnitude value", QuickName = "SOFV",
Category = "Selection")]
public static void SelectObjectsWithVectorMagnitudeValue(
[CommandParameter(Help = "Should the command included only scene objects or more",
ForceAutoCompleteUsage = true,
DefaultValueMethod = "DefaultTargetObject")]
ObjectTargeted targetedObjects,
[CommandParameter(Help = "The type of object to look for",
AutoCompleteMethodName = "SelectStringType",
ForceAutoCompleteUsage = true,
PreventDefaultValueUsage = true)]
Type objectType,
[CommandParameter(Help = "The name of the field to look for",
AutoCompleteMethodName = "SelectVectorField",
ForceAutoCompleteUsage = true,
PreventDefaultValueUsage = true)]
string fieldName, CompareMethod compare = CompareMethod.EQUAL,
float value = 0, [CommandParameter(Help = "How to combine the search with the current selection",
OverrideName = "Selection Combining")]
SelectionCombineRestrictedCombine comb = SelectionCombineRestrictedCombine.REPLACE)
{
bool Contains(object found, object objectvalueWanted)
{
float foundFloat = ((Vector3)found).magnitude;
float valueWanted = (float)objectvalueWanted;
switch (compare)
{
case CompareMethod.EQUAL:
return Mathf.Approximately(foundFloat, valueWanted);
case CompareMethod.GREATER:
return foundFloat > valueWanted;
case CompareMethod.GREATER_OR_EQUAL:
return foundFloat >= valueWanted;
case CompareMethod.LESSER:
return foundFloat < valueWanted;
case CompareMethod.LESSER_OR_EQUAL:
return foundFloat <= valueWanted;
default:
return false;
}
}
SelectObjectWithMembersWithValue(objectType, fieldName, value, targetedObjects, Contains, comb);
}
[Command("Select Objects By Vector Axis Value",
"Selects all the object with a defined vector field with x, y or z matching a value", QuickName = "SOFV",
Category = "Selection")]
public static void SelectObjectsWithVectorAxisValue(
[CommandParameter(Help = "Should the command included only scene objects or more",
ForceAutoCompleteUsage = true,
DefaultValueMethod = "DefaultTargetObject")]
ObjectTargeted targetedObjects,
[CommandParameter(Help = "The type of object to look for",
AutoCompleteMethodName = "SelectStringType",
ForceAutoCompleteUsage = true,
PreventDefaultValueUsage = true)]
Type objectType,
[CommandParameter(Help = "The name of the field to look for",
AutoCompleteMethodName = "SelectVectorField",
ForceAutoCompleteUsage = true,
PreventDefaultValueUsage = true)]
string fieldName, CompareMethod compare = CompareMethod.EQUAL,
float value = 0, [CommandParameter(Help = "How to combine the search with the current selection",
OverrideName = "Selection Combining")]
SelectionCombineRestrictedCombine comb = SelectionCombineRestrictedCombine.REPLACE)
{
bool Contains(object found, object objectvalueWanted)
{
Vector3 foundFloat = ((Vector3)found);
float valueWanted = (float)objectvalueWanted;
switch (compare)
{
case CompareMethod.EQUAL:
return Mathf.Approximately(foundFloat.x, valueWanted)
|| Mathf.Approximately(foundFloat.y, valueWanted)
|| Mathf.Approximately(foundFloat.z, valueWanted);
case CompareMethod.GREATER:
return foundFloat.x > valueWanted || foundFloat.y > valueWanted || foundFloat.y > valueWanted;
case CompareMethod.GREATER_OR_EQUAL:
return foundFloat.x >= valueWanted || foundFloat.y >= valueWanted ||
foundFloat.z >= valueWanted;
case CompareMethod.LESSER:
return foundFloat.x < valueWanted || foundFloat.y < valueWanted || foundFloat.z < valueWanted;
case CompareMethod.LESSER_OR_EQUAL:
return foundFloat.x <= valueWanted || foundFloat.y <= valueWanted ||
foundFloat.z <= valueWanted;
default:
return false;
}
}
SelectObjectWithMembersWithValue(objectType, fieldName, value, targetedObjects, Contains, comb);
}
[Command("Select Objects By Vector Angle Value",
"Selects all the object with a defined vector field's angle to a vector value", QuickName = "SOFV",
Category = "Selection")]
public static void SelectObjectsWithVectorAngleValue(
[CommandParameter(Help = "Should the command included only scene objects or more",
ForceAutoCompleteUsage = true,
DefaultValueMethod = "DefaultTargetObject")]
ObjectTargeted targetedObjects,
[CommandParameter(Help = "The type of object to look for",
AutoCompleteMethodName = "SelectStringType",
ForceAutoCompleteUsage = true,
PreventDefaultValueUsage = true)]
Type objectType,
[CommandParameter(Help = "The name of the field to look for",
AutoCompleteMethodName = "SelectVectorField",
ForceAutoCompleteUsage = true,
PreventDefaultValueUsage = true)]
string fieldName, CompareMethod compare = CompareMethod.EQUAL,
Vector3 value = default(Vector3), float angle = 0.1f, [CommandParameter(
Help = "How to combine the search with the current selection", OverrideName = "Selection Combining")]
SelectionCombineRestrictedCombine comb = SelectionCombineRestrictedCombine.REPLACE)
{
bool Contains(object found, object objectvalueWanted)
{
Vector3 foundVec = (Vector3)found;
Vector3 otherVec = (Vector3)objectvalueWanted;
float a = Mathf.Abs(Vector3.Angle(foundVec, otherVec));
switch (compare)
{
case CompareMethod.EQUAL:
return Mathf.Approximately(a, angle);
case CompareMethod.GREATER:
return a > angle;
case CompareMethod.GREATER_OR_EQUAL:
return a >= angle;
case CompareMethod.LESSER:
return a < angle;
case CompareMethod.LESSER_OR_EQUAL:
return a <= angle;
default:
return false;
}
}
SelectObjectWithMembersWithValue(objectType, fieldName, value, targetedObjects, Contains, comb);
}
public static StaticCommandParameterAutoComplete SelectVectorField()
{
return AutoCompleteManager.FieldAutoComplete(1, typeof(Vector3));
}
public static StaticCommandParameterAutoComplete SelectFloatField()
{
return AutoCompleteManager.FieldAutoComplete(1, typeof(float));
}
[Command("Select Objects By Int Value",
"Selects all the object with a defined int field compared to an int value", QuickName = "SOIV",
Category = "Selection")]
public static void SelectObjectsWithIntValue(
[CommandParameter(Help = "Should the command included only scene objects or more",
ForceAutoCompleteUsage = true,
DefaultValueMethod = "DefaultTargetObject")]
ObjectTargeted targetedObjects,
[CommandParameter(Help = "The type of object to look for",
AutoCompleteMethodName = "SelectStringType",
ForceAutoCompleteUsage = true,
PreventDefaultValueUsage = true)]
Type objectType,
[CommandParameter(Help = "The name of the field to look for",
AutoCompleteMethodName = "SelectIntField",
ForceAutoCompleteUsage = true,
PreventDefaultValueUsage = true)]
string fieldName,
CompareMethod compare = CompareMethod.EQUAL, int value = 0, [CommandParameter(
Help = "How to combine the search with the current selection", OverrideName = "Selection Combining")]
SelectionCombineRestrictedCombine comb = SelectionCombineRestrictedCombine.REPLACE)
{
bool Contains(object found, object objectvalueWanted)
{
int foundFloat = (int)found;
int valueWanted = (int)objectvalueWanted;
switch (compare)
{
case CompareMethod.EQUAL:
return Mathf.Approximately(foundFloat, valueWanted);
case CompareMethod.GREATER:
return foundFloat > valueWanted;
case CompareMethod.GREATER_OR_EQUAL:
return foundFloat >= valueWanted;
case CompareMethod.LESSER:
return foundFloat < valueWanted;
case CompareMethod.LESSER_OR_EQUAL:
return foundFloat <= valueWanted;
default:
return false;
}
}
SelectObjectWithMembersWithValue(objectType, fieldName, value, targetedObjects, Contains, comb);
}
public static StaticCommandParameterAutoComplete SelectIntField()
{
return AutoCompleteManager.FieldAutoComplete(1, typeof(int));
}
[Command("Select Objects By Double Value",
"Selects all the object with a defined double field compared to a double value", QuickName = "SODV",
Category = "Selection")]
public static void SelectObjectsWithDoubleValue(
[CommandParameter(Help = "Should the command included only scene objects or more",
ForceAutoCompleteUsage = true,
DefaultValueMethod = "DefaultTargetObject")]
ObjectTargeted targetedObjects,
[CommandParameter(Help = "The type of object to look for",
AutoCompleteMethodName = "SelectStringType",
ForceAutoCompleteUsage = true,
PreventDefaultValueUsage = true)]
Type objectType,
[CommandParameter(Help = "The name of the field to look for",
AutoCompleteMethodName = "SelectDoubleField",
ForceAutoCompleteUsage = true,
PreventDefaultValueUsage = true)]
string fieldName, CompareMethod compare = CompareMethod.EQUAL,
double value = 0, [CommandParameter(Help = "How to combine the search with the current selection",
OverrideName = "Selection Combining")]
SelectionCombineRestrictedCombine comb = SelectionCombineRestrictedCombine.REPLACE)
{
bool Contains(object found, object objectvalueWanted)
{
double foundFloat = (double)found;
double valueWanted = (double)objectvalueWanted;
switch (compare)
{
case CompareMethod.EQUAL:
return Mathf.Approximately((float)foundFloat, (float)valueWanted);
case CompareMethod.GREATER:
return foundFloat > valueWanted;
case CompareMethod.GREATER_OR_EQUAL:
return foundFloat >= valueWanted;
case CompareMethod.LESSER:
return foundFloat < valueWanted;
case CompareMethod.LESSER_OR_EQUAL:
return foundFloat <= valueWanted;
default:
return false;
}
}
SelectObjectWithMembersWithValue(objectType, fieldName, value, targetedObjects, Contains, comb);
}
public static StaticCommandParameterAutoComplete SelectDoubleField()
{
return AutoCompleteManager.FieldAutoComplete(1, typeof(double));
}
public static ObjectTargeted DefaultTargetObject()
{
return ObjectTargeted.SCENE;
}
public static void SelectObjectWithMembersWithValue(Type objectType, string fieldName,
object value, ObjectTargeted targetedObjects = ObjectTargeted.SCENE,
Func<object, object, bool> validityTest = null,
SelectionCombineRestrictedCombine comb = SelectionCombineRestrictedCombine.REPLACE)
{
var objs = Resources.FindObjectsOfTypeAll(objectType);
PropertyInfo propInfo = null;
var info = objectType.GetField(fieldName, TypeManager.AllInstanceFlags);
if (info == null)
propInfo = objectType.GetProperty(fieldName,
TypeManager.AllInstanceFlags);
bool IsEqual(object a, object b)
{
if (a != null)
return a.Equals(b);
return b == null;
}
if (validityTest == null)
{
validityTest = IsEqual;
}
List<Object> selection = new List<Object>();
foreach (var obj in objs)
{
if (info != null)
{
if (validityTest(info.GetValue(obj), value))
{
if (obj is Component comp)
selection.Add(comp.gameObject);
else
selection.Add(obj);
}
}
else if (propInfo != null)
{
if (validityTest(propInfo.GetValue(obj, null), value))
{
if (obj is Component comp)
selection.Add(comp.gameObject);
else
selection.Add(obj);
}
}
}
var prev = Selection.objects;
Selection.objects = selection.ToArray();
switch (targetedObjects)
{
case ObjectTargeted.SCENE:
UnSelectAssets();
break;
case ObjectTargeted.ASSET:
UnSelectSceneObjects();
break;
}
var news = Selection.objects;
Selection.objects = prev;
SelectionCombine(comb, news);
}
}
}
#endif