SceneObjectReferenceWindow()
        {
            from = new FromObjectReferenceWindow();
            to = new ToReferenceWindow();

            EditorApplication.playmodeStateChanged -= PlayModeChange;
            EditorApplication.playmodeStateChanged += PlayModeChange;
        }
Exemplo n.º 2
0
        SceneObjectReferenceWindow()
        {
            from = new FromObjectReferenceWindow();
            to   = new ToReferenceWindow();

            EditorApplication.playmodeStateChanged -= PlayModeChange;
            EditorApplication.playmodeStateChanged += PlayModeChange;
        }
        static string ComponentBaseGraph()
        {
            List <string> uniqueStrings = new List <string>();
            StringBuilder exportText    = new StringBuilder();
            Dictionary <string, List <ReferenceObject> > itemDirectry = new Dictionary <string, List <ReferenceObject> >();
            List <string> ignoreType = new List <string> {
                "GameObject", "Transform"
            };

            List <MonoBehaviour> monobehaviourList = new List <MonoBehaviour>();

            SceneObjectUtility.UpdateGlovalReferenceList();

            exportText.AppendLine("digraph sample {");
            exportText.AppendLine("graph [rankdir=\"LR\"]");
            exportText.AppendLine("node [ shape = record , style=filled, fillcolor=\"#efefef\",fontname=Helvetica, fontsize=10.5, fontcolor=\"#2b2b2b\", height=0.25, width=1, penwidth=0.1 ];");
            exportText.AppendLine("edge [arrowhead=normal,arrowsize=0.5,len=0.5, color=\"#bfbfbf\"];");


            foreach (var obj in SceneObjectUtility.GetAllObjectsInScene(false))
            {
                foreach (var comp in obj.GetComponents <MonoBehaviour>())
                {
                    monobehaviourList.Add(comp);
                }
            }

            ///-------------------


            foreach (var obj in SceneObjectUtility.SceneReferenceObjects)
            {
                var componentType = obj.referenceComponent.GetType().Name;

                if (obj.referenceComponent.gameObject.CompareTag("EditorOnly"))
                {
                    continue;
                }

                if (!itemDirectry.ContainsKey(componentType))
                {
                    itemDirectry.Add(componentType, new List <ReferenceObject>());
                }
                var list = itemDirectry[componentType];
                list.Add(obj);
            }

            foreach (var dic in itemDirectry.Keys)
            {
                if (dic == null)
                {
                    continue;
                }

                var list = itemDirectry[dic];
                list.RemoveAll(item => SceneObjectUtility.GetGameObject(item.value) == item.referenceComponent.gameObject);
                if (list.Count == 0)
                {
                    continue;
                }

                foreach (var obj in list)
                {
                    var baseObject = obj.referenceComponent.GetType();
                    var toObject   = obj.value.GetType();

                    if (toObject == null)
                    {
                        continue;
                    }

                    if (ignoreType.Contains(toObject.Name))
                    {
                        continue;
                    }


                    string text = string.Format("\"{0}\" -> \"{1}\";", baseObject.Name, toObject.Name);

                    if (uniqueStrings.Contains(text))
                    {
                        continue;
                    }

                    exportText.AppendLine(text);
                    uniqueStrings.Add(text);
                }
            }

            ///-------------------


            List <ToReferenceWindow.PerhapsReferenceObject> perhapsList = new List <ToReferenceWindow.PerhapsReferenceObject>();

            foreach (var monobehaviour in monobehaviourList)
            {
                ToReferenceWindow.UpdatePerahpsReferenceObjectList(monobehaviour, perhapsList);
            }


            foreach (var obj in perhapsList)
            {
                if (ignoreType.Contains(obj.referenceMonobehaviourName))
                {
                    continue;
                }


                string text = string.Format("\"{0}\" -> \"{1}\";", obj.compType.Name, obj.referenceMonobehaviourName);

                if (uniqueStrings.Contains(text))
                {
                    continue;
                }

                exportText.AppendLine(text);
                uniqueStrings.Add(text);
            }


            ///-------------------


            List <CallbackCallObject> callbackObjectList = new List <CallbackCallObject>();

            foreach (var monobehaviour in monobehaviourList)
            {
                foreach (var text in MonoScript.FromMonoBehaviour(monobehaviour).text.Split(';'))
                {
                    if (SceneObjectUtility.AddMatchMethod(text, monobehaviour, "SendMessage\\((?<call>.*?),.*\\)", callbackObjectList))
                    {
                        continue;
                    }
                    if (SceneObjectUtility.AddMatchMethod(text, monobehaviour, "SendMessage\\((?<call>.*?)\\)", callbackObjectList))
                    {
                        continue;
                    }
                    if (SceneObjectUtility.AddMatchMethod(text, monobehaviour, "BroadcastMessage\\((?<call>.*?)\\)", callbackObjectList))
                    {
                        continue;
                    }
                    if (SceneObjectUtility.AddMatchMethod(text, monobehaviour, "BroadcastMessage\\((?<call>.*?)\\)", callbackObjectList))
                    {
                        continue;
                    }
                }
            }

            foreach (var callback in callbackObjectList)
            {
                foreach (var item in monobehaviourList)
                {
                    var method = item.GetType().GetMethod(callback.method,
                                                          System.Reflection.BindingFlags.NonPublic |
                                                          System.Reflection.BindingFlags.Public |
                                                          System.Reflection.BindingFlags.Instance);
                    if (method != null)
                    {
                        foreach (var comp in callback.callComponent)
                        {
                            if (ignoreType.Contains(item.GetType().Name))
                            {
                                continue;
                            }

                            string text = string.Format("\"{0}\" -> \"{1}\" [style = dotted];", comp.GetType().Name, item.GetType().Name);
                            if (uniqueStrings.Contains(text))
                            {
                                continue;
                            }
                            exportText.AppendLine(text);
                            uniqueStrings.Add(text);
                        }
                    }
                }
            }

            List <ANimationCallbackObject> animCallbackObjectList = new List <ANimationCallbackObject>();

            foreach (var obj in SceneObjectUtility.GetAllObjectsInScene(false))
            {
                if (obj.GetComponent <Animator>() != null)
                {
                    SceneObjectUtility.GetAnimationEvents(obj.GetComponent <Animator>(), animCallbackObjectList);
                }
            }

            foreach (var callback in animCallbackObjectList)
            {
                foreach (var item in monobehaviourList)
                {
                    var method = item.GetType().GetMethod(callback.method,
                                                          System.Reflection.BindingFlags.NonPublic |
                                                          System.Reflection.BindingFlags.Public |
                                                          System.Reflection.BindingFlags.Instance);
                    if (method != null)
                    {
                        foreach (var comp in callback.callComponent)
                        {
                            if (ignoreType.Contains(item.GetType().Name))
                            {
                                continue;
                            }

                            string text = string.Format("\"AnimClip({0})\" -> \"{1}\" [style = dotted];", callback.clip.name, item.GetType().Name);
                            if (uniqueStrings.Contains(text))
                            {
                                continue;
                            }
                            exportText.AppendLine(text);
                            uniqueStrings.Add(text);
                        }
                    }
                }
            }



            //---------------


            List <CallbackObject> co = new List <CallbackObject>();

            if (GameObject.FindObjectOfType <Collider2D>() != null)
            {
                co.Add(new CallbackObject()
                {
                    method = "OnCollisionEnter2D", callComponenttype = typeof(Collider2D)
                });
                co.Add(new CallbackObject()
                {
                    method = "OnCollisionExit2D", callComponenttype = typeof(Collider2D)
                });
                co.Add(new CallbackObject()
                {
                    method = "OnCollisionStay2D", callComponenttype = typeof(Collider2D)
                });
                co.Add(new CallbackObject()
                {
                    method = "OnTriggerEnter2D", callComponenttype = typeof(Collider2D)
                });
                co.Add(new CallbackObject()
                {
                    method = "OnTriggerExit2D", callComponenttype = typeof(Collider2D)
                });
                co.Add(new CallbackObject()
                {
                    method = "OnTriggerStay2D", callComponenttype = typeof(Collider2D)
                });
            }

            if (GameObject.FindObjectOfType <Collider>() != null)
            {
                co.Add(new CallbackObject()
                {
                    method = "OnCollisionEnter", callComponenttype = typeof(Collider)
                });
                co.Add(new CallbackObject()
                {
                    method = "OnCollisionExit", callComponenttype = typeof(Collider)
                });
                co.Add(new CallbackObject()
                {
                    method = "OnCollisionStay", callComponenttype = typeof(Collider)
                });
                co.Add(new CallbackObject()
                {
                    method = "OnTriggerEnter", callComponenttype = typeof(Collider)
                });
                co.Add(new CallbackObject()
                {
                    method = "OnTriggerExit", callComponenttype = typeof(Collider)
                });
                co.Add(new CallbackObject()
                {
                    method = "OnTriggerStay", callComponenttype = typeof(Collider)
                });
            }

            if (GameObject.FindObjectOfType <Animator>() != null)
            {
                co.Add(new CallbackObject()
                {
                    method = "OnAnimatorMove", callComponenttype = typeof(Animator)
                });
            }

            if (GameObject.FindObjectOfType <Camera>() != null)
            {
                var type = typeof(Camera);
                co.Add(new CallbackObject()
                {
                    method = "OnPostRender", callComponenttype = type
                });
                co.Add(new CallbackObject()
                {
                    method = "OnPreCull", callComponenttype = type
                });
                co.Add(new CallbackObject()
                {
                    method = "OnPreRender", callComponenttype = type
                });
                co.Add(new CallbackObject()
                {
                    method = "OnRenderImage", callComponenttype = type
                });
                co.Add(new CallbackObject()
                {
                    method = "OnRenderObject", callComponenttype = type
                });
                co.Add(new CallbackObject()
                {
                    method = "OnWillRenderObject ", callComponenttype = type
                });
            }

            List <System.Type> uniqueMonobehaviourType = new List <System.Type>();

            foreach (var monobehaviour in monobehaviourList)
            {
                var type = monobehaviour.GetType();
                if (!uniqueMonobehaviourType.Contains(type))
                {
                    uniqueMonobehaviourType.Add(type);
                }
            }

            foreach (var callback in co)
            {
                foreach (var monobehaviourType in uniqueMonobehaviourType)
                {
                    var method = monobehaviourType.GetMethod(callback.method,
                                                             System.Reflection.BindingFlags.NonPublic |
                                                             System.Reflection.BindingFlags.Public |
                                                             System.Reflection.BindingFlags.Instance);

                    if (method != null)
                    {
                        string text = string.Format("\"{0}\" -> \"{1}\" [style = dotted];", callback.callComponenttype.Name, monobehaviourType.Name);
                        if (uniqueStrings.Contains(text))
                        {
                            continue;
                        }
                        exportText.AppendLine(text);
                        uniqueStrings.Add(text);
                    }
                }
            }


            exportText.AppendLine("}");

            return(exportText.ToString());
        }