Tanoda
EditorUtilities.cs
Go to the documentation of this file.
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Reflection;
6using UnityEngine;
7using Object = UnityEngine.Object;
8
10{
11 public static class EditorUtilities
12 {
13 public static IEnumerable<ReadonlyCacheEntry> GetTransformScanner()
14 {
15 RuntimeUnityEditorCore.Logger.Log(LogLevel.Debug, "Looking for Transforms...");
16
17 var trt = typeof(Transform);
18 var types = GetAllComponentTypes().Where(x => trt.IsAssignableFrom(x));
19
20 foreach (var component in ScanComponentTypes(types, false))
21 yield return component;
22 }
23
24 public static IEnumerable<ReadonlyCacheEntry> GetRootGoScanner()
25 {
26 RuntimeUnityEditorCore.Logger.Log(LogLevel.Debug, "Looking for Root Game Objects...");
27
28 foreach (GameObject go in Resources.FindObjectsOfTypeAll<GameObject>().Where(x => x.transform == x.transform.root))
29 yield return new ReadonlyCacheEntry(string.Format("GameObject({0})", go.name), go);
30 }
31
32 public static IEnumerable<ReadonlyCacheEntry> GetMonoBehaviourScanner()
33 {
34 RuntimeUnityEditorCore.Logger.Log(LogLevel.Debug, "Looking for MonoBehaviours...");
35
36 var mbt = typeof(MonoBehaviour);
37 var types = GetAllComponentTypes().Where(x => mbt.IsAssignableFrom(x));
38
39 foreach (var component in ScanComponentTypes(types, true))
40 yield return component;
41 }
42
43 public static IEnumerable<ReadonlyCacheEntry> GetComponentScanner()
44 {
45 RuntimeUnityEditorCore.Logger.Log(LogLevel.Debug, "Looking for Components...");
46
47 var mbt = typeof(MonoBehaviour);
48 var trt = typeof(Transform);
49 var allComps = GetAllComponentTypes().ToList();
50 var types = allComps.Where(x => !mbt.IsAssignableFrom(x) && !trt.IsAssignableFrom(x));
51
52 foreach (var component in ScanComponentTypes(types, true))
53 yield return component;
54 }
55
56 private static IEnumerable<ReadonlyCacheEntry> ScanComponentTypes(IEnumerable<Type> types, bool noTransfroms)
57 {
58 var allObjects = from type in types
59 let components = Object.FindObjectsOfType(type).OfType<Component>()
60 from component in components
61 where !(noTransfroms && component is Transform)
62 select component;
63
64 foreach (var obj in allObjects.Distinct())
65 yield return new ReadonlyCacheEntry(
66 string.Format("{0} ({1})", GetTransformPath(obj.transform), obj.GetType().Name), obj);
67 }
68
69 private static string GetTransformPath(Transform tr)
70 {
71 if (tr.parent != null) return GetTransformPath(tr.parent) + "/" + tr.name;
72 return tr.name;
73 }
74
75 private static IEnumerable<Type> GetAllComponentTypes()
76 {
77 var compType = typeof(Component);
78 return AppDomain.CurrentDomain.GetAssemblies()
79 .SelectMany(Extensions.GetTypesSafe)
80 .Where(t => t.IsClass && !t.IsAbstract && !t.ContainsGenericParameters)
81 .Where(compType.IsAssignableFrom);
82 }
83
84 public static IEnumerable<ReadonlyCacheEntry> GetInstanceClassScanner()
85 {
86 RuntimeUnityEditorCore.Logger.Log(LogLevel.Debug, "Looking for class instances...");
87
88 var query = AppDomain.CurrentDomain.GetAssemblies()
89 .SelectMany(Extensions.GetTypesSafe)
90 .Where(t => t.IsClass && !t.IsAbstract && !t.ContainsGenericParameters);
91
92 foreach (var type in query)
93 {
94 object obj = null;
95 try
96 {
97 obj = type.GetProperty("Instance", BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy) == null ? type.GetProperty("Instance", BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy).GetValue(null, null) : null;
98 }
99 catch (Exception ex)
100 {
101 RuntimeUnityEditorCore.Logger.Log(LogLevel.Debug, ex.ToString());
102 }
103 if (obj != null)
104 yield return new ReadonlyCacheEntry(type.Name + ".Instance", obj);
105 }
106 }
107 }
108}
UnityEngine.Component Component
RuntimeUnityEditor.Core.LogLevel LogLevel
Definition: RUEInvoker.cs:5
UnityEngine.Object Object