/****************************************************
文件: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