これはなに?
以前作った、
kakovail.info
こちら、右クリックでサクッと探したいな、と思ったり、リロードの問題があったりしたので、リファクタがてら書き直していました。
使い方と変わったところ
前回に追加して、Projectビューからお好きなスクリプトを右クリック→メニューから選択でも調べられるようになりました。(Assets/KEditorExtensions/から)
Sceneロードでのバグも消しました。
非アクティブなSceneの対処はちょっと保留です。
コード
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 |
<span class="synComment">// Copyright (c) 2021 Hiroyuki Kako</span> <span class="synComment">// This software is released under the MIT License, see LICENSE.</span> <span class="synPreProc">#if UNITY_EDITOR</span> <span class="synStatement">using</span> System; <span class="synStatement">using</span> System.Collections.Generic; <span class="synStatement">using</span> System.Linq; <span class="synStatement">using</span> UnityEditor; <span class="synStatement">using</span> UnityEditor.SceneManagement; <span class="synStatement">using</span> UnityEngine; <span class="synStatement">using</span> UnityEngine.SceneManagement; <span class="synType">public</span> <span class="synType">class</span> ReferenceFinder : EditorWindow { <span class="synType">private</span> <span class="synType">static</span> <span class="synType">string</span> _targetComponentName; <span class="synType">private</span> <span class="synType">static</span> List<GameObject> _foundAssets = <span class="synStatement">new</span> List<GameObject>(); <span class="synType">private</span> <span class="synType">static</span> IEnumerable<Type> _cashedComponents; <span class="synType">private</span> <span class="synType">static</span> Dictionary<<span class="synType">string</span>, List<Type>> _typeDict; <span class="synType">private</span> <span class="synType">static</span> <span class="synType">bool</span> _isFirstTime = <span class="synConstant">true</span>; <span class="synType">static</span> MonoScript[] _monoScripts; <span class="synType">private</span> Vector2 _currentScrollPosition; [InitializeOnLoadMethod] <span class="synType">private</span> <span class="synType">static</span> <span class="synType">void</span> InitializeEvent() { EditorSceneManager.sceneClosing += OnClosing; } <span class="synType">private</span> <span class="synType">static</span> <span class="synType">void</span> OnClosing(Scene scene, <span class="synType">bool</span> removingScene) { <span class="synStatement">if</span> (!HasOpenInstances<ReferenceFinder>()) <span class="synStatement">return</span>; GetWindow<ReferenceFinder>().Close(); } [MenuItem(<span class="synConstant">"KEditorExtensions/Reference/ReferenceFinder"</span>)] <span class="synType">private</span> <span class="synType">static</span> <span class="synType">void</span> Open() { _cashedComponents = GetAllTypes(); GetWindow<ReferenceFinder>(<span class="synConstant">"Components Reference Finder."</span>); } [MenuItem(<span class="synConstant">"Assets/KEditorExtensions/Find references in active scene and all prefabs"</span>)] <span class="synType">private</span> <span class="synType">static</span> <span class="synType">void</span> FindWithRightClick() { var name = Selection.activeObject; _cashedComponents = GetAllTypes(); GetWindow<ReferenceFinder>(<span class="synConstant">"Components Reference Finder."</span>); _targetComponentName = name.name; SearchObjects(); } <span class="synType">private</span> <span class="synType">void</span> OnGUI() { EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField(<span class="synConstant">"Never change Scene before reset this window"</span>); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField(<span class="synConstant">"This window can search active scene objects and all prefabs"</span>); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); _targetComponentName = EditorGUILayout.TextField(<span class="synConstant">"Target Component Name: "</span>, _targetComponentName); EditorGUILayout.EndHorizontal(); <span class="synStatement">if</span> (_foundAssets.Count > <span class="synConstant">0</span>) { _currentScrollPosition = EditorGUILayout.BeginScrollView(_currentScrollPosition); <span class="synStatement">foreach</span> (var asset <span class="synStatement">in</span> _foundAssets) { EditorGUILayout.ObjectField(asset.name, asset, <span class="synStatement">typeof</span>(GameObject), <span class="synConstant">false</span>); } EditorGUILayout.EndScrollView(); } <span class="synStatement">if</span> (GUILayout.Button(<span class="synConstant">"Search"</span>)) { SearchObjects(); } } <span class="synType">private</span> <span class="synType">static</span> <span class="synType">void</span> SearchObjects() { _foundAssets.Clear(); var guids = AssetDatabase.FindAssets(<span class="synConstant">"t:GameObject"</span>, <span class="synConstant">null</span>); <span class="synStatement">foreach</span> (var guid <span class="synStatement">in</span> guids) { <span class="synType">string</span> path = AssetDatabase.GUIDToAssetPath(guid); var loadAsset = AssetDatabase.LoadAssetAtPath<GameObject>(path); var typeCash = GetType(_targetComponentName) ?? <span class="synConstant">null</span>; <span class="synStatement">if</span> (typeCash == <span class="synConstant">null</span>) { Debug.Log(<span class="synConstant">"No Type Found."</span>); <span class="synStatement">return</span>; } var tmp = loadAsset.GetComponentsInChildren(GetType(_targetComponentName) ?? <span class="synConstant">null</span>); <span class="synStatement">foreach</span> (var kari <span class="synStatement">in</span> tmp) { _foundAssets.Add(kari.gameObject); } } var allObj = GetObjectsInAllScene(); <span class="synStatement">foreach</span> (var obj <span class="synStatement">in</span> allObj) { var typeCash = GetType(_targetComponentName) ?? <span class="synConstant">null</span>; var tmp = obj.GetComponentsInChildren(GetType(_targetComponentName) ?? <span class="synConstant">null</span>); <span class="synStatement">if</span> (typeCash == <span class="synConstant">null</span>) { Debug.Log(<span class="synConstant">"No Type Found."</span>); <span class="synStatement">return</span>; } <span class="synStatement">foreach</span> (var kari <span class="synStatement">in</span> tmp) { _foundAssets.Add(kari.gameObject); } } } <span class="synComment">/// </span><span class="synIdentifier"><</span><span class="synStatement">summary</span><span class="synIdentifier">></span> <span class="synComment">/// All script files that exist in the project</span> <span class="synComment">/// </span><span class="synIdentifier"></</span><span class="synStatement">summary</span><span class="synIdentifier">></span> <span class="synType">static</span> MonoScript[] MonoScripts { <span class="synStatement">get</span> { <span class="synStatement">return</span> _monoScripts ?? (_monoScripts = Resources.FindObjectsOfTypeAll<MonoScript>().ToArray()); } } <span class="synComment">/// </span><span class="synIdentifier"><</span><span class="synStatement">summary</span><span class="synIdentifier">></span> <span class="synComment">/// Getting the type from the class name</span> <span class="synComment">/// </span><span class="synIdentifier"></</span><span class="synStatement">summary</span><span class="synIdentifier">></span> <span class="synType">private</span> <span class="synType">static</span> Type GetType(<span class="synType">string</span> className) { <span class="synStatement">if</span> (_typeDict == <span class="synConstant">null</span>) { _typeDict = <span class="synStatement">new</span> Dictionary<<span class="synType">string</span>, List<Type>>(); <span class="synStatement">foreach</span> (var type <span class="synStatement">in</span> _cashedComponents) { <span class="synStatement">if</span> (!_typeDict.ContainsKey(type.Name)) { _typeDict.Add(type.Name, <span class="synStatement">new</span> List<Type>()); } _typeDict[type.Name].Add(type); } } <span class="synComment">// If the class exists, show it in the list</span> <span class="synStatement">if</span> (_typeDict.ContainsKey(className)) { <span class="synStatement">return</span> _typeDict[className][<span class="synConstant">0</span>]; } <span class="synStatement">else</span> { <span class="synComment">// If the class doesn't exist, get it just in case, and run again.</span> <span class="synStatement">if</span> (_isFirstTime) { Debug.Log(<span class="synConstant">"Not found. ReScanning..."</span>); _cashedComponents = GetAllTypes(); _isFirstTime = <span class="synConstant">false</span>; GetType(className); } _isFirstTime = <span class="synConstant">true</span>; <span class="synStatement">return</span> <span class="synConstant">null</span>; } } <span class="synComment">/// </span><span class="synIdentifier"><</span><span class="synStatement">summary</span><span class="synIdentifier">></span> <span class="synComment">/// Get all class</span> <span class="synComment">/// </span><span class="synIdentifier"></</span><span class="synStatement">summary</span><span class="synIdentifier">></span> <span class="synType">private</span> <span class="synType">static</span> IEnumerable<Type> GetAllTypes() { var types = AppDomain.CurrentDomain.GetAssemblies() .SelectMany(asm => asm.GetTypes()) .Where(type => type != <span class="synConstant">null</span> && !<span class="synType">string</span>.IsNullOrEmpty(type.Namespace)) .Where(type => type.Namespace.Contains(<span class="synConstant">"UnityEngine"</span>)); var localTypes = MonoScripts .Where(script => script != <span class="synConstant">null</span>) .Select(script => script.GetClass()) .Where(classType => classType != <span class="synConstant">null</span>) .Where(classType => classType.Module.Name == <span class="synConstant">"Assembly-CSharp.dll"</span>); <span class="synStatement">return</span> types.Concat(localTypes).Distinct(); } <span class="synType">private</span> <span class="synType">static</span> GameObject[] GetObjectsInAllScene(<span class="synType">bool</span> includeInactive = <span class="synConstant">true</span>) { var sceneNumber = SceneManager.sceneCount; IEnumerable<GameObject> resultObjects = (GameObject[]) Enumerable.Empty<GameObject>(); <span class="synStatement">for</span> (<span class="synType">int</span> i = <span class="synConstant">0</span>; i < sceneNumber; i++) { var obj = SceneManager.GetSceneAt(i).GetRootGameObjects(); resultObjects = resultObjects.Concat(obj); } <span class="synStatement">return</span> resultObjects.ToArray(); } } <span class="synPreProc">#endif</span> |
