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);
            }
        }
    }
示例#2
0
    /// <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);
        }
示例#5
0
    /// <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);
                            }
                        }
                    }
                }
            }
        }
示例#7
0
    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);
                }
            }
        }
    }
示例#10
0
    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();
        }
    }