2025-05-18 01:04:31 +08:00

218 lines
4.9 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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