/// #pkgName FGUI包名 /// #panelName UIPanel名字 /// #UIName = $"{#pkgName}{#panelName}" UIKey名字 /// 该脚本由模板创建 /// created by cb 2024 using FairyGUI; using FL.Data; using Spine.Unity; using System.Collections.Generic; using UnityEngine; using XGame.Database; using XGame.Framework.FGUI; using XGame.Framework.Time; using XGame.Framework.UI; namespace FL.FGUI { /// /// UI逻辑处理类 /// /// public partial class DragonEggBoxCtrl : UIController { private int _addSocre;// 选择的品质龙蛋增加的积分; private ITimer _autoTimer;// 自动定时器 private ITimer _openBoxTimer; private Vector3 _startPos; private Vector3 _endPos; private Vector3 _scoreEndPos; private HashSet _flyingList; private List _dragonBtnList; private Dictionary _attributeDescMap; private const int _costDragonEggNum = 10; // 每次消耗的龙蛋数量 protected override void OnEnable(object intent) { AddUIListenres(); VM.MenusBtnCtrl.onChanged.Add(OnMenusBtnCtrlChange); EventSingle.Instance.AddListener(EventDefine.AttributeChange, OnChangeAttribute); // 角色属性变化 Init(); } protected override void OnDisable() { RemoveUIListenres(); ClearAutoTimer(); ClearOpenTimer(); EventSingle.Instance.RemoveListener(EventDefine.AttributeChange, OnChangeAttribute); // 角色属性变化 VM.MenusBtnCtrl.onChanged.Remove(OnMenusBtnCtrlChange); if (_flyingList != null) { foreach (var flying in _flyingList) { Context.Asset.Recycle(flying); } _flyingList.Clear(); _flyingList = null; } if (_attributeDescMap != null) { _attributeDescMap.Clear(); _attributeDescMap = null; } if (_dragonBtnList != null) { _dragonBtnList.Clear(); _dragonBtnList = null; } VM.DragonSpine.url = string.Empty; } #region UI事件 private void AddUIListenres() { VM.AutoBtn.onClick.Add(OnClickAutoBtn); VM.NextBtn.onClick.Add(OnClickNextBtn); VM.LastBtn.onClick.Add(OnClickLastBtn); VM.BagBtn.onClick.Add(OnClickBagBtn); VM.BoxAwardBtn.onClick.Add(OnClickBoxAwardBtn); VM.DragonSpineBtn.onClick.Add(OnclickDragonSpineBtn); } private void RemoveUIListenres() { VM.AutoBtn.onClick.Remove(OnClickAutoBtn); VM.NextBtn.onClick.Remove(OnClickNextBtn); VM.LastBtn.onClick.Remove(OnClickLastBtn); VM.BagBtn.onClick.Remove(OnClickBagBtn); VM.BoxAwardBtn.onClick.Remove(OnClickBoxAwardBtn); VM.DragonSpineBtn.onClick.Remove(OnclickDragonSpineBtn); } private void OnClickAutoBtn(EventContext context) { if (_autoTimer == null) { if (IsEmptyBox()) { return; } OpenDragonEggBoxAni(true); _autoTimer = Context.Time.AddLooperTimer(500, (int dt) => { if (IsEmptyBox(false)) { ClearAutoTimer(true); return; } PlayDropAni(); }); } else { ClearAutoTimer(true); } } private void OnClickNextBtn(EventContext context) { OnSelectDragon(VM.MenusBtnCtrl.selectedIndex + 1); } private void OnClickLastBtn(EventContext context) { OnSelectDragon(VM.MenusBtnCtrl.selectedIndex - 1); } /// /// 点击背包按钮 /// /// private void OnClickBagBtn(EventContext context) { XGame.Log.Debug("打开背包"); // 测试装备掉落 DragonEggService.Instance.MakeEquip(); } /// /// 积分进度条满值可领取对应的宝箱奖励 /// /// private void OnClickBoxAwardBtn(EventContext context) { OnChangeDrangonEggScore(); } private void OnclickDragonSpineBtn(EventContext context) { ClearAutoTimer(true); if (IsEmptyBox()) return; OpenDragonEggBoxAni(false); PlayDropAni(); } #endregion private void Init() { _startPos = VM.DragonSpineBtn.displayObject.LocalToWorld(new Vector3(VM.DragonSpineBtn.width / 3, VM.DragonSpineBtn.height / 2, 0)); _endPos = VM.BagBtn.displayObject.LocalToWorld(new Vector3(VM.BagBtn.width / 10, VM.BagBtn.height / 8, 0)); _scoreEndPos = VM.EggPointBar.displayObject.LocalToWorld(new Vector3(VM.EggPointBar.width / 2, VM.EggPointBar.height / 2, 0)); InitDrangonBoxUI(); InitAttributeDescMap(); ShowAttributeUI(); ShowDragonEggScoreUI(0); } /// /// 加载龙的spine /// /// private void LoadDragonSpine(string spineName) { VM.DragonSpine.LoadSpine(spineName, "box_idle", true); } /// /// 龙蛋积分变化 /// /// /// private void ShowDragonEggScoreUI(int addScore, bool bTweenValue = false) { if (addScore != 0) DragonEggData.Instance.DragonEggSocre += addScore; VM.EggPointBar.max = DragonEggData.Instance.MaxDragonEggSocre; if (bTweenValue) VM.EggPointBar.TweenValue(DragonEggData.Instance.DragonEggSocre, 0.5f); else VM.EggPointBar.value = DragonEggData.Instance.DragonEggSocre; OnchangeAwardState(DragonEggData.Instance.DragonEggSocre >= DragonEggData.Instance.MaxDragonEggSocre); } private void InitDrangonBoxUI() { if (_dragonBtnList == null) _dragonBtnList = new List() { VM.DragonBtn1, VM.DragonBtn2, VM.DragonBtn3, VM.DragonBtn4, VM.DragonBtn5 }; int index = -1; for (int i = 0; i < 5; i++) { int num = DragonEggData.Instance.GetDragonEgg((EQualityLevel)i); ShowDragonBoxNum(i, num); if (num > 0 && index == -1) index = i; } OnSelectDragon(index == -1 ? 0 : index); } /// /// 判断龙裔宝卵数量是否 /// /// private bool IsEmptyBox(bool bShowTip = true) { var quality = (EQualityLevel)VM.MenusBtnCtrl.selectedIndex; var boxNum = DragonEggData.Instance.GetDragonEgg(quality); if (boxNum == 0) { if (bShowTip) { EventSingle.Instance.Notify(EventDefine.ShowTips, StringDefine.dragonEggsEmpty); } return true; } return false; } /// /// 龙蛋品质宝箱数量 /// /// /// private void ShowDragonBoxNum(int index, int num) { if (_dragonBtnList[index]?.title != null) _dragonBtnList[index].title = $"X{num}"; } private void ShowFlyIconView(int i, bool bScore) { var flyParam = new FlyingIconParam() { iconName = i < 6 ? $"itemicon_{i + 1}" : $"itemicon_{99}", startPos = _startPos, bScore = bScore, endPos = _endPos, }; if (_flyingList == null) _flyingList = new HashSet(); var loadAsync = Context.Asset.LoadFguiNested(UINestedKeys.DragonEggFlyIcon, VM.DragonSpineBtn); loadAsync.On(_ => { var flyView = loadAsync.Result as DragonEggFlyIconView; if (flyView != null) { flyParam.callback = (bScore) => { FlyingCallback(flyView, bScore); }; flyView.Ctrl.ShowUI(flyParam); _flyingList.Add(flyView); } }); } private void FlyingCallback(DragonEggFlyIconView flyView, bool bScore) { _flyingList.Remove(flyView); Context.Asset.Recycle(flyView); if (_flyingList.Count == 0) OnchangBagState(false); if (bScore) { ShowDragonEggScoreUI(_addSocre, true); } } private void OnchangBagState(bool bOpen) { VM.BagBtn.GetController("State").selectedIndex = bOpen ? 1 : 0; } /// /// 开龙蛋宝箱的掉落动画 /// private void PlayDropAni() { var quality = (EQualityLevel)VM.MenusBtnCtrl.selectedIndex; var boxNum = DragonEggData.Instance.GetDragonEgg(quality); int num = boxNum < _costDragonEggNum ? boxNum : _costDragonEggNum; DragonEggService.Instance.OnchangeDragonEgg(quality, -num); ShowDragonBoxNum((int)quality, DragonEggData.Instance.GetDragonEgg(quality)); _addSocre = (VM.MenusBtnCtrl.selectedIndex + 1) * num; OnchangBagState(true); //ShowFlyIconView(0, true); for (int i = 0; i < num; i++) { ShowFlyIconView(i, i == num - 1); } } /// /// 宝箱按钮领取状态 /// /// private void OnchangeAwardState(bool bAward) { VM.AwardState.selectedIndex = bAward ? 1 : 0; } private void OnSelectDragon(int index) { VM.MenusBtnCtrl.selectedIndex = index; ShowSelectDragonUI(); } /// /// 当前选中的龙蛋 /// private void ShowSelectDragonUI() { ClearAutoTimer(true); int selectedIndex = VM.MenusBtnCtrl.selectedIndex; ShowDragonName(selectedIndex); // 获取龙的spine LoadDragonSpine("box_skeletondata"); } /// /// 龙蛋按钮菜单栏变化 /// /// private void OnMenusBtnCtrlChange(EventContext context) { ShowSelectDragonUI(); } private void ShowDragonName(int selectedIndex) { VM.LastBtn.visible = selectedIndex != 0; VM.NextBtn.visible = selectedIndex != 4; VM.DragonLabel.text = $"品质{selectedIndex + 1}钻石龙"; VM.DragonLabel.color = ColorDefine.ToEquipNameColor((EQualityLevel)(selectedIndex + 1)); } /// /// 领取龙蛋积分宝箱后龙蛋进度条积分变化 /// private void OnChangeDrangonEggScore() { int addSocre = -DragonEggData.Instance.MaxDragonEggSocre; DragonEggData.Instance.MaxDragonEggSocre += 10; ShowDragonEggScoreUI(addSocre); } private void InitAttributeDescMap() { if (_attributeDescMap == null) { _attributeDescMap = new Dictionary() { {EAttributeType.Atk, GetAttributeDesc(EAttributeType.Atk)}, {EAttributeType.Hp, GetAttributeDesc(EAttributeType.Hp)}, {EAttributeType.Def, GetAttributeDesc(EAttributeType.Def)} }; } } private string GetAttributeDesc(EAttributeType attrType) { var attrInfo = AttrDescTableRepo.Get((int)attrType); return attrInfo?.ShowName ?? string.Empty; } /// /// 显示角色属性UI(攻击|生命|防御) /// private void ShowAttributeUI() { ShowAtrributeVal(VM.AttackLabel, EAttributeType.Atk); ShowAtrributeVal(VM.HpLabel, EAttributeType.Hp); ShowAtrributeVal(VM.DefenseLabel, EAttributeType.Def); } private void ShowAtrributeVal(GTextField attrLabel, EAttributeType attrType) { attrLabel.text = $"{_attributeDescMap[attrType]}:{PlayerData.Instance.Attr.GetValue(attrType)}"; } /// /// 角色属性变化 /// /// /// private void OnChangeAttribute(int eventId, object args) { EAttributeType attrType = (EAttributeType)args; if (attrType == EAttributeType.Atk) { ShowAtrributeVal(VM.AttackLabel, EAttributeType.Atk); } else if (attrType == EAttributeType.Hp) { ShowAtrributeVal(VM.HpLabel, EAttributeType.Hp); } else if (attrType == EAttributeType.Def) { ShowAtrributeVal(VM.DefenseLabel, EAttributeType.Def); } } /// /// 龙蛋开箱动画 /// private void OpenDragonEggBoxAni(bool bLoop) { if (VM.DragonSpine.Play("box_open", bLoop)) { if (!bLoop) { ClearOpenTimer(); _openBoxTimer = Context.Time.AddDelayTimer(VM.DragonSpine.spineAnimation.GetDurationMS(), () => { VM.DragonSpine.Play("box_idle", true); }); } } } private void ClearOpenTimer() { if (_openBoxTimer != null) { _openBoxTimer.Cancel(); _openBoxTimer = null; } } private void ClearAutoTimer(bool bResetIdle = false) { if (_autoTimer != null) { if (bResetIdle) { VM.DragonSpine.Play("box_idle", true); } _autoTimer.Cancel(); _autoTimer = null; } } } }