218 lines
4.9 KiB
C#
218 lines
4.9 KiB
C#
// ***********************************************************************
|
||
// Assembly : Unity
|
||
// Author : Kimch
|
||
// Created :
|
||
//
|
||
// Last Modified By : Kimch
|
||
// Last Modified On :
|
||
// ***********************************************************************
|
||
// <copyright file= "KUIPool" company=""></copyright>
|
||
// <summary></summary>
|
||
// ***********************************************************************
|
||
using System.Collections;
|
||
using System.Collections.Generic;
|
||
using UnityEngine;
|
||
|
||
/// <summary>
|
||
/// KUIItem 对象管理池
|
||
/// </summary>
|
||
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<GameObject> _activeItems = new List<GameObject>();
|
||
private List<GameObject> _returnItems = new List<GameObject>();
|
||
private ArrayList _itemDatas = new ArrayList();
|
||
|
||
private readonly List<DataInfo> _dataInfos = new List<DataInfo>();
|
||
/// <summary>
|
||
/// 物品数量
|
||
/// </summary>
|
||
public int itemCount
|
||
{
|
||
get { return loop ? int.MaxValue : _itemDatas.Count; }
|
||
}
|
||
|
||
/// <summary>
|
||
/// 增加模板
|
||
/// </summary>
|
||
/// <typeparam name="T"></typeparam>
|
||
public T AddTemplate<T>(bool useTemplate = false) where T : KUIWidget
|
||
{
|
||
if (!itemTemplate)
|
||
{
|
||
itemTemplate = transform.GetChild(0).gameObject;
|
||
}
|
||
|
||
if (itemTemplate)
|
||
{
|
||
var result = itemTemplate.GetComponent<T>();
|
||
if (!result)
|
||
result = itemTemplate.AddComponent<T>();
|
||
itemTemplate.SetActive(false);
|
||
if (useTemplate)
|
||
{
|
||
ReturnItem(itemTemplate.transform);
|
||
}
|
||
return result;
|
||
}
|
||
return default;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 创建物品
|
||
/// </summary>
|
||
/// <param name="index"></param>
|
||
/// <returns></returns>
|
||
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<KUIWidget>();
|
||
if (item)
|
||
{
|
||
item.index = index;
|
||
item.SetData(GetItemData(index));
|
||
}
|
||
return ret.GetComponent<RectTransform>();
|
||
}
|
||
return null;
|
||
}
|
||
/// <summary>
|
||
/// 创建物品
|
||
/// </summary>
|
||
/// <param name="index"></param>
|
||
/// <returns></returns>
|
||
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<KUIWidget>();
|
||
if (item)
|
||
{
|
||
return item;
|
||
}
|
||
}
|
||
return null;
|
||
}
|
||
public T GetItem<T>() where T : KUIWidget
|
||
{
|
||
return (T)CreateItem(true);
|
||
}
|
||
/// <summary>
|
||
///
|
||
/// </summary>
|
||
/// <param name="item"></param>
|
||
internal void ReturnItem(Transform item)
|
||
{
|
||
item.SetParent(transform.parent, false);
|
||
item.gameObject.SetActive(false);
|
||
item.gameObject.hideFlags = HideFlags.HideInHierarchy;
|
||
_returnItems.Add(item.gameObject);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 获得指定数据
|
||
/// </summary>
|
||
/// <param name="index"></param>
|
||
/// <returns></returns>
|
||
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);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 附加数据
|
||
/// </summary>
|
||
/// <param name="data"></param>
|
||
public void AddItemData(object data)
|
||
{
|
||
_itemDatas.Add(data);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 附加数据
|
||
/// </summary>
|
||
/// <param name="dataList"></param>
|
||
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<KUIWidget>();
|
||
if (item)
|
||
{
|
||
if (item.index < _itemDatas.Count)
|
||
item.SetData(_itemDatas[item.index]);
|
||
//item.SetData(item.data);
|
||
}
|
||
}
|
||
}
|
||
}
|