everything is working find as I wanted. this is something I did to search for script name.
it will filter and show all gameobjects with the script attached to it.
my question if my code written the right way? if using Dictionary is good idea? and if not using Dictionary how to do it?
screenshot:
this is the code:
using UnityEngine;
using UnityEditor;
using System.Collections;
using System.Collections.Generic;
using System.Reflection;
using System;
using System.Linq;
using System.Xml;
using static Unity.VisualScripting.Member;
using Unity.VisualScripting;
using log4net.Util;
public class ScriptFinder : EditorWindow
{
static ScriptFinder window;
static Dictionary<GameObject, string> dictio = new Dictionary<GameObject, string>();
Vector2 scrollPos;
static List<int> num = new List<int>();
static bool showPosition = true;
[MenuItem("EditorUtility/Script Finder")]
static void OpenScriptFinder()
{
window = (ScriptFinder)EditorWindow.GetWindow(typeof(ScriptFinder));
MonoBehaviour[] scripts = UnityEngine.Object.FindObjectsOfType<MonoBehaviour>();
foreach (MonoBehaviour script in scripts)
{
Type scriptType = script.GetType();
var scope = scriptType.Namespace;
if (scope == null || !scope.StartsWith("Unity"))
{
if (!dictio.Keys.Contains(script.gameObject))
{
dictio.Add(script.gameObject, scriptType.Name);
}
}
}
}
int counter = 0;
string searchString;
void OnGUI()
{
GUI.color = Color.white;
GUILayout.FlexibleSpace();
searchString = GUILayout.TextField(searchString, GUI.skin.FindStyle("ToolbarSeachTextField"));
if (GUILayout.Button("", GUI.skin.FindStyle("ToolbarSeachCancelButton")))
{
searchString = "";
GUI.FocusControl(null);
}
scrollPos =
EditorGUILayout.BeginScrollView(scrollPos, false,true,
GUILayout.ExpandWidth(true), GUILayout.Height(position.height));
foreach (KeyValuePair<GameObject, string> pair in dictio)
{
EditorGUILayout.BeginHorizontal();
if (searchString != null)
{
if (pair.Value.Contains(searchString, StringComparison.CurrentCultureIgnoreCase))
{
EditorGUILayout.ObjectField(pair.Key, typeof(GameObject), true);
foreach (UnityEngine.Transform g in pair.Key.transform.GetComponentsInChildren<UnityEngine.Transform>())
{
}
num.Add(EditorGUILayout.TextField(pair.Value).Length);
}
}
else
{
EditorGUILayout.ObjectField(counter.ToString(), pair.Key, typeof(GameObject), true);
num.Add(EditorGUILayout.TextField(pair.Value).Length);
if (counter != dictio.Count)
{
counter++;
}
}
EditorGUILayout.EndHorizontal();
}
GUILayout.EndScrollView();
}
}