// *********************************************************************** // Assembly : Unity // Author : Kimch // Created : // // Last Modified By : Kimch // Last Modified On : // *********************************************************************** // // // *********************************************************************** using System.Collections; using System.Collections.Generic; using UnityEngine; /// /// KUIItem 对象管理池 /// public class KUIPool : MonoBehaviour { private class DataInfo { #pragma warning disable CS0649 // 从未对字段“KUIPool.DataInfo.index”赋值,字段将一直保持其默认值 0 public int index; #pragma warning restore CS0649 // 从未对字段“KUIPool.DataInfo.index”赋值,字段将一直保持其默认值 0 #pragma warning disable CS0649 // 从未对字段“KUIPool.DataInfo.data”赋值,字段将一直保持其默认值 null public object data; #pragma warning restore CS0649 // 从未对字段“KUIPool.DataInfo.data”赋值,字段将一直保持其默认值 null } public bool loop; public GameObject itemTemplate; private List _activeItems = new List(); private List _returnItems = new List(); private ArrayList _itemDatas = new ArrayList(); private readonly List _dataInfos = new List(); /// /// 物品数量 /// public int itemCount { get { return loop ? int.MaxValue : _itemDatas.Count; } } /// /// 增加模板 /// /// public T AddTemplate(bool useTemplate = false) where T : KUIWidget { if (!itemTemplate) { itemTemplate = transform.GetChild(0).gameObject; } if (itemTemplate) { var result = itemTemplate.GetComponent(); if (!result) result = itemTemplate.AddComponent(); itemTemplate.SetActive(false); if (useTemplate) { ReturnItem(itemTemplate.transform); } return result; } return default; } /// /// 创建物品 /// /// /// internal RectTransform CreateItem(int index) { GameObject ret; if (_returnItems.Count > 0) { ret = _returnItems[_returnItems.Count - 1]; _returnItems.RemoveAt(_returnItems.Count - 1); } else { ret = Instantiate(itemTemplate, transform); } if (ret != null) { ret.hideFlags = HideFlags.None; ret.transform.SetParent(transform, false); ret.SetActive(true); var item = ret.GetComponent(); if (item) { item.index = index; item.SetData(GetItemData(index)); } return ret.GetComponent(); } return null; } /// /// 创建物品 /// /// /// internal KUIWidget CreateItem(bool active) { GameObject ret; if (_returnItems.Count > 0) { ret = _returnItems[_returnItems.Count - 1]; _returnItems.RemoveAt(_returnItems.Count - 1); } else { ret = Instantiate(itemTemplate, transform); } if (ret != null) { ret.hideFlags = HideFlags.None; ret.transform.SetParent(transform, false); ret.SetActive(active); var item = ret.GetComponent(); if (item) { return item; } } return null; } public T GetItem() where T : KUIWidget { return (T)CreateItem(true); } /// /// /// /// internal void ReturnItem(Transform item) { item.SetParent(transform.parent, false); item.gameObject.SetActive(false); item.gameObject.hideFlags = HideFlags.HideInHierarchy; _returnItems.Add(item.gameObject); } /// /// 获得指定数据 /// /// /// public object GetItemData(int index) { int count = _itemDatas.Count; if (loop) { index = index % count; } if (index >= 0 && index < count) { return _itemDatas[index]; } return null; } public ArrayList GetItemDatas() { return _itemDatas; } public void SetItemDatas(ICollection dataList) { _itemDatas.Clear(); if (dataList != null && dataList.Count > 0) { _itemDatas.AddRange(dataList); } } /// /// 附加数据 /// /// public void AddItemData(object data) { _itemDatas.Add(data); } /// /// 附加数据 /// /// public void AddItemDatas(ICollection dataList) { _itemDatas.AddRange(dataList); } public void RefreshItems() { for (int i = transform.childCount - 1; i >= 0; i--) { var item = transform.GetChild(i).GetComponent(); if (item) { if (item.index < _itemDatas.Count) item.SetData(_itemDatas[item.index]); //item.SetData(item.data); } } } }