using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using DG.Tweening; using Cysharp.Threading.Tasks; using System.Threading; using System; /// /// 武将布阵界面 /// public class HeroPosWin : UIBase { [SerializeField] Text[] attrOnList; //上阵属性加成 [SerializeField] Button countryOnBtn; [SerializeField] Image countryOnImg; //上阵阵型激活国家 [SerializeField] UIEffectPlayer countryEffect; [SerializeField] List OnCountImgs; //上阵数量激活 [SerializeField] List scenePosImgs; //场景布阵位置 [SerializeField] HeroScenePosCell[] sceneHero; [SerializeField] GroupButtonEx attackTeamBtn; [SerializeField] GroupButtonEx defendTeamBtn; [SerializeField] Text fightPowerText; //由客户端自己预算的战力 [SerializeField] ScrollerController heroListScroller; [SerializeField] Transform heroListEmpty; [SerializeField] Toggle showConnTipToggleBtn; [SerializeField] HeroSelectBehaviour fiterManager; //武将筛选 [SerializeField] Button oneKeyOnBtn; //一键上阵 [SerializeField] Button saveBtn; //保存阵型 [SerializeField] Button backBtn; //退出界面 [SerializeField] GroupButtonEx jjcBtn; //竞技场 // [SerializeField] GroupButtonEx tttBtn; //通天塔 [SerializeField] GroupButtonEx mainFBBtn; //主线副本 //羁绊 [SerializeField] HeroConnectionCell connetionForm; [SerializeField] HeroHeadBaseCell flyHead; [SerializeField] CanvasGroup flyAlphaTween; Sequence sequence; CancellationTokenSource _cts; Queue showConnectTipQueue = new Queue(); private bool m_IsToggleOn = false; private bool isToggleOn { get { return m_IsToggleOn; } set { if (m_IsToggleOn != value) { m_IsToggleOn = value; LocalSave.SetBool("ShowConn" + PlayerDatas.Instance.baseData.PlayerID, value); } } } protected override void InitComponent() { attackTeamBtn.AddListener(() => { SelectTeamFunc((TeamType)HeroUIManager.Instance.GetSelectTeamTypeByAttackType(0)); }); defendTeamBtn.AddListener(() => { SelectTeamFunc((TeamType)HeroUIManager.Instance.GetSelectTeamTypeByAttackType(1)); }); mainFBBtn.AddListener(() => { SelectTeamFunc(TeamType.Story); }); jjcBtn.AddListener(() => { SelectTeamFunc(TeamType.Arena); }); // tttBtn.AddListener(() => // { // SelectTeamFunc(TeamType.Tower); // }); showConnTipToggleBtn.AddListener((value) => { isToggleOn = showConnTipToggleBtn.isOn; if (isToggleOn == false) { CancelCurrentTask(); } }); oneKeyOnBtn.AddListener(OneKeyOnPos); saveBtn.AddListener(SaveTeam); backBtn.AddListener(CloseWindow); countryOnBtn.AddListener(() => { UIManager.Instance.OpenWindow(); }); m_IsToggleOn = LocalSave.GetBool("ShowConn" + PlayerDatas.Instance.baseData.PlayerID, false); } protected override void OnPreOpen() { HeroUIManager.Instance.selectTeamPosJob = 0; HeroUIManager.Instance.selectTeamPosCountry = 0; HeroUIManager.Instance.SortHeroOnTeamList(); heroListScroller.OnRefreshCell += OnRefreshCell; HeroUIManager.Instance.OnTeamPosChangeEvent += TeamChangeEvent; TeamManager.Instance.OnTeamChange += OnTeamChange; CreateScroller(); Refresh(); } protected override void OnPreClose() { CancelCurrentTask(); heroListScroller.OnRefreshCell -= OnRefreshCell; HeroUIManager.Instance.OnTeamPosChangeEvent -= TeamChangeEvent; TeamManager.Instance.OnTeamChange -= OnTeamChange; TeamManager.Instance.GetTeam(HeroUIManager.Instance.selectTeamType).RestoreTeam(); } public override void Refresh() { OnBattleTeamAttrPer(); RefreshOnTeamCountry(); RefreshOnTeamBtn(); RefreshTeamHero(); RefreshFlyHead(); RefreshConn(); RefreshEmptyTip(); showConnTipToggleBtn.isOn = isToggleOn; fiterManager.Display(0, HeroUIManager.Instance.selectTeamPosJob, HeroUIManager.Instance.selectTeamPosCountry, SelectJobCountry); fightPowerText.text = UIHelper.ReplaceLargeArtNum(FightPowerManager.Instance.GetTeamFightPower(HeroUIManager.Instance.selectTeamType, true)); } void RefreshFlyHead() { var flyCanvas = flyAlphaTween.GetComponent(); flyCanvas.sortingLayerID = canvas.sortingLayerID; flyCanvas.sortingOrder = canvas.sortingOrder + 9; flyAlphaTween.alpha = 0; flyHead.transform.localScale = Vector3.zero; } void RefreshConn() { connetionForm.SetActive(false); var canvasConn = connetionForm.GetComponent(); canvasConn.sortingLayerID = canvas.sortingLayerID; canvasConn.sortingOrder = canvas.sortingOrder + 9; CancelCurrentTask(); } void SelectJobCountry(int job, int country) { HeroUIManager.Instance.selectTeamPosJob = job; HeroUIManager.Instance.selectTeamPosCountry = country; HeroUIManager.Instance.SortHeroOnTeamList(); CreateScroller(); RefreshEmptyTip(); } void RefreshEmptyTip() { if (HeroUIManager.Instance.heroOnTeamSortList.Count <= 0) { heroListEmpty.SetActive(true); heroListScroller.SetActive(false); } else { heroListEmpty.SetActive(false); heroListScroller.SetActive(true); } } void OnRefreshCell(ScrollerDataType type, CellView cell) { var _cell = cell as HeroPosLineCell; _cell.Display(cell.index); } void CreateScroller() { heroListScroller.Refresh(); for (int i = 0; i < HeroUIManager.Instance.heroOnTeamSortList.Count; i++) { if (i % 5 == 0) { heroListScroller.AddCell(ScrollerDataType.Header, i); } } heroListScroller.Restart(); } //上阵加成 void OnBattleTeamAttrPer() { var valuePer = 0; var team = TeamManager.Instance.GetTeam(HeroUIManager.Instance.selectTeamType); if (team != null) { for (int i = 0; i < team.serverHeroes.Length; i++) { if (team.serverHeroes[i] == null) continue; var hero = HeroManager.Instance.GetHero(team.serverHeroes[i].guid); if (hero != null) { valuePer += hero.GetOnBattleAddPer(); } } } //上阵属性 for (int i = 0; i < attrOnList.Length; i++) { string format = valuePer == 0 ? "{0}+{1}" : "{0}+" + UIHelper.AppendColor(TextColType.Green, "{1}", false); attrOnList[i].text = PlayerPropertyConfig.GetFullDescription(PlayerPropertyConfig.basePerAttrs[i], valuePer, format); } } //上阵武将国家光环激活 void RefreshOnTeamCountry(bool playEffect = false) { Int2 result = HeroUIManager.Instance.GetMaxCountHeroCountry(HeroUIManager.Instance.selectTeamType, true); var config = HeroLineupHaloConfig.GetConfig(result.x, result.y); if (config == null) { countryOnImg.SetSprite("heroTeamCountry0"); for (int i = 0; i < OnCountImgs.Count; i++) { OnCountImgs[i].SetActive(false); } } else { countryOnImg.SetSprite("heroTeamCountry" + result.x); for (int i = 0; i < OnCountImgs.Count; i++) { if (i < result.y) { OnCountImgs[i].SetActive(true); OnCountImgs[i].SetSprite("heroTeamCountryPoint" + result.x); } else { OnCountImgs[i].SetActive(false); } } if (playEffect) countryEffect.Play(); } } //管理布阵入口按钮:如竞技场是否根据功能显隐,通天塔和主线只有进攻方布阵默认不显示 void RefreshOnTeamBtn() { if (HeroUIManager.Instance.selectTeamType == TeamType.Arena || HeroUIManager.Instance.selectTeamType == TeamType.ArenaDefense) { attackTeamBtn.SetActive(true); defendTeamBtn.SetActive(true); if (HeroUIManager.Instance.selectTeamType == TeamType.Arena) { attackTeamBtn.SelectBtn(true); } else { defendTeamBtn.SelectBtn(true); } } else { attackTeamBtn.SetActive(false); defendTeamBtn.SetActive(false); } } void RefreshTeamHero() { var team = TeamManager.Instance.GetTeam(HeroUIManager.Instance.selectTeamType); for (int i = 0; i < sceneHero.Length; i++) { var teamHero = team.tempHeroes[i]; if (teamHero == null) { sceneHero[i].SetActive(false); } else { sceneHero[i].SetActive(true); sceneHero[i].Display(teamHero.guid, i); //按scenePosImgs 顺序排序对应位置 sceneHero[i].transform.position = scenePosImgs[i].transform.position; sceneHero[i].transform.localScale = Vector3.one; } } RefreshPosScale(); } void RefreshPosScale() { for (int i = 0; i < scenePosImgs.Count; i++) { scenePosImgs[i].transform.localScale = Vector3.one; } } /// /// 点击上阵,拖拉,一键等触发; /// /// 要刷新的布阵位置 /// 大于-1代表是点击上阵,需要表现飞行效果 void TeamChangeEvent(List posList, int flyFrom, Vector3 startPos) { var team = TeamManager.Instance.GetTeam(HeroUIManager.Instance.selectTeamType); foreach (var i in posList) { var teamHero = team.tempHeroes[i]; if (teamHero == null) { sceneHero[i].SetActive(false); } else { sceneHero[i].SetActive(true); sceneHero[i].Display(teamHero.guid, i, flyFrom >= 0, flyFrom != -2 ? true : false); //按scenePosImgs 顺序排序对应位置 sceneHero[i].transform.position = scenePosImgs[i].transform.position; sceneHero[i].transform.localScale = Vector3.one; } } RefreshPosScale(); heroListScroller.m_Scorller.RefreshActiveCellViews(); RefreshOnTeamCountry(true); //表现飞入,连续点击不同头像触发的话则重置 if (flyFrom > -1) { var flyHero = HeroManager.Instance.GetHero(HeroUIManager.Instance.heroOnTeamSortList[flyFrom]); if (flyHero == null) return; //先停止 sequence if (sequence != null) { sequence.Kill(); } sequence = DOTween.Sequence(); flyAlphaTween.alpha = 1; flyHead.Init(flyHero.heroId, flyHero.SkinID); flyHead.transform.position = startPos; var targetPos = scenePosImgs[posList[0]].transform.position; flyHead.transform.localScale = Vector3.one; sequence.Append(flyHead.transform.DOMove(targetPos, HeroUIManager.clickFlyPosTime).SetEase(Ease.OutQuad)) .Join(flyHead.transform.DOScale(new Vector3(0.5f, 0.5f, 0.5f), HeroUIManager.clickFlyPosTime).SetEase(Ease.OutQuad)) .Join(flyAlphaTween.DOFade(0f, HeroUIManager.clickFlyPosTime).SetEase(Ease.OutQuad)); sequence.onComplete = () => { flyHead.transform.localScale = Vector3.zero; }; if (isToggleOn) { ShowFetter(flyHero); } } fightPowerText.text = UIHelper.ReplaceLargeArtNum(FightPowerManager.Instance.GetTeamFightPower(HeroUIManager.Instance.selectTeamType, true)); } void ShowFetter(HeroInfo hero) { var heroConfig = hero.heroConfig; var fetterList = hero.GetActiveFetter(heroConfig, TeamManager.Instance.GetTeam(HeroUIManager.Instance.selectTeamType)); for (int i = 0; i < fetterList.Count; i++) { if (!showConnectTipQueue.Contains(fetterList[i])) showConnectTipQueue.Enqueue(fetterList[i]); } if (_cts == null) { _cts = new CancellationTokenSource(); RunTaskAsync(_cts.Token).Forget(); // Forget() 表示不等待此任务完成 } } async UniTask RunTaskAsync(CancellationToken token) { try { while (showConnectTipQueue.Count > 0) { await UniTask.Delay(300, cancellationToken: token); showConnectTipQueue.TryDequeue(out int fetterID); if (fetterID == 0) { continue; } connetionForm.SetActive(true); connetionForm.Display(fetterID); //显示1.5秒后关闭 await UniTask.Delay(1500, cancellationToken: token); connetionForm.SetActive(false); } } catch (OperationCanceledException) { Debug.Log("羁绊 协程被取消"); connetionForm.SetActive(false); } finally { _cts?.Dispose(); // 释放资源 _cts = null; // 置空避免重复取消 showConnectTipQueue.Clear(); } } // 取消当前正在运行的任务 public void CancelCurrentTask() { _cts?.Cancel(); // 触发取消 _cts?.Dispose(); // 释放资源 _cts = null; // 置空避免重复取消 showConnectTipQueue.Clear(); } void OneKeyOnPos() { var guidList = HeroUIManager.Instance.SelectRecommend(); var team = TeamManager.Instance.GetTeam(HeroUIManager.Instance.selectTeamType); team.RemoveAllHeroes(); for (int i = 0; i < guidList.Count; i++) { team.AddHero(HeroManager.Instance.GetHero(guidList[i]), i); } TeamChangeEvent(new List() { 0, 1, 2, 3, 4, 5 }, -1, Vector3.zero); } void SaveTeam() { var team = TeamManager.Instance.GetTeam(HeroUIManager.Instance.selectTeamType); team.SaveTeam(); } void SelectTeamFunc(TeamType type) { if (HeroUIManager.Instance.selectTeamType == type) { return; } HeroUIManager.Instance.selectTeamPosJob = 0; HeroUIManager.Instance.selectTeamPosCountry = 0; HeroUIManager.Instance.selectTeamType = type; HeroUIManager.Instance.SortHeroOnTeamList(); Refresh(); heroListScroller.m_Scorller.RefreshActiveCellViews(); } protected void OnTeamChange(TeamType teamType) { if (HeroUIManager.Instance.selectTeamType == teamType) { HeroUIManager.Instance.SortHeroOnTeamList(); heroListScroller.m_Scorller.RefreshActiveCellViews(); } } }