yyl
2025-08-04 464c36a0811d5a2ef317ebf1adc1711baab52856
Main/System/HeroUI/HeroPosWin.cs
@@ -3,14 +3,19 @@
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;
@@ -22,14 +27,14 @@
    [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;     //主线副本
    //羁绊
@@ -38,43 +43,75 @@
    [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();
@@ -83,7 +120,10 @@
    protected override void OnPreClose()
    {
        CancelCurrentTask();
        heroListScroller.OnRefreshCell -= OnRefreshCell;
        HeroUIManager.Instance.OnTeamPosChangeEvent -= TeamChangeEvent;
        TeamManager.Instance.GetTeam(HeroUIManager.Instance.selectTeamType).RestoreTeam();
    }
@@ -94,8 +134,9 @@
        RefreshOnTeamBtn();
        RefreshTeamHero();
        RefreshFlyHead();
        RefreshConn();
        if (HeroUIManager.Instance.heroOnTeamSortList.Count == 0)
        if (HeroManager.Instance.GetHeroCount() == 0)
        {
            heroListEmpty.SetActive(true);
            heroListScroller.SetActive(false);
@@ -108,10 +149,12 @@
        showConnTipToggleBtn.isOn = isToggleOn;
        fiterManager.Display(0, 0, 0, SelectJobCountry);
        fiterManager.Display(0, HeroUIManager.Instance.selectTeamPosJob, HeroUIManager.Instance.selectTeamPosCountry, SelectJobCountry);
        fightPowerText.text = "1234k";
    }
    void RefreshFlyHead()
@@ -123,11 +166,21 @@
        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)
@@ -176,14 +229,14 @@
    }
    //上阵武将国家光环激活
    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);
@@ -204,8 +257,9 @@
                    OnCountImgs[i].SetActive(false);
                }
            }
            if (playEffect)
                countryEffect.Play();
        }
    }
@@ -258,7 +312,7 @@
    }
    void RefreshPosScale()
    {
    {
        for (int i = 0; i < scenePosImgs.Count; i++)
        {
            scenePosImgs[i].transform.localScale = Vector3.one;
@@ -292,6 +346,7 @@
        }
        RefreshPosScale();
        heroListScroller.m_Scorller.RefreshActiveCellViews();
        RefreshOnTeamCountry(true);
        //表现飞入,连续点击不同头像触发的话则重置
        if (flyFrom > -1)
@@ -317,7 +372,72 @@
                .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()
@@ -339,4 +459,19 @@
        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();
    }
}