hch
2026-01-26 aa84cb62bebb9c8a4e586bcc1ec28eb7a16a8860
Main/System/HeroUI/HeroTrainWin.cs
@@ -6,7 +6,9 @@
/// <summary>
/// 武将培养界面
/// 武将培养界面
/// functionOrder 0 代表培养  1 代表突破
/// 暂时不做一级界面区分,待时装界面分析处理,目前突破也在这个界面
/// </summary>
public class HeroTrainWin : UIBase
{
@@ -28,6 +30,7 @@
    [SerializeField] HeroConnectionCell connetionForm;  //羁绊
    [SerializeField] Button resetBtn;
    [SerializeField] Button deleteBtn;
    [SerializeField] Transform deleteTip;
    [SerializeField] Button seeLhBtn;   //查看立绘
    [SerializeField] SkillBaseCell normalSkillCell;
    [SerializeField] SkillBaseCell angerSkillCell;
@@ -42,8 +45,8 @@
    [SerializeField] Text awakeLVText;
    //属性区
    [SerializeField] ScrollRect allAttrScroll;
    [SerializeField] Button attrBtn;
    [SerializeField] ScrollRect allAttrScroll;      //培养属性 滚动区
    [SerializeField] Button attrBtn;    //培养区的拖拉按钮
    [SerializeField] Image unfoldImg; //展开时按钮的图标
    [SerializeField] Image foldImg; //收起时按钮的图标
    bool unfoldState = false;//是否展开
@@ -93,6 +96,20 @@
    [SerializeField] Image redpointAwake;
    [SerializeField] Image redpointGift;
    [SerializeField] Image redpointLVUP;
    [SerializeField] Image redpointBreakLVUP; //突破红点
    #region 突破
    // 区分突破和培养模块
    [SerializeField] HeroLVBreakCell heroLVBreakCell;   //对应培养的 allAttrScroll  和 attrBtn
    [SerializeField] GroupButtonEx trainMainButton; //培养入口按钮
    [SerializeField] GroupButtonEx breakMainButton; //突破入口按钮
    //入口伪红点用图片代替
    [SerializeField] Image trainMainRedImg;
    [SerializeField] Image breakMainRedImg;
    #endregion
    Queue<HeroTrainAddAttrCell> lvupAttrQueue = new Queue<HeroTrainAddAttrCell>();
@@ -157,7 +174,10 @@
        allAttrBtn.AddListener(() =>
        {
            UIManager.Instance.OpenWindow<HeroAllAttrWin>(hero.itemHero.gridIndex);
            if (hero == null)
                return;
            var dict = FightPowerManager.Instance.GetHeroTotalAttr(hero);
            AttributeManager.Instance.OpenTotalAttributeWin(dict, hero.itemHero.gridIndex);
        });
        lvupBtn.AddListener(LVUp);
        lvupBtn.onPress.AddListener(LVUp);
@@ -184,6 +204,21 @@
        {
            freezeTipGo.SetActive(!freezeTipGo.activeSelf);
        });
        trainMainButton.AddListener(() =>
        {
            functionOrder = 0;
            DisplayTrainOrBreak(hero);
            ForceRefreshLayout();
        });
        breakMainButton.AddListener(() =>
        {
            functionOrder = 1;
            DisplayTrainOrBreak(hero);
            unfoldState = false;
            RefreshFoldState();
        });
    }
@@ -193,6 +228,8 @@
        HeroManager.Instance.onHeroChangeEvent += RefreshHeroEvent;
        UIManager.Instance.OnCloseWindow += OnCloseWindow;
        TeamManager.Instance.OnTeamChange += TeamPosChangeEvent;
        PackManager.Instance.RefreshItemEvent += RefreshItemEvent;
        guid = HeroUIManager.Instance.selectHeroGuid;
        hero = HeroManager.Instance.GetHero(guid);
        unfoldState = false;
@@ -208,6 +245,7 @@
        HeroManager.Instance.onHeroChangeEvent -= RefreshHeroEvent;
        UIManager.Instance.OnCloseWindow -= OnCloseWindow;
        TeamManager.Instance.OnTeamChange -= TeamPosChangeEvent;
        PackManager.Instance.RefreshItemEvent -= RefreshItemEvent;
    }
    private void OnCloseWindow(UIBase closeUI)
