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