IList <SpriteReferenceTreeElement> GetData()
    {
        List <SpriteReferenceTreeElement> replaceSpriteTreeElementList = new List <SpriteReferenceTreeElement>();
        SpriteReferenceTreeElement        root = new SpriteReferenceTreeElement(null, null, null, "", "Root", -1, 0);

        replaceSpriteTreeElementList.Add(root);
        return(replaceSpriteTreeElementList);
    }
    /// <summary>
    /// 断开图片引用并保存预制体
    /// </summary>
    private void BreakSpriteReferenceSavePrefab()
    {
        if (m_TreeView == null || m_TreeView.treeModel == null)
        {
            return;
        }
        IList <SpriteReferenceTreeElement> datas = m_TreeView.treeModel.GetData();

        if (datas != null && datas.Count > 0)
        {
            for (int i = 0; i < datas.Count; i++)
            {
                SpriteReferenceTreeElement element = datas[i];
                if (element.breakSpriteReference == false)
                {
                    continue;
                }
                GameObject prefab = element.Go;
                if (prefab != null)
                {
                    GameObject prefabGameobject  = PrefabUtility.InstantiatePrefab(prefab) as GameObject;
                    Transform  imageChild        = prefabGameobject.transform.Find(element.Path);
                    bool       hasBreakReference = false;
                    if (imageChild != null)
                    {
                        Image childImage = imageChild.GetComponent <Image>();
                        if (childImage != null)
                        {
                            childImage.sprite = null;
                            hasBreakReference = true;
                        }
                    }
                    //5、保存预制体
                    if (hasBreakReference)
                    {
                        PrefabUtility.ReplacePrefab(prefabGameobject, prefab, ReplacePrefabOptions.Default);
                    }
                    DestroyImmediate(prefabGameobject);
                    AssetDatabase.SaveAssets();
                }
            }

            AssetDatabase.Refresh();
        }
    }
    public static void CheckUISpriteInPrefab(GameObject prefab, Sprite sprite, ref List <SpriteReferenceTreeElement> result)
    {
        if (prefab == null || sprite == null)
        {
            return;
        }
        Image[]       images    = prefab.GetComponentsInChildren <Image>(true);
        List <string> childPath = new List <string>();

        if (images != null && images.Length > 0)
        {
            for (int i = 0; i < images.Length; i++)
            {
                if (images[i].sprite == sprite)
                {
                    SpriteReferenceTreeElement element = new SpriteReferenceTreeElement(prefab, images[i], sprite, GetPath(prefab, images[i].gameObject), images[i].gameObject.name, 0, result.Count + 1);
                    result.Add(element);
                }
            }
        }
    }
    private void WirteReferenceSpriteDataToFile()
    {
        if (m_TreeView == null || m_TreeView.treeModel == null)
        {
            return;
        }
        IList <SpriteReferenceTreeElement> datas = m_TreeView.treeModel.GetData();

        if (datas != null && datas.Count > 0)
        {
            string path     = EditorPrefs.GetString("create_sprite_reference_model_folder", "");
            string fileName = searchSpriteName + "_reference_model.csv";
            path = EditorUtility.SaveFilePanel("Create Sprite Reference File ", path, fileName, "csv");

            string dataModelStr = "";

            //Header
            dataModelStr += "GameObjectName,ChildPath,SpriteName";

            for (int i = 0; i < datas.Count; i++)
            {
                SpriteReferenceTreeElement element = datas[i];
                dataModelStr += element.GameObjectName + ",";
                dataModelStr += element.Path + ",";
                dataModelStr += element.SpriteName + "\n";
            }

            if (string.IsNullOrEmpty(dataModelStr) || string.IsNullOrEmpty(dataModelStr))
            {
                return;
            }

            File.WriteAllText(path, dataModelStr, new UTF8Encoding(false));
            AssetDatabase.Refresh();
            EditorPrefs.SetString("create_sprite_reference_model_folder", path);
        }
    }