using cfg; using DG.Tweening; using System.Collections.Generic; using UnityEngine; using UnityEngine.AddressableAssets; using System.Linq; using GameCore; using asap.core; public class SupplyDropGameplayCashCtrl : SupplyDropGameplayCtrl, ISupplyDropGameCtrl { SupplyDropGameplayCash supplyDropGameplayCash; SupplyDropCashGameRoot supplyDropCashGame; GrabCashPanel grabCashPanel; Queue cashPool1 = new Queue(); Queue cashPool2 = new Queue(); Queue cashPool3 = new Queue(); Queue cashPool4 = new Queue(); Queue numPool = new Queue(); List numUserPool = new List(); List cashUserPool = new List(); float allWeight = 0f; List weightList = new List(); List dropCount = new List(); bool isCheckOver = false; protected override void Init(int id) { supplyDropGameplayCash = tables.TbSupplyDropGameplayCash.DataMap[id]; SetData(); ShowModel(); } void SetData() { weightList = supplyDropGameplayCash.DropWeight; allWeight = weightList.Sum(); var dropID = supplyDropGameplayCash.DropID; dropCount = new List(); PlayerItemData playerItemData = GContext.container.Resolve(); for (int i = 0; i < dropID.Count; i++) { ItemData itemData = playerItemData.GetItemDataOne(dropID[i]); if (itemData != null) { dropCount.Add((int)itemData.count); } else { Debug.LogWarning($"drop for ID {dropID[i]} not found."); dropCount.Add(0); // 如果没有找到数据,添加0 } } } void ShowModel() { Addressables.InstantiateAsync("CashGameRoot").Completed += handle => { if (handle.Status == UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationStatus.Succeeded) { gameModel = handle.Result; supplyDropCashGame = gameModel.GetComponent(); Vector3 posLocal = Camera.main.transform.InverseTransformPoint(containerModel.transform.position); Vector3 posW = UIManager.Instance.UI3DCamera.transform.TransformPoint(posLocal); supplyDropCashGame.Init(this, posW, allWeight, weightList, dropCount); containerModel.SetActive(false); ShowPanel(); PlayAni(); } else { Dispose(); } }; } async void PlayAni() { await supplyDropCashGame.IntialStage(); grabCashPanel.SetUse(); //加载界面 开始玩法 await supplyDropCashGame.StartPlay(); isCheckOver = true; await Awaiters.Seconds(3f); if (isCheckOver) { cashUserPool.Clear(); CheckGameOver(); } } void CheckGameOver() { if (isCheckOver && cashUserPool.Count == 0) { isCheckOver = false; HideNumUserPool(); grabCashPanel.GameOver(); } } void HideNumUserPool() { for (int i = 0; i < numUserPool.Count; i++) { numUserPool[i].SetActive(false); } } async void ShowPanel() { GameObject go = await UIManager.Instance.ShowUINotLoading(UITypes.GrabCashPanel); grabCashPanel = go.GetComponent(); grabCashPanel.Init(this); } public void Recycle(SupplyDropCashItem item, bool use = false) { if (use) { cashUserPool.Remove(item.gameObject); CheckGameOver(); } item.transform.DOKill(); item.gameObject.SetActive(false); switch (item.type) { case 0: cashPool1.Enqueue(item.gameObject); break; case 1: cashPool2.Enqueue(item.gameObject); break; case 2: cashPool3.Enqueue(item.gameObject); break; case 3: cashPool4.Enqueue(item.gameObject); break; } } public SupplyDropCashItem GetCashItem(int type, bool use = false) { GameObject item = null; switch (type) { case 0: if (cashPool1.Count > 0) { item = cashPool1.Dequeue(); } break; case 1: if (cashPool2.Count > 0) { item = cashPool2.Dequeue(); } break; case 2: if (cashPool3.Count > 0) { item = cashPool3.Dequeue(); } break; case 3: if (cashPool4.Count > 0) { item = cashPool4.Dequeue(); } break; } if (item == null) item = supplyDropCashGame.InstantiateItem(type); if (use) { cashUserPool.Add(item); } item.transform.localScale = Vector3.one; return item.GetComponent(); } public async void ShowNum(SupplyDropCashItem item) { GrabCashFloatingNum numItem = GetCashNumItem(); string num = ConvertTools.GetNumberString(item.cashCount); numItem.num.text = $"+{num}"; numItem.transform.position = item.transform.position; numItem.gameObject.SetActive(true); await Awaiters.Seconds(1); Recycle(numItem); } public void Recycle(GrabCashFloatingNum item) { item.gameObject.SetActive(false); numUserPool.Remove(item.gameObject); numPool.Enqueue(item.gameObject); } public GrabCashFloatingNum GetCashNumItem() { GameObject item = null; if (numPool.Count > 0) { item = numPool.Dequeue(); } if (item == null) item = supplyDropCashGame.InstantiateNumItem(); numUserPool.Add(item); return item.GetComponent(); } }