public static IEnumerable <ResultRow> InScenePro(SearchTarget target) { var referencedBy = new List <ResultRow>(); for (int ii = 0; ii < SceneManager.sceneCount; ii++) { var currentScene = SceneManager.GetSceneAt(ii); if (!currentScene.IsValid() || !currentScene.isLoaded) { continue; } var allObjects = currentScene .GetRootGameObjects() .SelectMany(g => g.GetComponentsInChildren <Component>(true).Where(c => c && !(c is Transform)).OfType <Object>() .Union(AsEnumerable(g as Object))).ToArray(); var total = allObjects.Length; for (int i = 0; i < total; i++) { var comp = allObjects[i]; var res = CheckObject(target, comp); if (res == null) { continue; } referencedBy.Add(res); if (EditorUtility.DisplayCancelableProgressBar("Searching for file usages in current scene..", target.Target.name, (float)i / total)) { break; } } EditorUtility.ClearProgressBar(); } return(referencedBy); }
public static IEnumerable <ResultRow> GetDependenciesInScene(SearchTarget target) { var referencedBy = new List <ResultRow>(); for (int ii = 0; ii < SceneManager.sceneCount; ii++) { var currentScene = SceneManager.GetSceneAt(ii); if (!currentScene.IsValid() || !currentScene.isLoaded) { continue; } var allObjects = currentScene .GetRootGameObjects() .SelectMany(g => { if (g != target.Target) { return(g.GetComponentsInChildren <Component>(true).Where(FilterComponents).OfType <Object>().Union(AsEnumerable(g as Object))); } return(g.GetComponentsInChildren <Component>(true).Where(FilterComponents).OfType <Object>()); }).ToArray(); var total = allObjects.Length; var step = total / 5; for (int i = 0; i < total; i++) { var comp = allObjects[i]; var res = GenerateResultRowByObject(target, comp); if (res != null && target.Target != res.Main) { referencedBy.Add(res); } foreach (var nested in target.Nested) { var searchTarget = new SearchTarget(nested, FindModeEnum.Scene); var resultNested = GenerateResultRowByObject(searchTarget, comp); if (resultNested != null && searchTarget.Target != resultNested.Main) { referencedBy.Add(resultNested); } } if (i % step == 0) { if (EditorUtility.DisplayCancelableProgressBar("Searching for file usages in current scene..", target.Target.name, (float)i / total)) { break; } } } EditorUtility.ClearProgressBar(); } var distinct = referencedBy.Distinct().ToList(); return(distinct); }
private static ResultRow GenerateResultRowByObject(SearchTarget target, Object c, bool isScene = true) { if (target.Check(c)) { return(null); } if (target.Root == c) { return(null); } var so = new SerializedObject(c); var sp = so.GetIterator(); ResultRow row = null; while (sp.Next(true)) { string transformPath = string.Empty; if (sp.propertyType != SerializedPropertyType.ObjectReference || !target.Check(sp.objectReferenceValue)) { continue; } if (row == null) { row = new ResultRow { Root = c, Target = c, SerializedObject = so }; if (isScene) { var component = c as Component; if (component) { row.Main = component.gameObject; } else { var o = c as GameObject; if (o != null) { row.Main = o; } } var go = row.Main as GameObject; Assert.NotNull(go); row.LabelContent.text = AnimationUtility.CalculateTransformPath(go.transform, null); row.LabelContent.image = AssetPreview.GetMiniThumbnail(go); } else { var path = AssetDatabase.GetAssetPath(c); row.Main = AssetDatabase.LoadMainAssetAtPath(path); var mainType = PrefabUtility.GetPrefabAssetType(row.Main); if (mainType != PrefabAssetType.NotAPrefab) { var comp = row.Target as Component; if (comp) { try { transformPath = string.Format("{0}/", AnimationUtility.CalculateTransformPath(comp.transform, null)).Replace("/", "/\n"); } catch { // ignored } } } row.LabelContent.text = path.Replace(AssetsRootPath, string.Empty); row.LabelContent.image = AssetDatabase.GetCachedIcon(path); } } Texture2D miniTypeThumbnail = row.Main == c ? null : AssetPreview.GetMiniThumbnail(c); row.Properties.Add(new ResultRow.PropertyData { Property = sp.Copy(), Content = new GUIContent { image = miniTypeThumbnail, text = Nicify(sp, sp.serializedObject.targetObject, row.Main, target), tooltip = string.Format("{2}{0}.{1}", sp.serializedObject.targetObject.GetType().Name, sp.propertyPath, transformPath) } }); } if (row == null) { so.Dispose(); } return(row); }
private static string Nicify(SerializedProperty sp, Object o, Object main, SearchTarget target) { // return sp.propertyPath; string nice = string.Empty; switch (o) { case AnimatorController _: { return(Nice(sp.propertyPath)); break; } case BlendTree blendTree: { return($"{blendTree.name}({o.GetType().Name})"); break; } case AnimatorState animatorState: { if (main is AnimatorController animatorController) { var bread = GetBread(animatorController, animatorState); return($"{bread}{animatorState.name}"); } break; } case StateMachineBehaviour smb: { var ctx = AnimatorController.FindStateMachineBehaviourContext(smb); if (ctx.Length == 0) { break; } var first = ctx[0]; var bread = string.Empty; switch (first.animatorObject) { case AnimatorStateMachine _: // nothing break; case AnimatorState ast: { bread = GetBread(first.animatorController, ast); break; } } return($"{bread}{first.animatorObject.name}"); } case Material _: nice = sp.displayName; break; default: { nice = Nice(sp.propertyPath); break; } } nice = string.Format("{0}.{1}", o.GetType().Name, nice); return(nice); }