public static bool IgnoredPaths(string path, out string str) { var conf = Globals <Config> .Value; foreach (var substr in conf.IgnorePathContains) { Asr.IsNotNull(path); Asr.IsNotNull(substr); if (!path.Contains(substr)) { continue; } str = substr; return(true); } str = default; return(false); }
public static void Init(SearchArg arg, Object target, Scene scene = default) { Asr.IsNotNull(target, "Asset you're trying to search is corrupted"); arg.Target = target; arg.FilePath = AssetDatabase.GetAssetPath(arg.Target); if (!scene.IsValid()) { Upd(arg); arg.Main = AssetDatabase.LoadMainAssetAtPath(arg.FilePath); if (AssetDatabase.IsSubAsset(arg.Target)) { } else { switch (target) { case SceneAsset _: // todo support cross-scene references? // nested = all assets break; default: // AssetDatabase.IsMainAssetAtPathLoaded() var subAssets = AssetDatabase.LoadAllAssetsAtPath(arg.FilePath).Where(Predicate).ToArray(); arg.SubAssets = subAssets.Length == 0 ? default(Option <Object[]>) : subAssets; bool Predicate(Object s) { if (!s) { return(false); } return(s.GetInstanceID() != arg.Target.GetInstanceID()); } break; } } } else { switch (arg.Target) { case GameObject gg: arg.Main = gg; arg.Scene = scene; arg.SubAssets = gg.GetComponents <Component>().OfType <Object>().ToArray(); break; case Component component: { // treat like subAsset arg.Main = component.gameObject; arg.Scene = scene; break; } default: // project asset such as Material arg.Main = arg.Target; arg.Scene = scene; break; } } }