// ***********************************************************************
// 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);
}
}
}
}