// ***********************************************************************
// Assembly : Unity
// Author : Kimch
// Created :
//
// Last Modified By : Kimch
// Last Modified On :
// ***********************************************************************
//
//
// ***********************************************************************
using System.Collections.Generic;
using UnityEngine;
///
/// KUIItem 对象管理(简单)
///
public class KUIList : MonoBehaviour
{
#region Field
///
/// 物品模版
///
public GameObject itemTemplate;
///
/// 物品列表
///
private readonly List _itemObjects = new List();
#endregion
#region Property
///
///
///
public int count
{
get { return _itemObjects.Count; }
}
#endregion
#region Method
///
/// 添加模板
///
///
public T AddTemplate(bool useTemplate = false) where T : KUIWidget
{
if (!itemTemplate && transform.childCount > 0)
{
itemTemplate = transform.GetChild(0).gameObject;
}
T result = default;
if (itemTemplate)
{
itemTemplate.SetActive(false);
result = itemTemplate.GetComponent();
if (!result)
result = itemTemplate.AddComponent();
}
if (useTemplate)
{
for (int i = 0; i < transform.childCount; i++)
{
var child = transform.GetChild(i);
if (child.GetComponent())
{
child.gameObject.SetActive(false);
_itemObjects.Add(child.gameObject);
}
}
}
return result;
}
public void PreCreate(int count)
{
if (itemTemplate)
{
for (int i = 0; i < count; i++)
{
var itemGO = Instantiate(itemTemplate, this.transform);
_itemObjects.Add(itemGO);
}
}
}
///
///
///
/// 默认活跃
///
private KUIWidget AddObject(bool active = true)
{
if (itemTemplate)
{
var itemGO = Instantiate(itemTemplate, this.transform);
itemGO.SetActive(active);
_itemObjects.Add(itemGO);
itemGO.name = itemTemplate.name + "_" + _itemObjects.Count;
var item = itemGO.GetComponent();
if (item)
{
item.index = _itemObjects.Count - 1;
return item;
}
}
return null;
}
///
///
///
///
private void ActivateAvailableObjects(int amount)
{
if (_itemObjects.Count < amount)
{
amount = _itemObjects.Count;
}
for (int i = 0; i < amount; i++)
{
_itemObjects[i].SetActive(true);
}
for (int i = _itemObjects.Count - 1; i >= amount; i--)
{
_itemObjects[i].SetActive(false);
}
}
///
///
///
///
public void Clear(int amount = 0)
{
this.ActivateAvailableObjects((amount <= _itemObjects.Count) ? amount : _itemObjects.Count);
}
///
///
///
///
public KUIWidget GetItem()
{
var item = _itemObjects.Find(obj => !obj.activeSelf);
if (item)
{
item.SetActive(true);
return item.GetComponent();
}
else
{
return AddObject(true);
}
}
///
///
///
///
///
public T GetItem() where T : KUIWidget
{
var item = _itemObjects.Find(obj => !obj.activeSelf);
if (item)
{
item.SetActive(true);
return item.GetComponent();
}
else
{
return (T)AddObject(true);
}
}
///
///
///
///
///
public KUIWidget GetItem(int index)
{
if (index < _itemObjects.Count)
{
var itemObject = _itemObjects[index];
return itemObject.GetComponent();
}
return this.AddObject(true);
}
///
///
///
///
///
///
public KUIWidget GetItem(int index, bool active)
{
if (index < _itemObjects.Count)
{
var itemObject = _itemObjects[index];
itemObject.SetActive(active);
return itemObject.GetComponent();
}
return this.AddObject(active);
}
///
///
///
///
public void RefreshList(int amount)
{
ActivateAvailableObjects(amount);
}
#endregion
#region Unity
private void Awake()
{
//if (!itemTemplate)
//{
// if (transform.childCount > 0)
// itemTemplate = transform.GetChild(0).gameObject;
//}
//if (itemTemplate)
//{
// itemTemplate.SetActive(false);
//}
}
#endregion
#region Layout
private void InitLayout()
{
}
#endregion
}