| | |
| | | using UnityEngine; |
| | | using UnityEngine.UI; |
| | | using DG.Tweening; |
| | | using Cysharp.Threading.Tasks; |
| | | using System.Threading; |
| | | using System; |
| | | |
| | | /// <summary> |
| | | /// 武将布阵: 如果可以同时打开多个布阵界面 则使用 functionOrder:布阵类型 |
| | | /// 武将布阵界面 |
| | | /// </summary> |
| | | public class HeroPosWin : UIBase |
| | | { |
| | | [SerializeField] Text[] attrOnList; //上阵属性加成 |
| | | [SerializeField] Button countryOnBtn; |
| | | [SerializeField] Image countryOnImg; //上阵阵型激活国家 |
| | | [SerializeField] UIEffectPlayer countryEffect; |
| | | [SerializeField] List<Image> OnCountImgs; //上阵数量激活 |
| | | [SerializeField] List<Image> scenePosImgs; //场景布阵位置 |
| | | [SerializeField] HeroScenePosCell[] sceneHero; |
| | |
| | | [SerializeField] ScrollerController heroListScroller; |
| | | [SerializeField] Transform heroListEmpty; |
| | | [SerializeField] Toggle showConnTipToggleBtn; |
| | | private bool isToggleOn = false; |
| | | |
| | | [SerializeField] HeroSelectBehaviour fiterManager; //武将筛选 |
| | | |
| | | [SerializeField] Button oneKeyOnBtn; //一键上阵 |
| | | [SerializeField] Button saveBtn; //保存阵型 |
| | | [SerializeField] Button backBtn; //退出界面 |
| | | [SerializeField] GroupButtonEx jjcBtn; //竞技场 |
| | | [SerializeField] GroupButtonEx tttBtn; //通天塔 |
| | | // [SerializeField] GroupButtonEx tttBtn; //通天塔 |
| | | [SerializeField] GroupButtonEx mainFBBtn; //主线副本 |
| | | |
| | | //羁绊 |
| | |
| | | [SerializeField] CanvasGroup flyAlphaTween; |
| | | |
| | | Sequence sequence; |
| | | CancellationTokenSource _cts; |
| | | Queue<int> showConnectTipQueue = new Queue<int>(); |
| | | |
| | | 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(() => |
| | | { |
| | | if (HeroUIManager.Instance.selectTeamType == TeamType.Arena) |
| | | { |
| | | return; |
| | | } |
| | | |
| | | HeroUIManager.Instance.selectTeamType = (TeamType)HeroUIManager.Instance.GetSelectTeamTypeByAttackType(0); |
| | | Refresh(); |
| | | SelectTeamFunc((TeamType)HeroUIManager.Instance.GetSelectTeamTypeByAttackType(0)); |
| | | }); |
| | | defendTeamBtn.AddListener(() => |
| | | { |
| | | if (HeroUIManager.Instance.selectTeamType == TeamType.ArenaDefense) |
| | | { |
| | | return; |
| | | } |
| | | HeroUIManager.Instance.selectTeamType = (TeamType)HeroUIManager.Instance.GetSelectTeamTypeByAttackType(1); |
| | | Refresh(); |
| | | 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<HeroFormationWin>(); |
| | | }); |
| | | |
| | | m_IsToggleOn = LocalSave.GetBool("ShowConn" + PlayerDatas.Instance.baseData.PlayerID, false); |
| | | } |
| | | |
| | | |
| | | protected override void OnPreOpen() |
| | | { |
| | | HeroUIManager.Instance.SortHeroOnTeamList(); //打开界面和保存(服务端)更新阵容是刷新 |
| | | HeroUIManager.Instance.selectTeamPosJob = 0; |
| | | HeroUIManager.Instance.selectTeamPosCountry = 0; |
| | | HeroUIManager.Instance.SortHeroOnTeamList(); |
| | | heroListScroller.OnRefreshCell += OnRefreshCell; |
| | | HeroUIManager.Instance.OnTeamPosChangeEvent += TeamChangeEvent; |
| | | CreateScroller(); |
| | |
| | | |
| | | protected override void OnPreClose() |
| | | { |
| | | CancelCurrentTask(); |
| | | heroListScroller.OnRefreshCell -= OnRefreshCell; |
| | | HeroUIManager.Instance.OnTeamPosChangeEvent -= TeamChangeEvent; |
| | | TeamManager.Instance.GetTeam(HeroUIManager.Instance.selectTeamType).RestoreTeam(); |
| | | } |
| | | |
| | | |
| | |
| | | RefreshOnTeamBtn(); |
| | | RefreshTeamHero(); |
| | | RefreshFlyHead(); |
| | | RefreshConn(); |
| | | |
| | | if (HeroUIManager.Instance.heroOnTeamSortList.Count == 0) |
| | | if (HeroManager.Instance.GetHeroCount() == 0) |
| | | { |
| | | heroListEmpty.SetActive(true); |
| | | heroListScroller.SetActive(false); |
| | |
| | | |
| | | showConnTipToggleBtn.isOn = isToggleOn; |
| | | |
| | | fiterManager.Display(0, 0, 0, SelectJobCountry); |
| | | fiterManager.Display(0, HeroUIManager.Instance.selectTeamPosJob, HeroUIManager.Instance.selectTeamPosCountry, SelectJobCountry); |
| | | |
| | | |
| | | fightPowerText.text = "1234k"; |
| | | |
| | | |
| | | } |
| | | |
| | | void RefreshFlyHead() |
| | |
| | | flyHead.transform.localScale = Vector3.zero; |
| | | } |
| | | |
| | | void RefreshConn() |
| | | { |
| | | connetionForm.SetActive(false); |
| | | var canvasConn = connetionForm.GetComponent<Canvas>(); |
| | | 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(); |
| | | } |
| | | |
| | | void OnRefreshCell(ScrollerDataType type, CellView cell) |
| | |
| | | } |
| | | |
| | | //上阵武将国家光环激活 |
| | | void RefreshOnTeamCountry() |
| | | void RefreshOnTeamCountry(bool playEffect = false) |
| | | { |
| | | Int2 result = HeroUIManager.Instance.GetMaxCountHeroCountry(HeroUIManager.Instance.selectTeamType); |
| | | |
| | | var config = HeroLineupHaloConfig.GetConfig(result.x, result.y); |
| | | if (config == null) |
| | | { |
| | | countryOnImg.SetSprite("heroTeamCountry" + result.x); |
| | | countryOnImg.SetSprite("heroTeamCountry0"); |
| | | for (int i = 0; i < OnCountImgs.Count; i++) |
| | | { |
| | | OnCountImgs[i].SetActive(false); |
| | |
| | | OnCountImgs[i].SetActive(false); |
| | | } |
| | | } |
| | | if (playEffect) |
| | | countryEffect.Play(); |
| | | } |
| | | |
| | | |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | void RefreshPosScale() |
| | | { |
| | | { |
| | | for (int i = 0; i < scenePosImgs.Count; i++) |
| | | { |
| | | scenePosImgs[i].transform.localScale = Vector3.one; |
| | |
| | | } |
| | | RefreshPosScale(); |
| | | heroListScroller.m_Scorller.RefreshActiveCellViews(); |
| | | RefreshOnTeamCountry(true); |
| | | |
| | | //表现飞入,连续点击不同头像触发的话则重置 |
| | | if (flyFrom > -1) |
| | |
| | | .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); |
| | | } |
| | | } |
| | | } |
| | | |
| | | 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 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.SortHeroOnTeamList(); |
| | | HeroUIManager.Instance.selectTeamType = type; |
| | | Refresh(); |
| | | heroListScroller.m_Scorller.RefreshActiveCellViews(); |
| | | } |
| | | } |