public static void DisappearObjects() { ReferenceExplorerData.RestoreAllData(); ReferenceExplorerData.RestoreComponentReferenceData(); var objects = ReferenceExplorerData.allObjects; foreach (var obj in objects) { obj.hideFlags = HideFlags.HideInHierarchy; } foreach (var component in ReferenceExplorerData.allReferenceInfo) { var fromObject = ReferenceExplorerUtility.GetGameObject(component.fromObject); var referencetarget = ReferenceExplorerUtility.GetGameObject(component.referenceTarget); if (fromObject != null) { Appear(fromObject.transform); } if (referencetarget != null) { Appear(referencetarget.transform); } } }
/// <summary> /// Collects the field reference. /// </summary> /// <param name="component">Component.</param> /// <param name="referenceInfoList">Reference info list.</param> static void CollectFieldReference(System.Object component, ref List <ReferenceInfo> referenceInfoList, System.Object baseObject, int depth) { if (component == null) { return; } Type type = component.GetType(); foreach (var field in type.GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static | BindingFlags.DeclaredOnly)) { var value = ReferenceExplorerUtility.GetObject(field.GetValue(component)); if (value == null) { continue; } if (value is Component || value is GameObject) { referenceInfoList.Add(new ReferenceInfo() { fromObject = (System.Object)baseObject, referenceName = field.Name, referenceTarget = (System.Object)value }); continue; } if (value is IEnumerable) { foreach (var element in value as IEnumerable) { if (element is GameObject || element is Component) { referenceInfoList.Add(new ReferenceInfo() { fromObject = (System.Object)baseObject, referenceName = field.Name, referenceTarget = (System.Object)element }); } else if (IgnoreComponents.IsNotAnalyticsTypes(element)) { referenceInfoList.AddRange(FindReferenceInfo(element, baseObject, depth)); } } continue; } else if (value is System.Object) { referenceInfoList.AddRange(FindReferenceInfo(value, baseObject, depth)); continue; } } }
public static void WriteLine(IEnumerable <object> referenceObjectList, GameObject selection, Color mainColor, Color shaodowColor, float curve) { var cameraTransform = SceneView.currentDrawingSceneView.camera.transform; var rotate = cameraTransform.rotation; var cameraPos = cameraTransform.position; var refObjects = referenceObjectList.Select(item => ReferenceExplorerUtility.GetGameObject(item)); foreach (var targetObject in refObjects) { try { if (targetObject == null || PrefabUtility.GetPrefabType(targetObject) == PrefabType.Prefab) { continue; } var startPosition = selection.transform.position; var endPosition = targetObject.transform.position; var size = Vector3.Distance(endPosition, cameraPos) * 1f; if (startPosition == endPosition) { continue; } Handles.color = shaodowColor; var diffPos = startPosition - endPosition; var tan = new Vector3(diffPos.y, diffPos.x, diffPos.z); var startTan = startPosition; var endTan = endPosition + tan * curve; Handles.CircleCap(0, endPosition, rotate, size); for (int i = 0; i < 3; i++) { Handles.DrawBezier(startPosition, endPosition, startTan, endTan, shaodowColor, null, (i + 1) * 5); } Handles.DrawBezier(startPosition, endPosition, startTan, endTan, mainColor, null, 1); Handles.Label(endPosition, targetObject.name); } catch (MissingReferenceException) { Debug.LogWarningFormat(selection, "{0} is missing! check it!", targetObject.name); } } }
void ReferenceLineWrite(GameObject selection) { List <ReferenceInfo> list = new List <ReferenceInfo>(); foreach (var refs in referenceList) { if (ReferenceExplorerData.IsOpenComponentList.Contains(refs.type) == false) { list.AddRange(refs.referenceInfoList); } } var collection = list .Where(item => ReferenceExplorerUtility.GetGameObject(item.fromObject) == selection) .Select(item => item.referenceTarget); ReferenceExplorerUtility.WriteLine(collection, selection, Color.red, new Color(0.5f, 0, 0, 0.06f), -0.04f); }
/// <summary> /// Collects the event reference. /// </summary> /// <param name="component">Component.</param> /// <param name="referenceInfoList">Reference info list.</param> static void CollectEventReference(System.Object component, ref List <ReferenceInfo> referenceInfoList) { if (component == null) { return; } Type type = component.GetType(); foreach (var eventType in type.GetEvents()) { var eventField = type.GetField(eventType.Name, BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public | BindingFlags.FlattenHierarchy); var eventValue = (System.Delegate)eventField.GetValue(component); if (eventValue == null) { continue; } var invocationList = eventValue.GetInvocationList(); foreach (var ev in invocationList) { var connectedMethod = ReferenceExplorerUtility.GetObject(ev.Target); if (connectedMethod == null || connectedMethod is Component == false || connectedMethod is GameObject == false) { continue; } referenceInfoList.Add(new ReferenceInfo() { fromObject = (System.Object)component, referenceName = eventType.Name, referenceTarget = (System.Object)connectedMethod }); } } }
void OnGUIReferencedBy(IEnumerable <ReferenceViewerClassbase> referencedByList) { foreach (var type in referencedByList.Select(item => item.type).Distinct()) { var referendedByItems = referencedByList.Where(item => item.type == type); EditorGUI.indentLevel = 1; using (var itemLayout = new GUILayout.VerticalScope("box")) { var isShow = !ReferenceExplorerData.IsOpenComponentList.Contains(type); if (EditorGUILayout.Foldout(isShow, type.FullName) != isShow) { if (isShow) { ReferenceExplorerData.IsOpenComponentList.Add(type); } else { ReferenceExplorerData.IsOpenComponentList.Remove(type); } } if (isShow) { EditorGUI.indentLevel = 2; var monoscript = ReferenceExplorerData.allMonoscript.Find(item => item.GetClass() == type); EditorGUILayout.ObjectField("script", monoscript, typeof(MonoScript), true); foreach (var referenceItem in referendedByItems) { foreach (var component in referenceItem.referenceInfoList) { var fromObject = ReferenceExplorerUtility.GetGameObject(component.fromObject); EditorGUILayout.ObjectField(component.referenceName, fromObject, typeof(Object), true); } } } } } }
public static void UpdateSelectedComponentList() { if (localSelectedCollectionTime == UnityEditor.EditorApplication.timeSinceStartup) { return; } GameObject[] objects = Selection.gameObjects; allSelectedComponent.Clear(); if (objects == null) { allSelectedComponent.AddRange(allComponents); } allSelectedComponent = allComponents .Where(item => objects.Contains(ReferenceExplorerUtility.GetGameObject(item))) .ToList(); localSelectedCollectionTime = UnityEditor.EditorApplication.timeSinceStartup; }
public static bool IsFamilly(object obj, GameObject target, bool isParent) { var gameObj = ReferenceExplorerUtility.GetGameObject(obj); if (gameObj == null) { return(false); } if (isParent) { if (gameObj == target) { return(true); } return(IsFamilly(gameObj.transform.parent, target, true)); } else { if (gameObj == target) { return(true); } var childCount = gameObj.transform.childCount; for (int i = 0; i < childCount; i++) { bool result = IsFamilly(gameObj.transform.GetChild(i), target, false); if (result == true) { return(true); } } } return(false); }
public static void DisappearObjectsWithFamillyReference() { ReferenceExplorerData.RestoreAllData(); ReferenceExplorerData.RestoreComponentReferenceData(); var objects = ReferenceExplorerData.allObjects; foreach (var obj in objects) { obj.hideFlags = HideFlags.HideInHierarchy; } foreach (var component in ReferenceExplorerData.allReferenceInfo) { var fromObject = ReferenceExplorerUtility.GetGameObject(component.fromObject); var referencetarget = ReferenceExplorerUtility.GetGameObject(component.referenceTarget); if (fromObject != null) { if (fromObject.transform.GetComponentsInChildren <Component> ().Any(item => item.gameObject == referencetarget) == false && fromObject.transform.GetComponentsInParent <Component> ().Any(item => item.gameObject == referencetarget) == false) { Appear(fromObject.transform); } } if (referencetarget != null) { if (referencetarget.transform.GetComponentsInChildren <Component> ().Any(item => item.gameObject == fromObject) == false && referencetarget.transform.GetComponentsInParent <Component> ().Any(item => item.gameObject == fromObject) == false) { Appear(referencetarget.transform); } } } }
public static IEnumerable <ReferenceViewerClassbase> AllReferencedByComponent(GameObject[] currentObjects, ReferenceIgnoreType ignoreType, string search = null) { var list = new List <ReferenceViewerClassbase> (); foreach (var currentObject in currentObjects) { var referencedByList = allReferenceInfo .Where(item => currentObject == ReferenceExplorerUtility.GetGameObject(item.referenceTarget)); if (string.IsNullOrEmpty(search) == false) { var dic = ReferenceExplorerUtility.GetTExtCommand(search); if (dic.ContainsKey("type")) { var typeText = dic ["type"]; referencedByList = referencedByList .Where(item => item.referenceName.ToLower().IndexOf(typeText) != -1 || item.referenceTarget.GetType().FullName.ToLower().IndexOf(typeText) != -1 || item.fromObject.GetType().FullName.ToLower().IndexOf(typeText) != -1 || ReferenceExplorerUtility.GetGameObject(item.fromObject).name.ToLower().IndexOf(typeText) != -1); } if (dic.ContainsKey("obj")) { var objName = dic ["obj"]; referencedByList = referencedByList .Where(item => ReferenceExplorerUtility.GetGameObject(item.fromObject).name.ToLower().IndexOf(objName) != -1); } if (dic.ContainsKey("param")) { var param = dic ["param"]; referencedByList = referencedByList .Where(item => item.referenceName.IndexOf(param) != -1); } } if (ignoreType == ReferenceIgnoreType.IgnoreSelf) { referencedByList = referencedByList.Where(item => currentObject != ReferenceExplorerUtility.GetGameObject(item.fromObject)) .Where(item => currentObjects.Contains(ReferenceExplorerUtility.GetGameObject(item.fromObject)) == false); } else if (ignoreType == ReferenceIgnoreType.IgnoreFamilly) { referencedByList = referencedByList.Where(item => ReferenceExplorerUtility.IsFamilly(item.fromObject, currentObject) == false) .Where(item => currentObjects.Contains(ReferenceExplorerUtility.GetGameObject(item.fromObject)) == false); } var allComponentType = referencedByList .Select(item => item.fromObject.GetType()) .Distinct().OrderBy(item => item.FullName); foreach (var uniqueComponentType in allComponentType) { var componentItme = new ReferenceViewerClassbase(); componentItme.type = uniqueComponentType; componentItme.referenceInfoList = referencedByList .Where(item => item.fromObject.GetType() == uniqueComponentType) .OrderBy(item => ReferenceExplorerUtility.GetGameObject(item.fromObject).name) .ToList(); list.Add(componentItme); } } return(list.Where(item => item.referenceInfoList.Count > 0)); }
public static void UpdateCallbacklist(bool selectedOBject, string search) { callbackList.Clear(); var callbacks = allMethodRecieveWithText.Select(item => item.callback).Distinct(); var objects = Selection.gameObjects; foreach (var callback in callbacks) { var callbackviewinfo = new CallbackViewerInfo(); callbackviewinfo.callback = callback; foreach (var monoScript in allMethodCallWithText.Where(item => item.callback == callback).Select(item => item.type).Distinct()) { if (selectedOBject && objects != null) { callbackviewinfo.senderList.AddRange(ReferenceExplorerData.allSelectedComponent .Where(item => item.GetType() == monoScript)); } else { callbackviewinfo.senderList.AddRange(ReferenceExplorerData.allComponents .Where(item => item.GetType() == monoScript)); } } foreach (var type in allMethodRecieveWithText .Where(item => item.callback == callback) .Select(item => item.monoScript.GetClass()) .Distinct()) { if (selectedOBject && objects != null) { var collection = ReferenceExplorerData.allSelectedComponent .Where(item => item.GetType() == type); callbackviewinfo.recieverList.AddRange(collection); } else { callbackviewinfo.recieverList.AddRange(ReferenceExplorerData.allComponents .Where(item => item.GetType() == type)); } } callbackList.Add(callbackviewinfo); } if (!string.IsNullOrEmpty(search)) { var dic = ReferenceExplorerUtility.GetTExtCommand(search); if (dic.ContainsKey("type")) { var typeText = dic["type"]; foreach (var callback in callbackList) { callback.recieverList = callback.recieverList .Where(item => item.GetType().FullName.ToLower().IndexOf(typeText) != -1) .ToList(); callback.senderList = callback.senderList .Where(item => item.GetType().FullName.ToLower().IndexOf(typeText) != -1) .ToList(); } } if (dic.ContainsKey("obj")) { var objName = dic["obj"]; foreach (var callback in callbackList) { callback.recieverList = callback.recieverList.Where(item => item.name.ToLower().IndexOf(objName) != -1).ToList(); callback.senderList = callback.senderList.Where(item => item.name.ToLower().IndexOf(objName) != -1).ToList(); } } } foreach (var callback in callbackList) { callback.recieverTypeList = callback.recieverList.Select(item => item.GetType()).Distinct().ToList(); callback.senderTypeList = callback.senderList.Select(item => item.GetType()).Distinct().ToList(); } }
void OnGUIClass() { using (var header = new GUILayout.HorizontalScope("box")){ EditorGUI.BeginChangeCheck(); isSelectedObject = GUILayout.Toggle(isSelectedObject, "selected", EditorStyles.toolbarButton, GUILayout.Width(70)); searchText = EditorGUILayout.TextField(searchText); if (EditorGUI.EndChangeCheck()) { CallbackData.UpdateCallbacklist(isSelectedObject, searchText); } orderType = (OrderType)EditorGUILayout.EnumPopup(orderType, EditorStyles.toolbarPopup, GUILayout.Width(95)); } using (var scrollRectLayout = new GUILayout.ScrollViewScope(classSroll)) { classSroll = scrollRectLayout.scrollPosition; var componentTypeList = ReferenceExplorerData.allComponentTypes.AsEnumerable(); var animatorBehaviourList = ReferenceExplorerData.animatorBehaviourList.AsEnumerable(); var doc = ReferenceExplorerUtility.GetTExtCommand(searchText); if (doc.ContainsKey("type")) { var typeText = doc["type"]; componentTypeList = componentTypeList. Where(item => item.FullName.ToLower().IndexOf(typeText) != -1 || item.GetInterfaces() .Any(interfaces => interfaces.FullName.ToLower().IndexOf(typeText) != -1)); animatorBehaviourList = animatorBehaviourList .Where(item => item.behaviour.GetType().FullName.ToLower().IndexOf(typeText) != -1); } if (orderType == OrderType.Names) { componentTypeList = componentTypeList .OrderBy(t1 => t1.FullName).ToList(); } else { componentTypeList = componentTypeList .OrderBy(t1 => ReferenceExplorerData.allComponents.Count(t2 => t1 == t2.GetType()) * -1).ToList(); } foreach (var type in componentTypeList) { Component component; int count; if (isSelectedObject) { component = ReferenceExplorerData.allSelectedComponent.Find(item => item.GetType() == type); count = ReferenceExplorerData.allSelectedComponent.Count(item => item.GetType() == type); } else { component = ReferenceExplorerData.allComponents.Find(item => item.GetType() == type); count = ReferenceExplorerData.allComponents.Count(item => item.GetType() == type); } if (count == 0) { continue; } var color = GUI.backgroundColor; if (type == currentType) { GUI.backgroundColor = new Color(1f, 0.8f, 0.8f); } using (var classViewLayout = new GUILayout.VerticalScope("box")) { using (var itemLayout = new GUILayout.HorizontalScope()) { string buttontext = (currentType == type) ? "▼" : "▶"; if (GUILayout.Button(buttontext, EditorStyles.miniLabel, GUILayout.Width(12))) { if (currentType == type) { currentType = null; } else { currentType = type; } } if (component == null) { continue; } if (component is MonoBehaviour) { var monoscript = MonoScript.FromMonoBehaviour((MonoBehaviour)component); EditorGUILayout.ObjectField(monoscript, type, false); } else { GUILayout.Label(type.ToString()); } EditorGUILayout.LabelField(count.ToString(), GUILayout.ExpandWidth(false), GUILayout.Width(40)); if (GUILayout.Button("F", EditorStyles.toolbarButton, GUILayout.Width(20))) { var components = ReferenceExplorerData.allComponents.FindAll(item => item.GetType() == type).Select(item => item.gameObject).ToArray(); Selection.objects = components; } } GUILayout.Space(5); EditorGUI.indentLevel = 1; if (type == currentType) { var components = isSelectedObject ? ReferenceExplorerData.allSelectedComponent : ReferenceExplorerData.allComponents; foreach (var obj in components .FindAll(item => item.GetType() == type) .OrderBy(item => item.name) .AsEnumerable()) { EditorGUILayout.ObjectField(obj, type, true); } } EditorGUI.indentLevel = 0; } GUI.backgroundColor = color; } foreach (var type in animatorBehaviourList.Select(item => item.behaviour.GetType()).Distinct()) { if (type == null) { continue; } var animators = animatorBehaviourList .Where(item => item.behaviour.GetType() == type) .Distinct(); if (animators.Count() == 0) { continue; } var color = GUI.backgroundColor; if (type == currentType) { GUI.backgroundColor = new Color(1f, 0.8f, 0.8f); } using (var classViewLayout = new GUILayout.VerticalScope("box")) { using (var componentHeader = new GUILayout.HorizontalScope()) { string buttontext = (currentType == type) ? "▼" : "▶"; if (GUILayout.Button(buttontext, EditorStyles.miniLabel, GUILayout.Width(12))) { if (currentType == type) { currentType = null; } else { currentType = type; } } var code = MonoScript.FromScriptableObject(animators.First().behaviour); EditorGUILayout.ObjectField(code, typeof(MonoScript), false); } if (type != currentType) { continue; } EditorGUI.indentLevel = 1; using (var animatotrLayouts = new GUILayout.VerticalScope()){ foreach (var anim in animators) { EditorGUILayout.ObjectField(anim.animator, typeof(Animator), true); } } EditorGUI.indentLevel = 0; } GUI.backgroundColor = color; } } }
/// <summary> /// Raises the GUI callback event. /// </summary> void OnGUICallback() { using (var header = new GUILayout.HorizontalScope("box")){ EditorGUI.BeginChangeCheck(); isSelectedObject = GUILayout.Toggle(isSelectedObject, "selected", EditorStyles.toolbarButton, GUILayout.Width(70)); searchText = EditorGUILayout.TextField(searchText); if (EditorGUI.EndChangeCheck()) { CallbackData.UpdateCallbacklist(isSelectedObject, searchText); } } EditorGUI.BeginChangeCheck(); callbackScroll = EditorGUILayout.BeginScrollView(callbackScroll); var width = position.width * 0.48f; foreach (var callback in CallbackData.callbackList) { if (callback.recieverList.Count == 0 && callback.senderList.Count == 0) { continue; } if (GUILayout.Button(callback.callback, EditorStyles.toolbarButton)) { opendCallbackList = callback.callback; } if (opendCallbackList != callback.callback) { continue; } if (callback.senderList.Where(item => ReferenceExplorerUtility.GetObject(item) != null).Count() != 0) { EditorGUILayout.LabelField("Sender", EditorStyles.boldLabel); foreach (var type in callback.senderTypeList) { using (var componentLayout = new EditorGUILayout.HorizontalScope()) { var senders = callback.senderList.Where(item => item.GetType() == type); if (type.IsSubclassOf(typeof(MonoBehaviour))) { var monoscript = MonoScript.FromMonoBehaviour((MonoBehaviour)callback.senderList.First()); EditorGUILayout.ObjectField(monoscript, typeof(MonoScript), true, GUILayout.Width(width)); using (var referencecomponentLayout = new EditorGUILayout.VerticalScope()){ foreach (var sender in senders) { EditorGUILayout.ObjectField(sender, typeof(Component), true, GUILayout.Width(width)); } } } } var animationSender = CallbackData.allAnimatorSender.Where(item => item.callback == callback.callback); foreach (var sender in animationSender) { using (var animatorLayout = new GUILayout.HorizontalScope()) { EditorGUILayout.ObjectField(sender.clip, typeof(AnimationClip), true, GUILayout.Width(width)); EditorGUILayout.ObjectField(sender.sender, typeof(Animator), true, GUILayout.Width(width)); } } } } if (callback.recieverList.Count != 0) { EditorGUILayout.LabelField("Reciever", EditorStyles.boldLabel); var types = callback.recieverTypeList; foreach (var type in types) { using (var componentLayout = new EditorGUILayout.HorizontalScope()) { var recievers = callback.recieverList.Where(item => item.GetType() == type); if (recievers.Count() == 0) { continue; } var monoscript = MonoScript.FromMonoBehaviour((MonoBehaviour)recievers.First()); EditorGUILayout.ObjectField(monoscript, typeof(MonoScript), true, GUILayout.Width(width)); using (var referenceComponentLayout = new EditorGUILayout.VerticalScope()) { foreach (var reciever in recievers) { EditorGUILayout.ObjectField(reciever, typeof(MonoScript), true, GUILayout.Width(width)); } } } GUILayout.Space(5); } } } EditorGUILayout.EndScrollView(); EditorGUI.EndChangeCheck(); }
public static void ExportObjectReference(bool isContainFamilly, bool isContainCallbacks) { try{ ReferenceExplorerData.RestoreAllData(); EditorUtility.DisplayProgressBar("Export GameObject Graph", "get all objects", 0); var objectNames = ReferenceExplorerData.allReferenceInfo .Where(item => ReferenceExplorerUtility.GetGameObject(item.referenceTarget) != null && ReferenceExplorerUtility.GetGameObject(item.referenceTarget) != null) .SelectMany(item => new GameObject[] { ReferenceExplorerUtility.GetGameObject(item.referenceTarget), ReferenceExplorerUtility.GetGameObject(item.fromObject) }).Distinct(); EditorUtility.DisplayProgressBar("Export GameObject Graph", "check reference", 0.2f); List <ReferenceInfoObject> referenceInfoList = new List <ReferenceInfoObject>(); foreach (var referenceInfo in ReferenceExplorerData.allReferenceInfo) { var fromObject = ReferenceExplorerUtility.GetGameObject(referenceInfo.fromObject); var targetObject = ReferenceExplorerUtility.GetGameObject(referenceInfo.referenceTarget); if (targetObject == null || fromObject == null) { continue; } if (isContainFamilly == false && ReferenceExplorerUtility.IsFamilly(fromObject, targetObject)) { continue; } if (referenceInfoList.Any(item => ReferenceExplorerUtility.GetGameObject(item.fromObject) == fromObject || ReferenceExplorerUtility.GetGameObject(item.targetObject) == targetObject) == true || fromObject == targetObject) { continue; } referenceInfoList.Add(new ReferenceInfoObject() { targetObject = fromObject, fromObject = targetObject, }); } EditorUtility.DisplayProgressBar("Export GameObject Graph", "exporting", 0.7f); StringBuilder exportBuilder = new StringBuilder(); exportBuilder.AppendLine("graph"); exportBuilder.AppendLine("["); foreach (var objName in objectNames) { if (referenceInfoList.Any(item => item.fromObject == objName || item.targetObject == objName) == false) { continue; } var isPrefab = PrefabUtility.GetPrefabObject(objName) == null; exportBuilder.AppendLine(" node"); exportBuilder.AppendLine(" ["); exportBuilder.AppendLine(" id "+ objName.GetHashCode()); exportBuilder.AppendLine(" label \""+ objName.name + "\""); exportBuilder.AppendLine(" graphics"); exportBuilder.AppendLine(" ["); if (isPrefab) { exportBuilder.AppendLine(" fill \"#FFFF99\""); } exportBuilder.AppendLine(" w "+ objName.name.Length * 10); exportBuilder.AppendLine(" ]"); exportBuilder.AppendLine(" ]"); } foreach (var referenceInfo in referenceInfoList) { exportBuilder.AppendLine(" edge"); exportBuilder.AppendLine(" ["); exportBuilder.AppendLine(" target "+ referenceInfo.fromObject.GetHashCode()); exportBuilder.AppendLine(" source "+ referenceInfo.targetObject.GetHashCode()); exportBuilder.AppendLine(" ]"); } exportBuilder.AppendLine("]"); EditorUtility.DisplayProgressBar("Export GameObject Graph", "done", 0.7f); System.IO.File.WriteAllText(System.DateTime.Now.ToFileTime() + ".gml", exportBuilder.ToString()); }finally{ EditorUtility.ClearProgressBar(); } }