/**************************************************** 文件:Assets/Code/Scripts/Gameplay/UI/UI_BuyEnergyController.cs 作者:yuntao-Hu 时间:2024/5 描述:补充体力UI界面 说明: *****************************************************/ using System.Collections; using System.Collections.Generic; using TMPro; using UnityEngine; using UnityEngine.UI; using UnityEngine.UIElements; using Button = UnityEngine.UI.Button; using Image = UnityEngine.UI.Image; using Toggle = UnityEngine.UI.Toggle; using ScrollView = PhxhSDK.PhxhScrollView; using Framework; using System; using Gameplay; using Cysharp.Threading.Tasks; using UnityEngine.Events; using System.Threading; using static UnityEngine.Rendering.DebugUI; using Gameplay.Net; using Gameplay.Common; using cfg.ActorCfg; using PhxhSDK; using LeanCloud.Realtime.Internal.Protocol; using static UI_BuyEnergyController; public class UI_BuyEnergyController : UIWindow { #region enum /// /// 补充体力方式 ( 与窗口内顺序对应 ) /// public enum RechargeMethod { Recharge_byItem, Recharge_byCurrency }//TODO 考虑后续以json方式存储补充体力方式信息 #endregion #region Temporary_Constant private const int DEFAULT_USAGE_AMOUNT = 1;//默认使用数目,使用时的最小量 /// /// 体力药物品ID /// private const int ENERGY_ITEM_ID = 8;//TODO 体力药物品ID,考虑加入globalconfig private readonly int[] itemIDs = { ENERGY_ITEM_ID, GLConfig.Inst.data.DiamondItemId };//TODO 考虑后续将补充体力方式改为json配置后需要调整传参 #endregion #region UI GameObj //UI GameObj ///Auto Gen Start/// public Image Image_BG; public TMP_Text Text_Title; public TMP_Text Text_Currency; public Button Button_Close; public Image Image_DetailBG; public TMP_Text Text_Detail; public Image Image_BtnBar; public TMP_InputField Text_NumInputField; public Button Button_Min; public Image Image_Min; public TMP_Text Text_Min; public Button Button_Minus; public Button Button_Max; public Image Image_Max; public TMP_Text Text_Max; public Button Button_Plus; public Image Image_ItemBG; public Image Image_ItemRect; public Image Image_MovePoint; public Image Image_Arrow; public TMP_Text Text_NowCount; public TMP_Text Text_AfterCount; public Button Button_Return; public TMP_Text Text_Return; public Button Button_Buy; public TMP_Text Text_Buy; ///Auto Gen End/// private RawImage rawImageGaussianBlurMask; #endregion #region class /// /// 体力恢复计时器 /// class EnergyRefreshTimer : IDisposable { private TimeSpan EnergyRecoveryTimer; private uint m_CurrEnergy; public uint CurrEnergy { get { return m_CurrEnergy; } } public UnityEvent onTimerRunOut; private CancellationTokenSource cts = new CancellationTokenSource(); public void Init() { onTimerRunOut = new UnityEvent(); } public void OnEnable() { GetDataFromNet(); onTimerRunOut.AddListener(GetDataFromNet); } public void OnDisable() { onTimerRunOut.RemoveAllListeners(); Dispose(); } public void GetDataFromNet() { m_CurrEnergy = EnergyManager.Instance.GetNowEnergy(); if (m_CurrEnergy >= EnergyManager.Instance.GetMaxEnergyPoint()) { onTimerRunOut.RemoveAllListeners(); return; }//if energy full, stop timer DateTime curTime = CommonUtils.GetCurTime(CommonUtils.E_TimeType.Server); EnergyRecoveryTimer = EnergyManager.Instance.GetNextEnergyRecoverTime() - curTime; StartRefresh(cts.Token); } public async void StartRefresh(CancellationToken token) { await UniTask.Delay((int)EnergyRecoveryTimer.TotalSeconds, cancellationToken: token); onTimerRunOut.Invoke(); } public void Dispose() { cts.Cancel(); } void OnDestroy() { onTimerRunOut.RemoveAllListeners(); Dispose(); } ~EnergyRefreshTimer() { OnDestroy(); } } /// /// 用于存放补充体力消耗物与获得体力转化率的类 /// class ConvertRatesWrap { private const int CONVERSION_RATE_ITEM_TOENERGY = 1; private const int CONVERSION_RATE_ENERGY_FROMITEM = 30; public List convertRates; public ConvertRatesWrap() { convertRates = new List(); //TODO 根据后续需求,考虑用配置读入转化率 AddRate(CONVERSION_RATE_ITEM_TOENERGY, CONVERSION_RATE_ENERGY_FROMITEM); AddRate(GLConfig.Inst.data.DiamondExchangeEnergy); } void AddRate(int consume, int recharge) { convertRates.Add(new ConversionRate(consume, recharge)); } void AddRate(List exchangeRate) { if (exchangeRate.Count >= 2) convertRates.Add(new ConversionRate(exchangeRate[0], exchangeRate[1])); else DebugUtil.LogError("转化率list传入参数不足!"); } //API public int GetConsume(RechargeMethod method, int usageAmount = 1) { if ((int)method < convertRates.Count) { return usageAmount * convertRates[(int)method].consume; } else { DebugUtil.LogError("补充体力方式枚举类与转换率数组长度不匹配!请检查!"); return usageAmount * convertRates[0].consume; } } public int GetRecharge(RechargeMethod method, int usageAmount = 1) { if ((int)method < convertRates.Count) { return usageAmount * convertRates[(int)method].recharge; } else { DebugUtil.LogError("补充体力方式枚举类与转换率数组长度不匹配!请检查!"); return usageAmount * convertRates[0].recharge; } } //class public class ConversionRate { public int consume; public int recharge; public ConversionRate(int consume, int recharge) { this.consume = consume; this.recharge = recharge; } } } class MethodButtonObj: UIGameObjectWrapper { private GameObject chosenCircle; private TextMeshProUGUI itemAmountText; private Image buttonIcon; //TODO 考虑后续,将补充体力方式改为json配置后,可能需要调整传参 public MethodButtonObj(GameObject root, int i, int itemID, bool isScaleShow = true) : base(root, i, isScaleShow) { chosenCircle = FindObj("ChooseRect"); itemAmountText = GetComponent("ImageCount/TextCount"); buttonIcon = GetComponent("ItemIcon"); RefreshIcon(itemID); } public void BindListener(Action callback) { BindButton(GameObject.GetComponent