public void VerifyProperty(VerifyTarget verifyTarget)
        {
            propertyCannotBeFound.Clear();
            IEnumerable <ViewSystemComponentData> targetVerifyDatas = null;

            //Data may changed by Component fixer so refresh again.
            if (verifyTarget == VerifyTarget.Override)
            {
                RefreshOverrideDatas();
                targetVerifyDatas = allOverrideDatas.SelectMany(m => m.overrideDatas).Cast <ViewSystemComponentData>();
            }
            if (verifyTarget == VerifyTarget.Event)
            {
                RefreshEventDatas();
                targetVerifyDatas = allEventDatas.SelectMany(m => m.eventDatas).Cast <ViewSystemComponentData>();
            }

            foreach (var item in targetVerifyDatas)
            {
                var t = MacacaGames.Utility.GetType(item.targetComponentType);
                if (t == null)
                {
                    ViewSystemLog.LogError(item.targetComponentType + " still not fixed cannot be found, will ignore while verify property");
                    continue;
                }
                var propertyName = item.targetPropertyName;
                if (t.ToString().Contains("UnityEngine."))
                {
                    propertyName = ViewSystemUtilitys.ParseUnityEngineProperty(item.targetPropertyName);
                }

                if (t.GetField(item.targetPropertyName, bindingFlags) == null && t.GetProperty(propertyName, bindingFlags) == null)
                {
                    ViewSystemLog.LogError($"{item.targetPropertyName} in {item.targetComponentType} cannot be found");
                    if (propertyCannotBeFound.Count(m => m == item.targetComponentType + "," + item.targetPropertyName) == 0)
                    {
                        propertyCannotBeFound.Add(item.targetComponentType + "," + item.targetPropertyName);
                    }
                }
            }

            if (propertyCannotBeFound.Count > 0)
            {
                if (EditorUtility.DisplayDialog(
                        "Something goes wrong!",
                        "There are some override property is missing, do you want to open fixer window",
                        "Yes, Please",
                        "Not now"))
                {
                    var window = ScriptableObject.CreateInstance <PropertyFixerWindow>();
                    window.SetData(propertyCannotBeFound, targetVerifyDatas, saveData, () =>
                    {
                        //Make sure SetDirty
                        EditorUtility.SetDirty(saveData);
                        if (verifyTarget == VerifyTarget.Event)
                        {
                            VerifyEvents();
                        }
                    });
                    window.ShowUtility();
                }
            }
            else
            {
                ViewSystemLog.Log("Great, everying looks good!");
            }
        }
        public void VerifyGameObject(VerifyTarget verifyTarget = VerifyTarget.All)
        {
            if (editor == null)
            {
                ViewSystemLog.LogError("Cannot verify save data, is editor init correctlly?");
                return;
            }

            if (saveData == null)
            {
                ViewSystemLog.LogError("Cannot verify save data, is editor init correctlly?");
                return;
            }

            gameObjectCannotBeFound.Clear();

            var overrideDatasInPages  = saveData.viewPages.Select(m => m.viewPage);
            var overrideDatasInStates = saveData.viewStates.Select(m => m.viewState);

            foreach (var viewPage in overrideDatasInPages)
            {
                foreach (var viewPageItem in viewPage.viewPageItems)
                {
                    List <ViewSystemComponentData> verifyTargets = new List <ViewSystemComponentData>();

                    if (verifyTarget == VerifyTarget.All || verifyTarget == VerifyTarget.Override)
                    {
                        verifyTargets.AddRange(viewPageItem.overrideDatas.Cast <ViewSystemComponentData>());
                    }

                    if (verifyTarget == VerifyTarget.All || verifyTarget == VerifyTarget.Event)
                    {
                        verifyTargets.AddRange(viewPageItem.eventDatas.Cast <ViewSystemComponentData>());
                    }
                    if (viewPageItem.viewElement == null)
                    {
                        ViewSystemLog.LogError("One or more viewElement is null, verify Page and State first.");
                        return;
                    }
                    foreach (var verifyData in verifyTargets)
                    {
                        var transform = viewPageItem.viewElement.transform.Find(verifyData.targetTransformPath);
                        if (transform == null)
                        {
                            gameObjectCannotBeFound.Add(
                                new ViewSystemGameObjectMissingData
                            {
                                isViewState         = false,
                                viewElement         = viewPageItem.viewElement,
                                stateOrPageName     = viewPage.name,
                                viewSystemComponent = verifyData
                            });
                        }
                    }
                }
            }

            foreach (var viewState in overrideDatasInStates)
            {
                foreach (var viewPageItem in viewState.viewPageItems)
                {
                    List <ViewSystemComponentData> verifyTargets = new List <ViewSystemComponentData>();

                    if (verifyTarget == VerifyTarget.All || verifyTarget == VerifyTarget.Override)
                    {
                        verifyTargets.AddRange(viewPageItem.overrideDatas.Cast <ViewSystemComponentData>());
                    }

                    if (verifyTarget == VerifyTarget.All || verifyTarget == VerifyTarget.Event)
                    {
                        verifyTargets.AddRange(viewPageItem.eventDatas.Cast <ViewSystemComponentData>());
                    }

                    foreach (var verifyData in verifyTargets)
                    {
                        var transform = viewPageItem.viewElement.transform.Find(verifyData.targetTransformPath);
                        if (transform == null)
                        {
                            gameObjectCannotBeFound.Add(
                                new ViewSystemGameObjectMissingData
                            {
                                isViewState         = true,
                                viewElement         = viewPageItem.viewElement,
                                stateOrPageName     = viewState.name,
                                viewSystemComponent = verifyData
                            });
                        }
                    }
                }
            }

            if (gameObjectCannotBeFound.Count > 0)
            {
                if (EditorUtility.DisplayDialog(
                        "Something goes wrong!",
                        "There are some GameObject is missing, do you want to open fixer window",
                        "Yes, Please",
                        "Not now"))
                {
                    var window = ScriptableObject.CreateInstance <GameObjectFixerWindow>();
                    window.SetData(gameObjectCannotBeFound, saveData, () =>
                    {
                        //Make sure SetDirty
                        EditorUtility.SetDirty(saveData);
                    });
                    window.ShowUtility();
                }
            }
            else
            {
                ViewSystemLog.Log("GameObject looks good.");
            }
        }
        public void VerifyComponent(VerifyTarget verifyTarget)
        {
            if (editor == null)
            {
                ViewSystemLog.LogError("Cannot verify save data, is editor init correctlly?");
                return;
            }

            if (saveData == null)
            {
                ViewSystemLog.LogError("Cannot verify save data, is editor init correctlly?");
                return;
            }
            typeNameCannotBeFound.Clear();
            if (verifyTarget == VerifyTarget.Event)
            {
                RefreshEventDatas();
                foreach (var vpi in allEventDatas)
                {
                    foreach (var item in vpi.eventDatas)
                    {
                        var t = MacacaGames.Utility.GetType(item.targetComponentType);
                        if (t == null)
                        {
                            ViewSystemLog.LogError(item.targetComponentType + "  cannot be found");
                            typeNameCannotBeFound.Add(item.targetComponentType);
                        }
                    }
                }
            }
            if (verifyTarget == VerifyTarget.Override)
            {
                RefreshOverrideDatas();
                foreach (var vpi in allOverrideDatas)
                {
                    foreach (var item in vpi.overrideDatas)
                    {
                        var t = MacacaGames.Utility.GetType(item.targetComponentType);
                        if (t == null)
                        {
                            ViewSystemLog.LogError(item.targetComponentType + "  cannot be found");
                            typeNameCannotBeFound.Add(item.targetComponentType);
                        }
                    }
                }
            }

            if (typeNameCannotBeFound.Count > 0)
            {
                if (EditorUtility.DisplayDialog(
                        "Something goes wrong!",
                        "There are some override component is missing, do you want to open fixer window",
                        "Yes, Please",
                        "Not now"))
                {
                    List <ViewSystemComponentData> componentDatas;
                    if (verifyTarget == VerifyTarget.Override)
                    {
                        componentDatas = allOverrideDatas.Cast <ViewSystemComponentData>().ToList();
                    }
                    else
                    {
                        componentDatas = allEventDatas.Cast <ViewSystemComponentData>().ToList();
                    }
                    var window = ScriptableObject.CreateInstance <ComponentFixerWindow>();
                    window.SetData(typeNameCannotBeFound, componentDatas, () =>
                    {
                        //Make sure SetDirty
                        EditorUtility.SetDirty(saveData);
                        VerifyProperty(verifyTarget);
                    });
                    window.ShowUtility();
                }
            }
            else
            {
                ViewSystemLog.Log("Components looks good, let's check properties.");
                VerifyProperty(verifyTarget);
            }
        }