@@ -232,7 +270,7 @@
        jobPosNameText.text = HeroUIManager.Instance.GetJobName(hero.heroConfig.Class);
        descText.text = hero.heroConfig.Desc;
        fightPowerText.text = UIHelper.ReplaceLargeArtNum(hero.CalculateFightPower());
        PlayerMainDate.Instance.AddPowerNotOnTeam(hero);
        // PlayerMainDate.Instance.AddPowerNotOnTeam(hero);
        lockImg.SetActive(hero.isLock);
        unLockImg.SetActive(!hero.isLock);
@@ -257,10 +295,24 @@
        RefreshAwake();
        RefreshFreeze();
        RefreshRedImg();
        DisplayTrainOrBreak(hero);
        ShowDeleteTip();
        HeroUIManager.Instance.RemoveNewHero(hero.heroId);
        ForceRefreshLayout();
    }
    void ShowDeleteTip()
    {
        deleteTip.SetActive(false);
        if (hero != null && hero.Quality == 1 && HeroUIManager.Instance.IsTheSameHeroFullStar(hero.heroId))
        {
            deleteTip.SetActive(true);
        }
    }
    /// <summary>
    /// 强制刷新Layout,解决嵌套Layout和ContentSizeFitter的重叠问题
@@ -290,6 +342,17 @@
            return;
        lockImg.SetActive(hero.isLock);
        unLockImg.SetActive(!hero.isLock);
    }
    void RefreshItemEvent(PackType type, int index, int itemID)
    {
        if (type != PackType.Item)
            return;
        if (itemID != 7 && itemID != 8)
        {
            return;
        }
        RefreshAttr();
    }
    void RefreshHeroEvent(HeroInfo hero)
@@ -343,8 +406,24 @@
        //     SysNotifyMgr.Instance.ShowTip("UnlockHero");
        //     return;
        // }
        if (CanDelete())
        {
            HeroUIManager.Instance.jumpDeleteHeroGuid = guid;
        }
        else
        {
            HeroUIManager.Instance.jumpDeleteHeroGuid = "";
        }
        UIManager.Instance.OpenWindow<HeroDeleteWin>();
    }
    bool CanDelete()
    {
        if (hero.isActive)
            return false;
        return HeroUIManager.Instance.IsTheSameHeroFullStar(hero.heroId);
    }
    void RefreshStars()
