少年修仙传客户端基础资源
client_Wu Xijin
2018-08-14 31c2cebbccba45a00a755981dd6d0cdd0a0459e9
Assets/Editor/Tool/FormatPrefabTool.cs
@@ -1,531 +1,531 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using UnityEngine.UI;
using System.IO;
using Snxxz.UI;
using System;
public static class FormatPrefabTool
{
    enum FormatPrefabType
    {
        ItemCell,
        FunctionButton,
    }
    [SerializeField] static FormatPrefabType s_FormatPrefabType = FormatPrefabType.ItemCell;
    static Vector2 s_ScrollPosition = Vector2.zero;
    public static void OnGUI()
    {
        ToolsHelper.DisplayFolderPath();
        s_FormatPrefabType = (FormatPrefabType)EditorGUILayout.EnumPopup(s_FormatPrefabType, GUILayout.Width(100));
        switch (s_FormatPrefabType)
        {
            case FormatPrefabType.ItemCell:
                DisplayItemCell();
                break;
            case FormatPrefabType.FunctionButton:
                DisplayFuncButton();
                break;
        }
    }
    #region ItemCell
    public enum ItemCellComType
    {
        None,
        ItemBG,
        ItemIcon,
        Lock,
        Count,
        State,
        Star,
        Reduce,
    }
    public class ItemCellCom
    {
        public ItemCellComType type;
        public RectTransform transform;
        public Image image;
        public Text text;
        public List<Image> stars = new List<Image>();
        public ItemCellCom(ItemCellComType _type, RectTransform _trans)
        {
            type = _type;
            transform = _trans;
            switch (type)
            {
                case ItemCellComType.Reduce:
                case ItemCellComType.Lock:
                case ItemCellComType.ItemIcon:
                case ItemCellComType.ItemBG:
                case ItemCellComType.State:
                    image = _trans.GetComponent<Image>();
                    break;
                case ItemCellComType.Count:
                    text = _trans.GetComponent<Text>();
                    break;
                case ItemCellComType.Star:
                    foreach (RectTransform _rect in _trans)
                    {
                        stars.Add(_rect.GetComponent<Image>());
                    }
                    break;
            }
        }
    }
    public class FormatItemCell
    {
        public int Size = 84;
        public GameObject template;
        public List<ItemCellCom> ItemCellComs = new List<ItemCellCom>();
        public List<RectTransform> ItemTrans = new List<RectTransform>();
        public List<ItemCellComType> ItemComTypes = new List<ItemCellComType>();
    }
    static List<FormatItemCell> formatItems = new List<FormatItemCell>();
    static void DisplayItemCell()
    {
        GUILayout.BeginHorizontal();
        if (GUILayout.Button("添加模板Item"))
        {
            formatItems.Add(new FormatItemCell());
        }
        GUILayout.FlexibleSpace();
        GUILayout.EndHorizontal();
        s_ScrollPosition = GUILayout.BeginScrollView(s_ScrollPosition, GUILayout.Height(300));
        for (int i = 0; i < formatItems.Count; i++)
        {
            var _formatItem = formatItems[i];
            GUILayout.BeginHorizontal();
            var _object = EditorGUILayout.ObjectField(_formatItem.template, typeof(GameObject), false) as GameObject;
            if (_object != _formatItem.template)
            {
                _formatItem.ItemCellComs.Clear();
                _formatItem.template = _object;
                _formatItem.ItemTrans.Clear();
                _formatItem.ItemComTypes.Clear();
                if (_formatItem.template != null)
                {
                    FindChild(_formatItem, _formatItem.template.transform);
                }
            }
            GUILayout.Label("Item Size:");
            _formatItem.Size = EditorGUILayout.IntField(_formatItem.Size);
            if (GUILayout.Button("-"))
            {
                formatItems.RemoveAt(i);
                i--;
                continue;
            }
            GUILayout.FlexibleSpace();
            GUILayout.EndHorizontal();
            for (int k = 0; k < _formatItem.ItemTrans.Count; k++)
            {
                GUILayout.BeginHorizontal();
                EditorGUILayout.ObjectField(_formatItem.ItemTrans[k], typeof(RectTransform), false);
                var _type = (ItemCellComType)EditorGUILayout.EnumPopup(_formatItem.ItemComTypes[k]);
                if (_type != _formatItem.ItemComTypes[k])
                {
                    _formatItem.ItemCellComs.RemoveAll((x) =>
                    {
                        return x.type == _formatItem.ItemComTypes[k];
                    });
                    var _item = _formatItem.ItemCellComs.Find((x) =>
                    {
                        return x.type == _type;
                    });
                    if (_item == null)
                    {
                        _formatItem.ItemComTypes[k] = _type;
                        _item = new ItemCellCom(_type, _formatItem.ItemTrans[k]);
                        _formatItem.ItemCellComs.Add(_item);
                    }
                    else
                    {
                        _formatItem.ItemComTypes[k] = ItemCellComType.None;
                    }
                }
                GUILayout.FlexibleSpace();
                GUILayout.EndHorizontal();
            }
            GUILayout.Space(10);
        }
        GUILayout.EndScrollView();
        if (GUILayout.Button("开始替换"))
        {
            if (ToolsHelper.folderPath != string.Empty && formatItems.Count > 0)
            {
                StartFormatPrefab();
            }
        }
    }
    static void FindChild(FormatItemCell _format, Transform _parent)
    {
        foreach (RectTransform _tran in _parent)
        {
            _format.ItemTrans.Add(_tran);
            _format.ItemComTypes.Add(ItemCellComType.None);
            FindChild(_format, _tran);
        }
    }
    static void StartFormatPrefab()
    {
        var _files = Directory.GetFiles(ToolsHelper.folderPath, "*.prefab", SearchOption.AllDirectories);
        if (_files == null || _files.Length == 0)
        {
            return;
        }
        var _index = 0;
        EditorApplication.update = delegate ()
        {
            var _file = _files[_index];
            GameObject _prefab = AssetDatabase.LoadAssetAtPath(ToolsHelper.GetRelativeAssetsPath(_file), typeof(GameObject)) as GameObject;
            if (_prefab != null)
            {
                bool _change = false;
                var _itemCells = _prefab.GetComponentsInChildren<ItemCell>(true);
                if (_itemCells != null && _itemCells.Length > 0)
                {
                    Replace(_itemCells);
                    _change = true;
                }
                var _itemBases = _prefab.GetComponentsInChildren<CommonItemBaisc>(true);
                if (_itemBases != null && _itemBases.Length > 0)
                {
                    Replace(_itemBases);
                    _change = true;
                }
                var _itemBehaviours = _prefab.GetComponentsInChildren<ItemBehaviour>(true);
                if (_itemBases != null && _itemBases.Length > 0)
                {
                    Replace(_itemBehaviours);
                    _change = true;
                }
                if (_change)
                {
                    EditorUtility.SetDirty(_prefab);
                }
            }
            bool _isCancel = EditorUtility.DisplayCancelableProgressBar("替换预制体Item",
                StringUtility.Contact(_index, "/", _files.Length), (float)_index / _files.Length);
            _index++;
            if (_isCancel || _index >= _files.Length)
            {
                EditorUtility.ClearProgressBar();
                EditorApplication.update = null;
                AssetDatabase.SaveAssets();
                AssetDatabase.Refresh();
                _index = 0;
            }
        };
    }
    static void Replace<T>(T[] _items) where T : MonoBehaviour
    {
        if (typeof(T) == typeof(ItemCell) || typeof(T) == typeof(CommonItemBaisc))
        {
            CommonItemBaisc[] _itemCells = _items as CommonItemBaisc[];
            for (int i = 0; i < _itemCells.Length; i++)
            {
                var _item = _itemCells[i];
                FormatItemCell _formatItem = null;
                if (_item.bgIcon != null)
                {
                    int _size = (int)_item.bgIcon.rectTransform.sizeDelta.x;
                    _formatItem = formatItems.Find((x) =>
                    {
                        return x.Size == _size;
                    });
                }
                if (null == _formatItem)
                {
                    continue;
                }
                foreach (var _source in _formatItem.ItemCellComs)
                {
                    switch (_source.type)
                    {
                        case ItemCellComType.ItemBG:
                            if (_item.bgIcon != null)
                            {
                                PasteImage(_item.bgIcon, _source.image);
                            }
                            break;
                        case ItemCellComType.ItemIcon:
                            if (_item.itemIcon != null)
                            {
                                PasteImage(_item.itemIcon, _source.image);
                            }
                            break;
                        case ItemCellComType.State:
                            if (_item.stateIcon != null)
                            {
                                PasteImage(_item.stateIcon, _source.image);
                            }
                            break;
                        case ItemCellComType.Star:
                            if (_item.starlist != null)
                            {
                                PasteRectTransform(_item.starlist.transform as RectTransform, _source.transform);
                                int _index = 0;
                                foreach (RectTransform _rect in _item.starlist.transform)
                                {
                                    if (_index >= _source.stars.Count)
                                    {
                                        break;
                                    }
                                    PasteImage(_rect.GetComponent<Image>(), _source.stars[_index]);
                                    _index++;
                                }
                            }
                            break;
                        case ItemCellComType.Lock:
                            if (_item.bindIcon != null)
                            {
                                PasteImage(_item.bindIcon, _source.image);
                            }
                            break;
                        case ItemCellComType.Reduce:
                            if (_item is ItemCell)
                            {
                                var _itemCell = _item as ItemCell;
                                if (_itemCell.reducebtn != null)
                                {
                                    PasteImage(_itemCell.reducebtn.image, _source.image);
                                }
                            }
                            break;
                        case ItemCellComType.Count:
                            if (_item.countText != null)
                            {
                                PasteText(_item.countText, _source.text);
                            }
                            break;
                    }
                }
            }
        }
        else if (typeof(T) == typeof(ItemBehaviour))
        {
            ItemBehaviour[] _itemCells = _items as ItemBehaviour[];
            for (int i = 0; i < _itemCells.Length; i++)
            {
                var _item = _itemCells[i];
                FormatItemCell _formatItem = null;
                if (_item.backGround != null)
                {
                    int _size = (int)_item.backGround.rectTransform.sizeDelta.x;
                    _formatItem = formatItems.Find((x) =>
                    {
                        return x.Size == _size;
                    });
                }
                if (null == _formatItem)
                {
                    continue;
                }
                foreach (var _source in _formatItem.ItemCellComs)
                {
                    switch (_source.type)
                    {
                        case ItemCellComType.ItemBG:
                            if (_item.backGround != null)
                            {
                                PasteImage(_item.backGround, _source.image);
                            }
                            break;
                        case ItemCellComType.ItemIcon:
                            if (_item.icon != null)
                            {
                                PasteImage(_item.icon, _source.image);
                            }
                            break;
                        case ItemCellComType.Star:
                            if (_item.stars != null && _item.stars.Length > 0)
                            {
                                PasteRectTransform(_item.stars[0].transform.parent as RectTransform, _source.transform);
                                for (int k = 0; k < _item.stars.Length; k++)
                                {
                                    if (k >= _source.stars.Count)
                                    {
                                        break;
                                    }
                                    PasteImage(_item.stars[k], _source.stars[k]);
                                }
                            }
                            break;
                        case ItemCellComType.Count:
                            if (_item.count != null)
                            {
                                PasteText(_item.count, _source.text);
                            }
                            break;
                    }
                }
            }
        }
    }
    static void PasteImage(Image _target, Image _paste)
    {
        _target.sprite = _paste.sprite;
        _target.color = _paste.color;
        _target.raycastTarget = _paste.raycastTarget;
        PasteRectTransform(_target.rectTransform, _paste.rectTransform);
    }
    static void PasteText(Text _target, Text _paste)
    {
        _target.color = _paste.color;
        _target.fontSize = _paste.fontSize;
        _target.font = _paste.font;
        _target.raycastTarget = _paste.raycastTarget;
        _target.alignment = _paste.alignment;
        _target.horizontalOverflow = _paste.horizontalOverflow;
        _target.verticalOverflow = _paste.verticalOverflow;
        PasteRectTransform(_target.rectTransform, _paste.rectTransform);
    }
    static void PasteRectTransform(RectTransform _target, RectTransform _paste)
    {
        _target.pivot = _paste.pivot;
        _target.anchorMax = _paste.anchorMax;
        _target.anchorMin = _paste.anchorMin;
        _target.sizeDelta = _paste.sizeDelta;
        _target.anchoredPosition = _paste.anchoredPosition;
    }
    #endregion
    #region FunctionButton
    static Sprite m_FuncButtonLockIcon;
    private static void DisplayFuncButton()
    {
        GUILayout.BeginHorizontal();
        GUILayout.Label("替换锁Icon:");
        m_FuncButtonLockIcon = EditorGUILayout.ObjectField(m_FuncButtonLockIcon, typeof(Sprite), false) as Sprite;
        GUILayout.FlexibleSpace();
        GUILayout.EndHorizontal();
        if (GUILayout.Button("开始替换"))
        {
            if (ToolsHelper.folderPath != string.Empty)
            {
                StartFormatFuncButton();
            }
        }
    }
    private static void StartFormatFuncButton()
    {
        var _files = Directory.GetFiles(ToolsHelper.folderPath, "*.prefab", SearchOption.AllDirectories);
        if (_files == null || _files.Length == 0)
        {
            return;
        }
        var _index = 0;
        EditorApplication.update = delegate ()
        {
            var _file = _files[_index];
            GameObject _prefab = AssetDatabase.LoadAssetAtPath(ToolsHelper.GetRelativeAssetsPath(_file), typeof(GameObject)) as GameObject;
            if (_prefab != null)
            {
                try
                {
                    var _copy = PrefabUtility.InstantiatePrefab(_prefab) as GameObject;
                    if (_copy != null)
                    {
                        bool _change = false;
                        var _funcbuttons = _copy.GetComponentsInChildren<FunctionButton>(true);
                        if (_funcbuttons != null && _funcbuttons.Length > 0)
                        {
                            for (int i = 0; i < _funcbuttons.Length; i++)
                            {
                                var _funcButton = _funcbuttons[i];
                                if (_funcButton.alternativeConfig.name == "FunctionButton_Version4")
                                {
                                    GameObject _obj = null;
                                    if (_funcButton.transform.Find("Container_SortArea") == null)
                                    {
                                        _obj = new GameObject("Container_SortArea");
                                    }
                                    else
                                    {
                                        _obj = _funcButton.transform.Find("Container_SortArea").gameObject;
                                    }
                                    var _layout = _obj.AddMissingComponent<HorizontalLayoutGroup>();
                                    _layout.childAlignment = TextAnchor.MiddleCenter;
                                    _layout.childControlWidth = true;
                                    _layout.childControlHeight = false;
                                    _layout.childForceExpandHeight = false;
                                    _layout.childForceExpandWidth = false;
                                    _obj.transform.SetParent(_funcButton.transform);
                                    var _rect = _obj.transform as RectTransform;
                                    _rect.localScale = Vector3.one;
                                    _rect.anchorMin = Vector2.zero;
                                    _rect.anchorMax = Vector2.one;
                                    _rect.offsetMax = Vector2.zero;
                                    _rect.offsetMin = Vector2.zero;
                                    _rect.pivot = Vector2.one / 2;
                                    if (_funcButton.locked != null)
                                    {
                                        _funcButton.locked.SetParent(_rect);
                                        var _image = _funcButton.locked.GetComponent<Image>();
                                        if (_image != null && m_FuncButtonLockIcon != null)
                                        {
                                            _image.sprite = m_FuncButtonLockIcon;
                                            _image.SetNativeSize();
                                        }
                                    }
                                    if (_funcButton.title != null)
                                    {
                                        _funcButton.title.transform.SetParent(_rect);
                                        _funcButton.title.rectTransform.sizeDelta = (_funcButton.transform as RectTransform).sizeDelta;
                                    }
                                    _change = true;
                                }
                            }
                        }
                        if (_change)
                        {
                            PrefabUtility.ReplacePrefab(_copy, _prefab, ReplacePrefabOptions.ConnectToPrefab);
                        }
                        GameObject.DestroyImmediate(_copy);
                    }
                }
                catch (Exception e)
                {
                    Debug.Log(e.Message);
                }
            }
            bool _isCancel = EditorUtility.DisplayCancelableProgressBar("替换预制体",
                StringUtility.Contact(_index, "/", _files.Length), (float)_index / _files.Length);
            _index++;
            if (_isCancel || _index >= _files.Length)
            {
                EditorUtility.ClearProgressBar();
                EditorApplication.update = null;
                AssetDatabase.SaveAssets();
                AssetDatabase.Refresh();
                _index = 0;
            }
        };
    }
    #endregion
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using UnityEngine.UI;
using System.IO;
using Snxxz.UI;
using System;
public static class FormatPrefabTool
{
    enum FormatPrefabType
    {
        ItemCell,
        FunctionButton,
    }
    [SerializeField] static FormatPrefabType s_FormatPrefabType = FormatPrefabType.ItemCell;
    static Vector2 s_ScrollPosition = Vector2.zero;
    public static void OnGUI()
    {
        ToolsHelper.DisplayFolderPath();
        s_FormatPrefabType = (FormatPrefabType)EditorGUILayout.EnumPopup(s_FormatPrefabType, GUILayout.Width(100));
        switch (s_FormatPrefabType)
        {
            case FormatPrefabType.ItemCell:
                DisplayItemCell();
                break;
            case FormatPrefabType.FunctionButton:
                DisplayFuncButton();
                break;
        }
    }
    #region ItemCell
    public enum ItemCellComType
    {
        None,
        ItemBG,
        ItemIcon,
        Lock,
        Count,
        State,
        Star,
        Reduce,
    }
    public class ItemCellCom
    {
        public ItemCellComType type;
        public RectTransform transform;
        public Image image;
        public Text text;
        public List<Image> stars = new List<Image>();
        public ItemCellCom(ItemCellComType _type, RectTransform _trans)
        {
            type = _type;
            transform = _trans;
            switch (type)
            {
                case ItemCellComType.Reduce:
                case ItemCellComType.Lock:
                case ItemCellComType.ItemIcon:
                case ItemCellComType.ItemBG:
                case ItemCellComType.State:
                    image = _trans.GetComponent<Image>();
                    break;
                case ItemCellComType.Count:
                    text = _trans.GetComponent<Text>();
                    break;
                case ItemCellComType.Star:
                    foreach (RectTransform _rect in _trans)
                    {
                        stars.Add(_rect.GetComponent<Image>());
                    }
                    break;
            }
        }
    }
    public class FormatItemCell
    {
        public int Size = 84;
        public GameObject template;
        public List<ItemCellCom> ItemCellComs = new List<ItemCellCom>();
        public List<RectTransform> ItemTrans = new List<RectTransform>();
        public List<ItemCellComType> ItemComTypes = new List<ItemCellComType>();
    }
    static List<FormatItemCell> formatItems = new List<FormatItemCell>();
    static void DisplayItemCell()
    {
        GUILayout.BeginHorizontal();
        if (GUILayout.Button("添加模板Item"))
        {
            formatItems.Add(new FormatItemCell());
        }
        GUILayout.FlexibleSpace();
        GUILayout.EndHorizontal();
        s_ScrollPosition = GUILayout.BeginScrollView(s_ScrollPosition, GUILayout.Height(300));
        for (int i = 0; i < formatItems.Count; i++)
        {
            var _formatItem = formatItems[i];
            GUILayout.BeginHorizontal();
            var _object = EditorGUILayout.ObjectField(_formatItem.template, typeof(GameObject), false) as GameObject;
            if (_object != _formatItem.template)
            {
                _formatItem.ItemCellComs.Clear();
                _formatItem.template = _object;
                _formatItem.ItemTrans.Clear();
                _formatItem.ItemComTypes.Clear();
                if (_formatItem.template != null)
                {
                    FindChild(_formatItem, _formatItem.template.transform);
                }
            }
            GUILayout.Label("Item Size:");
            _formatItem.Size = EditorGUILayout.IntField(_formatItem.Size);
            if (GUILayout.Button("-"))
            {
                formatItems.RemoveAt(i);
                i--;
                continue;
            }
            GUILayout.FlexibleSpace();
            GUILayout.EndHorizontal();
            for (int k = 0; k < _formatItem.ItemTrans.Count; k++)
            {
                GUILayout.BeginHorizontal();
                EditorGUILayout.ObjectField(_formatItem.ItemTrans[k], typeof(RectTransform), false);
                var _type = (ItemCellComType)EditorGUILayout.EnumPopup(_formatItem.ItemComTypes[k]);
                if (_type != _formatItem.ItemComTypes[k])
                {
                    _formatItem.ItemCellComs.RemoveAll((x) =>
                    {
                        return x.type == _formatItem.ItemComTypes[k];
                    });
                    var _item = _formatItem.ItemCellComs.Find((x) =>
                    {
                        return x.type == _type;
                    });
                    if (_item == null)
                    {
                        _formatItem.ItemComTypes[k] = _type;
                        _item = new ItemCellCom(_type, _formatItem.ItemTrans[k]);
                        _formatItem.ItemCellComs.Add(_item);
                    }
                    else
                    {
                        _formatItem.ItemComTypes[k] = ItemCellComType.None;
                    }
                }
                GUILayout.FlexibleSpace();
                GUILayout.EndHorizontal();
            }
            GUILayout.Space(10);
        }
        GUILayout.EndScrollView();
        if (GUILayout.Button("开始替换"))
        {
            if (ToolsHelper.folderPath != string.Empty && formatItems.Count > 0)
            {
                StartFormatPrefab();
            }
        }
    }
    static void FindChild(FormatItemCell _format, Transform _parent)
    {
        foreach (RectTransform _tran in _parent)
        {
            _format.ItemTrans.Add(_tran);
            _format.ItemComTypes.Add(ItemCellComType.None);
            FindChild(_format, _tran);
        }
    }
    static void StartFormatPrefab()
    {
        var _files = Directory.GetFiles(ToolsHelper.folderPath, "*.prefab", SearchOption.AllDirectories);
        if (_files == null || _files.Length == 0)
        {
            return;
        }
        var _index = 0;
        EditorApplication.update = delegate ()
        {
            var _file = _files[_index];
            GameObject _prefab = AssetDatabase.LoadAssetAtPath(ToolsHelper.GetRelativeAssetsPath(_file), typeof(GameObject)) as GameObject;
            if (_prefab != null)
            {
                bool _change = false;
                var _itemCells = _prefab.GetComponentsInChildren<ItemCell>(true);
                if (_itemCells != null && _itemCells.Length > 0)
                {
                    Replace(_itemCells);
                    _change = true;
                }
                var _itemBases = _prefab.GetComponentsInChildren<CommonItemBaisc>(true);
                if (_itemBases != null && _itemBases.Length > 0)
                {
                    Replace(_itemBases);
                    _change = true;
                }
                var _itemBehaviours = _prefab.GetComponentsInChildren<ItemBehaviour>(true);
                if (_itemBases != null && _itemBases.Length > 0)
                {
                    Replace(_itemBehaviours);
                    _change = true;
                }
                if (_change)
                {
                    EditorUtility.SetDirty(_prefab);
                }
            }
            bool _isCancel = EditorUtility.DisplayCancelableProgressBar("替换预制体Item",
                StringUtility.Contact(_index, "/", _files.Length), (float)_index / _files.Length);
            _index++;
            if (_isCancel || _index >= _files.Length)
            {
                EditorUtility.ClearProgressBar();
                EditorApplication.update = null;
                AssetDatabase.SaveAssets();
                AssetDatabase.Refresh();
                _index = 0;
            }
        };
    }
    static void Replace<T>(T[] _items) where T : MonoBehaviour
    {
        if (typeof(T) == typeof(ItemCell) || typeof(T) == typeof(CommonItemBaisc))
        {
            CommonItemBaisc[] _itemCells = _items as CommonItemBaisc[];
            for (int i = 0; i < _itemCells.Length; i++)
            {
                var _item = _itemCells[i];
                FormatItemCell _formatItem = null;
                if (_item.bgIcon != null)
                {
                    int _size = (int)_item.bgIcon.rectTransform.sizeDelta.x;
                    _formatItem = formatItems.Find((x) =>
                    {
                        return x.Size == _size;
                    });
                }
                if (null == _formatItem)
                {
                    continue;
                }
                foreach (var _source in _formatItem.ItemCellComs)
                {
                    switch (_source.type)
                    {
                        case ItemCellComType.ItemBG:
                            if (_item.bgIcon != null)
                            {
                                PasteImage(_item.bgIcon, _source.image);
                            }
                            break;
                        case ItemCellComType.ItemIcon:
                            if (_item.itemIcon != null)
                            {
                                PasteImage(_item.itemIcon, _source.image);
                            }
                            break;
                        case ItemCellComType.State:
                            if (_item.stateIcon != null)
                            {
                                PasteImage(_item.stateIcon, _source.image);
                            }
                            break;
                        case ItemCellComType.Star:
                            if (_item.starlist != null)
                            {
                                PasteRectTransform(_item.starlist.transform as RectTransform, _source.transform);
                                int _index = 0;
                                foreach (RectTransform _rect in _item.starlist.transform)
                                {
                                    if (_index >= _source.stars.Count)
                                    {
                                        break;
                                    }
                                    PasteImage(_rect.GetComponent<Image>(), _source.stars[_index]);
                                    _index++;
                                }
                            }
                            break;
                        case ItemCellComType.Lock:
                            if (_item.bindIcon != null)
                            {
                                PasteImage(_item.bindIcon, _source.image);
                            }
                            break;
                        case ItemCellComType.Reduce:
                            if (_item is ItemCell)
                            {
                                var _itemCell = _item as ItemCell;
                                if (_itemCell.reducebtn != null)
                                {
                                    PasteImage(_itemCell.reducebtn.image, _source.image);
                                }
                            }
                            break;
                        case ItemCellComType.Count:
                            if (_item.countText != null)
                            {
                                PasteText(_item.countText, _source.text);
                            }
                            break;
                    }
                }
            }
        }
        else if (typeof(T) == typeof(ItemBehaviour))
        {
            ItemBehaviour[] _itemCells = _items as ItemBehaviour[];
            for (int i = 0; i < _itemCells.Length; i++)
            {
                var _item = _itemCells[i];
                FormatItemCell _formatItem = null;
                if (_item.backGround != null)
                {
                    int _size = (int)_item.backGround.rectTransform.sizeDelta.x;
                    _formatItem = formatItems.Find((x) =>
                    {
                        return x.Size == _size;
                    });
                }
                if (null == _formatItem)
                {
                    continue;
                }
                foreach (var _source in _formatItem.ItemCellComs)
                {
                    switch (_source.type)
                    {
                        case ItemCellComType.ItemBG:
                            if (_item.backGround != null)
                            {
                                PasteImage(_item.backGround, _source.image);
                            }
                            break;
                        case ItemCellComType.ItemIcon:
                            if (_item.icon != null)
                            {
                                PasteImage(_item.icon, _source.image);
                            }
                            break;
                        case ItemCellComType.Star:
                            if (_item.stars != null && _item.stars.Length > 0)
                            {
                                PasteRectTransform(_item.stars[0].transform.parent as RectTransform, _source.transform);
                                for (int k = 0; k < _item.stars.Length; k++)
                                {
                                    if (k >= _source.stars.Count)
                                    {
                                        break;
                                    }
                                    PasteImage(_item.stars[k], _source.stars[k]);
                                }
                            }
                            break;
                        case ItemCellComType.Count:
                            if (_item.count != null)
                            {
                                PasteText(_item.count, _source.text);
                            }
                            break;
                    }
                }
            }
        }
    }
    static void PasteImage(Image _target, Image _paste)
    {
        _target.sprite = _paste.sprite;
        _target.color = _paste.color;
        _target.raycastTarget = _paste.raycastTarget;
        PasteRectTransform(_target.rectTransform, _paste.rectTransform);
    }
    static void PasteText(Text _target, Text _paste)
    {
        _target.color = _paste.color;
        _target.fontSize = _paste.fontSize;
        _target.font = _paste.font;
        _target.raycastTarget = _paste.raycastTarget;
        _target.alignment = _paste.alignment;
        _target.horizontalOverflow = _paste.horizontalOverflow;
        _target.verticalOverflow = _paste.verticalOverflow;
        PasteRectTransform(_target.rectTransform, _paste.rectTransform);
    }
    static void PasteRectTransform(RectTransform _target, RectTransform _paste)
    {
        _target.pivot = _paste.pivot;
        _target.anchorMax = _paste.anchorMax;
        _target.anchorMin = _paste.anchorMin;
        _target.sizeDelta = _paste.sizeDelta;
        _target.anchoredPosition = _paste.anchoredPosition;
    }
    #endregion
    #region FunctionButton
    static Sprite m_FuncButtonLockIcon;
    private static void DisplayFuncButton()
    {
        GUILayout.BeginHorizontal();
        GUILayout.Label("替换锁Icon:");
        m_FuncButtonLockIcon = EditorGUILayout.ObjectField(m_FuncButtonLockIcon, typeof(Sprite), false) as Sprite;
        GUILayout.FlexibleSpace();
        GUILayout.EndHorizontal();
        if (GUILayout.Button("开始替换"))
        {
            if (ToolsHelper.folderPath != string.Empty)
            {
                StartFormatFuncButton();
            }
        }
    }
    private static void StartFormatFuncButton()
    {
        var _files = Directory.GetFiles(ToolsHelper.folderPath, "*.prefab", SearchOption.AllDirectories);
        if (_files == null || _files.Length == 0)
        {
            return;
        }
        var _index = 0;
        EditorApplication.update = delegate ()
        {
            var _file = _files[_index];
            GameObject _prefab = AssetDatabase.LoadAssetAtPath(ToolsHelper.GetRelativeAssetsPath(_file), typeof(GameObject)) as GameObject;
            if (_prefab != null)
            {
                try
                {
                    var _copy = PrefabUtility.InstantiatePrefab(_prefab) as GameObject;
                    if (_copy != null)
                    {
                        bool _change = false;
                        var _funcbuttons = _copy.GetComponentsInChildren<FunctionButton>(true);
                        if (_funcbuttons != null && _funcbuttons.Length > 0)
                        {
                            for (int i = 0; i < _funcbuttons.Length; i++)
                            {
                                var _funcButton = _funcbuttons[i];
                                if (_funcButton.alternativeConfig.name == "FunctionButton_Version4")
                                {
                                    GameObject _obj = null;
                                    if (_funcButton.transform.Find("Container_SortArea") == null)
                                    {
                                        _obj = new GameObject("Container_SortArea");
                                    }
                                    else
                                    {
                                        _obj = _funcButton.transform.Find("Container_SortArea").gameObject;
                                    }
                                    var _layout = _obj.AddMissingComponent<HorizontalLayoutGroup>();
                                    _layout.childAlignment = TextAnchor.MiddleCenter;
                                    _layout.childControlWidth = true;
                                    _layout.childControlHeight = false;
                                    _layout.childForceExpandHeight = false;
                                    _layout.childForceExpandWidth = false;
                                    _obj.transform.SetParent(_funcButton.transform);
                                    var _rect = _obj.transform as RectTransform;
                                    _rect.localScale = Vector3.one;
                                    _rect.anchorMin = Vector2.zero;
                                    _rect.anchorMax = Vector2.one;
                                    _rect.offsetMax = Vector2.zero;
                                    _rect.offsetMin = Vector2.zero;
                                    _rect.pivot = Vector2.one / 2;
                                    if (_funcButton.locked != null)
                                    {
                                        _funcButton.locked.SetParent(_rect);
                                        var _image = _funcButton.locked.GetComponent<Image>();
                                        if (_image != null && m_FuncButtonLockIcon != null)
                                        {
                                            _image.sprite = m_FuncButtonLockIcon;
                                            _image.SetNativeSize();
                                        }
                                    }
                                    if (_funcButton.title != null)
                                    {
                                        _funcButton.title.transform.SetParent(_rect);
                                        _funcButton.title.rectTransform.sizeDelta = (_funcButton.transform as RectTransform).sizeDelta;
                                    }
                                    _change = true;
                                }
                            }
                        }
                        if (_change)
                        {
                            PrefabUtility.ReplacePrefab(_copy, _prefab, ReplacePrefabOptions.ConnectToPrefab);
                        }
                        GameObject.DestroyImmediate(_copy);
                    }
                }
                catch (Exception e)
                {
                    Debug.Log(e.Message);
                }
            }
            bool _isCancel = EditorUtility.DisplayCancelableProgressBar("替换预制体",
                StringUtility.Contact(_index, "/", _files.Length), (float)_index / _files.Length);
            _index++;
            if (_isCancel || _index >= _files.Length)
            {
                EditorUtility.ClearProgressBar();
                EditorApplication.update = null;
                AssetDatabase.SaveAssets();
                AssetDatabase.Refresh();
                _index = 0;
            }
        };
    }
    #endregion
}