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