@@ -423,7 +502,7 @@
        inheritAttrText[2].text = PlayerPropertyConfig.GetFullDescription(new Int2(PlayerPropertyConfig.inheritAttrs[2], hero.heroConfig.HPInheritPer));
        //上阵属性
        int valuePer = hero.GetOnBattleAddPer();
        int valuePer = hero.GetAddPer();
        for (int i = 0; i < heroAddAttrPerText.Length; i++)
        {
            heroAddAttrPerText[i].text = PlayerPropertyConfig.GetFullDescription(new Int2(PlayerPropertyConfig.basePerAttrs[i], valuePer));
@@ -435,18 +514,18 @@
        if (!HeroUIManager.Instance.IsLVMax(hero))
        {
            lvupBtnText.text = Language.Get("L1109");
            lvupMoneyIcon.SetActive(true);
            lvupMoneyText.SetActive(true);
            if (HeroUIManager.Instance.IsLVMaxByBreakLevel(hero))
            // if (HeroUIManager.Instance.IsLVMaxByBreakLevel(hero))
            // {
            //     lvupBtnText.text = Language.Get("L1111");
            //     var breakConfig = HeroQualityBreakConfig.GetQualityBreakConfig(hero.Quality, hero.breakLevel);
            //     lvupMoneyIcon.SetOrgSprite(ItemConfig.Get(breakConfig.UPCostItemList[0][0]).IconKey);
            //     lvupMoneyText.text = UIHelper.ShowUseItem(PackType.Item, breakConfig.UPCostItemList[0][0], breakConfig.UPCostItemList[0][1]);
            // }
            // else
            {
                lvupBtnText.text = Language.Get("L1111");
                var breakConfig = HeroQualityBreakConfig.GetQualityBreakConfig(hero.Quality, hero.breakLevel);
                lvupMoneyIcon.SetOrgSprite(ItemConfig.Get(breakConfig.UPCostItem[0]).IconKey);
                lvupMoneyText.text = UIHelper.ShowUseItem(PackType.Item, breakConfig.UPCostItem[0], breakConfig.UPCostItem[1]);
            }
            else
            {
                lvupBtnText.text = Language.Get("L1109");
                // lvupBtnText.text = Language.Get("L1109");
                var lvupConfig = HeroQualityLVConfig.GetQualityLVConfig(hero.Quality, hero.heroLevel);
                lvupMoneyIcon.SetOrgSprite(ItemConfig.Get(lvupConfig.UPCostItem[0]).IconKey);
                lvupMoneyText.text = UIHelper.ShowUseItem(PackType.Item, lvupConfig.UPCostItem[0], lvupConfig.UPCostItem[1]);
@@ -467,16 +546,16 @@
    {
        int itemID = 0;
        long needCount = 0;
        if (HeroUIManager.Instance.IsLVMaxByBreakLevel(hero))
        {
            //突破
            if (!UIManager.Instance.IsOpened<HeroLVBreakWin>())
            {
                HeroUIManager.Instance.selectHeroGuid = guid;
                UIManager.Instance.OpenWindow<HeroLVBreakWin>();
            }
        }
        else
        // if (HeroUIManager.Instance.IsLVMaxByBreakLevel(hero))
        // {
        //     //突破
        //     if (!UIManager.Instance.IsOpened<HeroLVBreakWin>())
        //     {
        //         HeroUIManager.Instance.selectHeroGuid = guid;
        //         UIManager.Instance.OpenWindow<HeroLVBreakWin>();
        //     }
        // }
        // else
        {
            //升级
            var lvupConfig = HeroQualityLVConfig.GetQualityLVConfig(hero.Quality, hero.heroLevel);
@@ -491,8 +570,8 @@
                lvupEffect.Play();
                var cell = RequestCell();
                cell.transform.localPosition = new Vector3(0, 0, 0);
                cell.Display(hero.qualityConfig.LVAddPer, ()=>
                {
                cell.Display(hero, () =>
                {
                    cell.SetActive(false);
                    ReturnCell(cell);
                });
@@ -507,7 +586,7 @@
    HeroTrainAddAttrCell RequestCell()
    {
        if (lvupAttrQueue.Count == 0)
        {
            return Instantiate(addPerObject, addPerParent);
@@ -569,13 +648,13 @@
            if (i < hero.breakLevel)
            {
                nameText.text = Language.Get("herocard63", i + 1);
                descText.text = string.Join(Language.Get("L1112"), attrStrArr);
                descText.text = string.Join("\n", attrStrArr);
            }
            else
            {
                //置灰
                nameText.text = UIHelper.AppendColor(TextColType.NavyGray, Language.Get("herocard63", i + 1));
                descText.text = UIHelper.AppendColor(TextColType.NavyGray, UIHelper.RemoveColor(string.Join(Language.Get("L1112"), attrStrArr)));
                descText.text = UIHelper.AppendColor(TextColType.NavyGray, UIHelper.RemoveColor(string.Join("\n", attrStrArr)));
            }
        }
@@ -711,7 +790,14 @@
            else if (type == 2)
            {
                var skill = SkillConfig.Get(config.SkillID);
                awakeStr = Language.Get("L1039", skill.SkillName) + skill.Description;
                if (skill != null)
                {
                    awakeStr = Language.Get("L1039", skill.SkillName) + skill.Description;
                }
                else
                {
                    Debug.LogError($"heroId:{hero.heroId} 觉醒技能ID:{config.SkillID} 配置错误技能不存在");
                }
            }
            else
            {
@@ -737,9 +823,9 @@
        }
    }
    void TeamPosChangeEvent(TeamType teamType)
    void TeamPosChangeEvent(int teamType)
    {
        if (teamType != TeamType.Story)
        if (teamType != TeamManager.Instance.GetMainTeamID())
            return;
        fightPowerText.text = UIHelper.ReplaceLargeArtNum(hero.CalculateFightPower());
    }
@@ -781,17 +867,42 @@
        redpointAwake.SetActive(false);
        redpointGift.SetActive(false);
        redpointLVUP.SetActive(false);
        if (!hero.IsInTeamByTeamType(TeamType.Story))
        {
            return;
        }
        trainMainRedImg.SetActive(false);
        breakMainRedImg.SetActive(false);
        redpointBreakLVUP.SetActive(false);
        var heroCnt = PackManager.Instance.GetItemCountByID(PackType.Hero, hero.heroId);
        var itemPack = PackManager.Instance.GetSinglePack(PackType.Item);
        if (heroCnt > 1 && hero.heroStar < hero.GetCurMaxStar())
        {
            redpointGift.SetActive(true);
            trainMainRedImg.SetActive(true);
        }
        if (!HeroUIManager.Instance.IsLVMax(hero))
        {
            var lvupConfig = HeroQualityLVConfig.GetQualityLVConfig(hero.Quality, hero.heroLevel);
            if (itemPack.GetCountById(lvupConfig.UPCostItem[0]) >= lvupConfig.UPCostItem[1])
            {
                redpointLVUP.SetActive(true);
                trainMainRedImg.SetActive(true);
            }
        }
        if (!hero.IsInTeamByTeamType(BattlePreSetType.Story))
        {
            return;
        }
        //5星后才能觉醒
        if (hero.heroStar >= HeroUIManager.Instance.starLevelCanAwake)
        if (hero.heroStar >= HeroUIManager.Instance.starLevelCanAwake && FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.HeroAwake))
        {
            //判断觉醒材料是否足够
            var maxAwakeLV = HeroAwakeConfig.GetMaxAwakeLV(hero.heroId);
@@ -801,37 +912,41 @@
                if (itemPack.GetCountById(config.UPCostItem[0]) >= config.UPCostItem[1])
                {
                    redpointAwake.SetActive(true);
                    trainMainRedImg.SetActive(true);
                }
            }
        }
        if (heroCnt > 1)
        if (HeroUIManager.Instance.IsCanBreak(hero))
        {
            redpointGift.SetActive(true);
            redpointBreakLVUP.SetActive(true);
            breakMainRedImg.SetActive(true);
        }
        var maxBreakLV = HeroBreakConfig.GetMaxBreakLv(hero.heroId);
        if (hero.breakLevel < maxBreakLV)
        {
            if (HeroUIManager.Instance.IsLVMaxByBreakLevel(hero))
            {
                var breakConfig = HeroQualityBreakConfig.GetQualityBreakConfig(hero.Quality, hero.breakLevel);
                if (itemPack.GetCountById(breakConfig.UPCostItem[0]) >= breakConfig.UPCostItem[1])
                {
                    redpointLVUP.SetActive(true);
                    return;
                }
                return;
            }
        }
    }
    #region 突破功能
        if (!HeroUIManager.Instance.IsLVMax(hero))
    void DisplayTrainOrBreak(HeroInfo hero)
    {
        //heroLVBreakCell;   //对应培养的 allAttrScroll  和 attrBtn
        if (functionOrder == 0)
        {
            var lvupConfig = HeroQualityLVConfig.GetQualityLVConfig(hero.Quality, hero.heroLevel);
            if (itemPack.GetCountById(lvupConfig.UPCostItem[0]) >= lvupConfig.UPCostItem[1])
            {
                redpointLVUP.SetActive(true);
            }
            heroLVBreakCell.SetActive(false);
            allAttrScroll.SetActive(true);
            attrBtn.SetActive(true);
            trainMainButton.SelectBtn();
        }
        else
        {
            heroLVBreakCell.SetActive(true);
            allAttrScroll.SetActive(false);
            attrBtn.SetActive(false);
            heroLVBreakCell.Display(hero);
            breakMainButton.SelectBtn();
        }
    }
    #endregion
}