//-------------------------------------------------------- // [Author]: 第二世界 // [ Date ]: Friday, September 08, 2017 //-------------------------------------------------------- using System.Collections.Generic; using UnityEngine; namespace Snxxz.UI { public class NewItemGetWin : Window { [SerializeField] Transform m_StartPoint; [SerializeField] Transform m_EndPoint; Queue newItemQueue = new Queue(); List showingItems = new List(); float nextShowTime = 0f; PlayerPackModel playerPack { get { return ModelCenter.Instance.GetModel(); } } PackModelInterface modelInterface { get { return ModelCenter.Instance.GetModel(); } } #region Built-in protected override void BindController() { InitPool(); } protected override void AddListeners() { } protected override void OnPreOpen() { modelInterface.RefreshPickItemEvent += OnGetNewItem; } protected override void OnAfterOpen() { } protected override void OnPreClose() { modelInterface.RefreshPickItemEvent -= OnGetNewItem; for (int i = 0; i < showingItems.Count; i++) { var item = showingItems[i]; itemGetBehaviourPool.Release(item); } showingItems.Clear(); } protected override void OnAfterClose() { } #endregion private void OnGetNewItem(PackType type, string guid) { if (newItemQueue.Count >= 10) { newItemQueue.Dequeue(); } newItemQueue.Enqueue(guid); } protected override void LateUpdate() { base.LateUpdate(); if (newItemQueue.Count > 0 && Time.time > nextShowTime) { nextShowTime = Time.time + 0.2f; ItemModel model = null; do { var guid = newItemQueue.Dequeue(); model = playerPack.GetItemModelByGUID(guid); } while (model == null && newItemQueue.Count > 0); if (model != null) { int itemId = model.itemInfo.ItemID; var itemBehaviour = RequireBehaviour(); if (itemBehaviour != null) { itemBehaviour.transform.SetParentEx(this.transform, Vector3.zero, Quaternion.identity, Vector3.one); itemBehaviour.Begin(new Item(itemId, 1), m_StartPoint.localPosition, m_EndPoint.localPosition, OnBehaviourFinished); showingItems.Add(itemBehaviour.gameObject); } } } } private void OnBehaviourFinished() { ReycleUnShowingItem(); } GameObjectPoolManager.GameObjectPool itemGetBehaviourPool; private void InitPool() { var prefab = UILoader.LoadPrefab("NewItemGetBehaviour"); if (prefab != null) { itemGetBehaviourPool = GameObjectPoolManager.Instance.RequestPool(prefab); } } private NewItemGetBehaviour RequireBehaviour() { var item = itemGetBehaviourPool.Request(); return item.GetComponent(); } private void ReycleUnShowingItem() { for (int i = showingItems.Count - 1; i >= 0; i--) { var item = showingItems[i]; if (!item.activeInHierarchy) { itemGetBehaviourPool.Release(item); item.transform.SetParent(null); item.SetActive(false); showingItems.Remove(item); } } } } }