/// #pkgName FGUI包名 /// #panelName UIPanel名字 /// #UIName = $"{#pkgName}{#panelName}" UIKey名字 /// 该脚本由模板创建 /// created by cb 2024 using FairyGUI; using FL.Data; using System; using System.Collections.Generic; using UnityEngine; using XGame.Database; using XGame.Framework.Time; using XGame.Framework.UI; namespace FL.FGUI { /// /// UI逻辑处理类 /// /// public partial class DragonEggUpgradeCtrl : UIController { public enum eState { fillEnergy = 0, // 填充能量状态 fullEnergy = 1, // 满能量可升阶状态 upgradeStep = 2, // 升阶倒计时状态 maxStep = 3, // 已满级 } private const int maxQualityLv = 11;// 总共11个品质等级 private EnergyTable _curInfo; // 当前龙蛋等级信息 private GLoader _costItemIcon; private GTextField _costNumLabel; private GTextField _watchAdNumLabel; private ITimer _stepTimer; // 升阶倒计时定时器 protected override void OnEnable(object intent) { AddUIListenres(); AddEventListeners(); InitUI(); ShowUI(); } protected override void OnDisable() { if (_curInfo != null) _curInfo = null; RemoveUIListenres(); RemoveEventListeners(); ClearStepTimer(); } #region UI事件 private void AddUIListenres() { VM.GoldAddBtn.onClick.Add(OnClickGoldAddBtn); VM.PropAddBtn.onClick.Add(OnClickPropAddBtn); VM.UpgradeBtn.onClick.Add(OnClickUpgradeBtn); VM.BuyBtn.onClick.Add(OnClickBuyBtn); VM.AdBtn.onClick.Add(OnClickAdBtn); VM.SpeedBtn.onClick.Add(OnClickSpeedBtn); VM.CloseBtn.onClick.Add(OnClickCloseBtn); } private void RemoveUIListenres() { VM.GoldAddBtn.onClick.Remove(OnClickGoldAddBtn); VM.PropAddBtn.onClick.Remove(OnClickPropAddBtn); VM.UpgradeBtn.onClick.Remove(OnClickUpgradeBtn); VM.BuyBtn.onClick.Remove(OnClickBuyBtn); VM.AdBtn.onClick.Remove(OnClickAdBtn); VM.SpeedBtn.onClick.Remove(OnClickSpeedBtn); VM.CloseBtn.onClick.Remove(OnClickCloseBtn); } private void OnClickGoldAddBtn(EventContext context) { } private void OnClickPropAddBtn(EventContext context) { } private void OnClickUpgradeBtn(EventContext context) { DragonEggService.Instance.UpgradeDragonEgg(Context.Time.GetNowTime(), _curInfo.Time * 1000); } private void OnClickBuyBtn(EventContext context) { DragonEggService.Instance.FillDragonEggEnergy(_curInfo.Expend); } //观看广告减少升级时间按钮事件 private void OnClickAdBtn(EventContext context) { DragonEggService.Instance.ReduceTimeByWatchAd(Context.Time.GetNowTime()); } // 加速按钮,打开道具使用界面 private void OnClickSpeedBtn(EventContext context) { var needTime = DragonEggData.Instance.UpgradeEndTime - Context.Time.GetNowTime(); var args = new UseItemParam { id = DragonEggData.Instance.AccelerateId, showNum = DragonEggService.Instance.GetAccelerationCardNum(DragonEggData.Instance.AccelerateId, needTime, false), maxNum = DragonEggService.Instance.GetAccelerationCardNum(DragonEggData.Instance.AccelerateId, needTime), endTime = DragonEggData.Instance.UpgradeEndTime, onPromiseCallback = (int num) => { XGame.Log.Warn($"使用加速卡道具后回调函数,使用数量num:{num}"); }, }; Context.UI.OpenAsync(UIKeys.CommonUseItem, args); } private void OnClickCloseBtn(EventContext context) { Context.ClosePanel(); } #endregion private void AddEventListeners() { EventSingle.Instance.AddListener(EventDefine.UpdataItemData, UpdataItemData); EventSingle.Instance.AddListener(EventDefine.FillEnergy, FillEnergy); EventSingle.Instance.AddListener(EventDefine.UpgradeDragonEgg, UpgradeDragonEgg); EventSingle.Instance.AddListener(EventDefine.ReduceDragonEggTime, ReduceDragonEggTime); EventSingle.Instance.AddListener(EventDefine.UpgradeDragonEggSucess, UpgradeDragonEggSucess); } private void RemoveEventListeners() { EventSingle.Instance.RemoveListener(EventDefine.UpdataItemData, UpdataItemData); EventSingle.Instance.RemoveListener(EventDefine.FillEnergy, FillEnergy); EventSingle.Instance.RemoveListener(EventDefine.UpgradeDragonEgg, UpgradeDragonEgg); EventSingle.Instance.RemoveListener(EventDefine.ReduceDragonEggTime, ReduceDragonEggTime); EventSingle.Instance.RemoveListener(EventDefine.UpgradeDragonEggSucess, UpgradeDragonEggSucess); } private void InitUI() { VM.EggQualityList.ListType = EGListType.None; if (_costItemIcon == null) { _costItemIcon = VM.BuyBtn.GetChild("ItemIcon").asLoader; } if (_costNumLabel == null) { _costNumLabel = VM.BuyBtn.GetChild("NumLabel").asTextField; } if (_watchAdNumLabel == null) { _watchAdNumLabel = VM.AdBtn.GetChild("NumLabel").asTextField; } } private void ShowUI() { _curInfo = EnergyTableRepo.Get(DragonEggData.Instance.EggLv); EnergyTable nextInfo = EnergyTableRepo.Get(DragonEggData.Instance.EggLv + 1); ShowEggQualityUI(nextInfo); ShowUpgradeUI(nextInfo); } /// /// 道具变化 /// /// /// private void UpdataItemData(int eventId, object args) { } // 是否未解锁的品质 private bool IsLockQuality(int quality) { int globalId = DragonEggData.Instance.GetUnlockQuality(quality); bool bLock = globalId > 0; if (bLock) {// 获取全局表的具体解锁条件来判断是否已解锁 //已达解锁条件,移除 if (!bLock) { DragonEggData.Instance.RemoveUnlockQualityDic(quality); } } return bLock; } /// /// 龙蛋品质概率UI /// private void ShowEggQualityUI(EnergyTable nextInfo) { bool bMax = nextInfo == null; int index = 0; var dataList = new List(); for (int i = 0; i < maxQualityLv; i++) { index = (i + 1) * 2 - 1; dataList.Add(new EggQualityItemData { quality = i + 1, curVal = _curInfo.Pro_quality[index], nextVal = bMax ? 0 : nextInfo.Pro_quality[index], bMaxLv = bMax, bLock = IsLockQuality(i + 1), }); } RefreshEggQualityList(dataList); } private void RefreshEggQualityList(List dataList) { VM.EggQualityList.BindDatas(dataList); } /// /// 升级龙蛋UI /// private void ShowUpgradeUI(EnergyTable nextInfo) { bool bMaxLv = nextInfo == null; if (bMaxLv) { VM.State.selectedIndex = (int)eState.maxStep; VM.MaxLv.text = string.Format(string.Format(StringDefine.dragonEggCurLv, $"{_curInfo.Id}(MAX)")); } else { ShowLvUI(_curInfo.Id, nextInfo.Id); if (DragonEggData.Instance.UpgradeEndTime > 0) { ShowUpgradeState(eState.upgradeStep); } else { VM.EggEnergyBar.max = _curInfo.Expend.Length / 2; ShowEggEnergyBar(DragonEggData.Instance.EggEnergy); } } } /// /// 填充龙蛋能量槽事件 /// /// /// private void FillEnergy(int eventId, object args) { ShowEggEnergyBar(DragonEggData.Instance.EggEnergy); } private void ShowEggEnergyBar(int energy) { VM.EggEnergyBar.value = energy; ShowUpgradeState(energy == VM.EggEnergyBar.max ? eState.fullEnergy : eState.fillEnergy); } /// /// 龙蛋升级状态 /// /// private void ShowUpgradeState(eState state) { VM.State.selectedIndex = (int)state; if (state == eState.fillEnergy) { ShowEggEnergyCostUI(); } else if (state == eState.upgradeStep) { ShowUpgradeStepUI(); } } private void ShowLvUI(int curLv, int nextLv) { VM.CurLv.text = string.Format(StringDefine.dragonEggCurLv, curLv); VM.NextLv.text = string.Format(StringDefine.dragonEggCurLv, nextLv); } /// /// 填充能量消耗 /// private void ShowEggEnergyCostUI() { if (_curInfo != null) { int index = DragonEggData.Instance.EggEnergy * 2; int itemId = _curInfo.Expend[index]; var itemInfo = ItemTableRepo.Get(itemId); _costItemIcon.icon = itemInfo.Icon; long needCount = _curInfo.Expend[index + 1]; long count = ItemData.Instance.GetItemNum(itemId); _costNumLabel.text = needCount.ToString(); _costNumLabel.color = count < needCount ? Color.red : Color.white; } } /// /// 龙蛋升级中(倒计时状态) /// /// /// private void UpgradeDragonEgg(int eventId, object args) { ShowUpgradeState(eState.upgradeStep); } private void ShowUpgradeStepUI() { ShowAdBtnUI(); ShowLeftStepTime(); if (_stepTimer == null) { _stepTimer = Context.Time.AddLooperTimer(500, (int dt) => { ShowLeftStepTime(); }); } } /// /// 龙蛋升阶倒计时 /// private void ShowLeftStepTime() { long leftTime = DragonEggData.Instance.UpgradeEndTime - Context.Time.GetNowTime(); if (leftTime > 0) { TimeSpan timeData = TimeSpan.FromMilliseconds(leftTime); VM.NeedTimeLabel.text = timeData.ToString(@"hh\:mm\:ss"); } else { ClearStepTimer(); } } private void ClearStepTimer() { if (_stepTimer != null) { _stepTimer.Cancel(); _stepTimer = null; } } /// /// 观看广告按钮ui /// private void ShowAdBtnUI() { _watchAdNumLabel.text = $"{DragonEggData.Instance.WatchAdCount}/{DragonEggData.Instance.MaxWatchAdCount}"; VM.AdBtn.enabled = DragonEggData.Instance.WatchAdCount > 0; } /// /// 减少龙蛋升级时间 /// private void ReduceDragonEggTime(int eventId, object args) { ShowAdBtnUI(); ShowLeftStepTime(); } /// /// 龙蛋升级成功 /// /// /// private void UpgradeDragonEggSucess(int eventId, object args) { ClearStepTimer(); ShowUI(); } } }