using System.Collections.Generic; using System.Linq; using Cysharp.Threading.Tasks; using UnityEngine; using UnityEngine.UI; public class OtherNPCDetailWin : UIBase { [SerializeField] RectTransform funcarea; [SerializeField] Transform bkImage1; [SerializeField] Transform bkImage2; [SerializeField] ImageEx bgImage; [SerializeField] ImageEx iconImage; [SerializeField] GameObject skill; [SerializeField] SkillBaseCell normalSkillCell; [SerializeField] SkillBaseCell angerSkillCell; [SerializeField] OtherNpcHeroCell heroShow; [SerializeField] ButtonEx btnTotalAttr; [SerializeField] TextEx[] attrs; [SerializeField] ScrollRect allAttrScroll; //培养属性 滚动区 [SerializeField] GameObject potential; [SerializeField] GameObject potentialCell; //潜能和觉醒用于创建 [SerializeField] Transform potentialCellParent; //潜能父节点 [SerializeField] Transform awakeCellParent; //潜能父节点 [SerializeField] GameObject awakeGo; Dictionary attrDict; ViewNPCManager manager { get { return ViewNPCManager.Instance; } } protected override void InitComponent() { awakeCellList = new List(); potentialCellList = new List(); btnTotalAttr.SetListener(() => { AttributeManager.Instance.OpenTotalAttributeWin(attrDict == null ? new Dictionary() : attrDict); }); } protected override void OnPreOpen() { // 重置所有滚动区到顶部 if (allAttrScroll != null) allAttrScroll.verticalNormalizedPosition = 1f; Display(); } protected override void OnPreClose() { } private bool IsSimple(ViewNPCAttr viewNPCAttr) { int heroID = (int)viewNPCAttr.HeroID; return !HeroBreakConfig.configDics.ContainsKey(heroID) && !HeroAwakeConfig.CanAwake(heroID, 1); } private void Display() { bgImage.SetSprite("OtherHeroDetailBGRed"); iconImage.SetSprite("OtherHeroDetailIconRed"); attrDict = manager?.viewNPCAttr?.AttrDict; DisplayByViewNPCAttr(); } void DisplayByViewNPCAttr() { ViewNPCAttr viewNPCAttr = manager.viewNPCAttr; if (viewNPCAttr == null) return; int heroID = (int)viewNPCAttr.HeroID; if (!HeroConfig.HasKey(heroID)) return; HeroConfig heroConfig = HeroConfig.Get(heroID); bool isSimple = IsSimple(viewNPCAttr); bkImage1.SetActive(!isSimple); bkImage2.SetActive(isSimple); funcarea.sizeDelta = new Vector2(funcarea.sizeDelta.x, isSimple ? 245 : 503); int skinID = heroConfig?.SkinIDList[0] ?? 0; int lv = viewNPCAttr.LV; int star = viewNPCAttr.Star; int quality = heroConfig.Quality; int breakLevel = viewNPCAttr.BreakLV; int awakeLevel = viewNPCAttr.AwakeLV; int atkSkillID = heroConfig.AtkSkillID; int angerSkillID = heroConfig.AngerSkillID; DisplaySkill(heroID, atkSkillID, angerSkillID); DisplayHeroShow(heroID, skinID, breakLevel, star, awakeLevel, lv); DisplayAttr(attrDict); DisplayPotential(heroID, breakLevel); RefreshAwake(heroID, quality, awakeLevel); ForceRefreshLayout(); } List awakeCellList; //觉醒 void RefreshAwake(int heroID, int quality, int awakeLevel) { if (!HeroAwakeConfig.CanAwake(heroID, 1)) { awakeGo.SetActive(false); return; } awakeGo.SetActive(true); var maxLV = HeroAwakeConfig.GetMaxAwakeLV(heroID); var starCnt = HeroQualityConfig.Get(quality).InitStarUpper; for (int i = 1; i <= maxLV; i++) { if (i > awakeCellList.Count) { awakeCellList.Add(Instantiate(potentialCell, awakeCellParent)); } var go = awakeCellList[i - 1]; var descText = go.GetComponent(); var nameText = go.GetComponent("skillname"); go.SetActive(true); var config = HeroAwakeConfig.GetHeroAwakeConfig(heroID, i); int type = config.UnlockTalentSlot != 0 ? 1 : config.SkillID != 0 ? 2 : 3; var awakeStr = string.Empty; if (type == 1) { starCnt += config.AddStarUpper; awakeStr = Language.Get("HeroAwake8", config.UnlockTalentSlot, starCnt); } else if (type == 2) { var skill = SkillConfig.Get(config.SkillID); if (skill != null) { awakeStr = Language.Get("L1039", skill.SkillName) + skill.Description; } else { Debug.LogError($"heroId:{heroID} 觉醒技能ID:{config.SkillID} 配置错误技能不存在"); } } else { for (int k = 0; k < config.AttrIDList.Length; k++) { awakeStr += (string.IsNullOrEmpty(config.SkillIName) ? string.Empty : Language.Get("L1039", config.SkillIName)) + PlayerPropertyConfig.GetFullDescription(config.AttrIDList[k], config.AttrValueList[k], "{0}+" + UIHelper.AppendColor(TextColType.Green, "{1}")) + (k == config.AttrIDList.Length - 1 ? "" : "\n"); } } if (i - 1 < awakeLevel) { nameText.text = Language.Get("herocard12", i) + Language.Get("L1096"); descText.text = awakeStr; } else { //置灰 nameText.text = UIHelper.AppendColor(TextColType.NavyGray, Language.Get("herocard12", i) + Language.Get("L1096")); descText.text = UIHelper.AppendColor(TextColType.NavyGray, UIHelper.RemoveColor(awakeStr)); } } } List potentialCellList; //潜能 void DisplayPotential(int heroID, int breakLevel) { if (!HeroBreakConfig.configDics.ContainsKey(heroID)) { potential.SetActive(false); return; } potential.SetActive(true); var list = HeroBreakConfig.configDics[heroID].Keys.ToList(); list.Sort(); for (int i = 0; i < list.Count; i++) { var nextQualityBreakConfig = HeroBreakConfig.GetHeroBreakConfig(heroID, i + 1); if (nextQualityBreakConfig == null) break; List attrStrArr = new List(); for (int j = 0; j < nextQualityBreakConfig.AttrIDList.Length; j++) { if (nextQualityBreakConfig.AttrIDList[j] == 0) continue; string format = i < breakLevel ? "{0}" + UIHelper.AppendColor(TextColType.Green, "+{1}") : "{0}+{1}"; attrStrArr.Add((string.IsNullOrEmpty(nextQualityBreakConfig.SkillIName) ? string.Empty : Language.Get("L1039", nextQualityBreakConfig.SkillIName)) + PlayerPropertyConfig.GetFullDescription(nextQualityBreakConfig.AttrIDList[j], nextQualityBreakConfig.AttrValueList[j], format)); } if (nextQualityBreakConfig.SkillID != 0) { var skill = SkillConfig.Get(nextQualityBreakConfig.SkillID); if (skill != null) { attrStrArr.Add(Language.Get("L1039", skill.SkillName) + skill.Description); } else { Debug.LogError("未配置技能" + nextQualityBreakConfig.SkillID); } } if (i >= potentialCellList.Count) { potentialCellList.Add(Instantiate(potentialCell, potentialCellParent)); } var go = potentialCellList[i]; var descText = go.GetComponent(); var nameText = go.GetComponent("skillname"); go.SetActive(true); if (i < breakLevel) { nameText.text = Language.Get("herocard63", i + 1); 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("\n", attrStrArr))); } } } private void DisplayAttr(Dictionary attrDict) { if (attrDict.IsNullOrEmpty()) return; var baseAttrIDList = PlayerPropertyConfig.playerPropertyDict[PlayerPropertyConfig.baseType]; var fightAttrIDList = PlayerPropertyConfig.playerPropertyDict[PlayerPropertyConfig.fightType]; var antiAttrIDList = PlayerPropertyConfig.playerPropertyDict[PlayerPropertyConfig.fightAntiType]; var totalAttrIDList = baseAttrIDList.Concat(fightAttrIDList).Concat(antiAttrIDList).ToList(); for (int i = 0; i < attrs.Length; i++) { if (i < totalAttrIDList.Count) { attrs[i].SetActive(true); int attrId = totalAttrIDList[i]; if (PlayerPropertyConfig.HasKey(attrId)) { PlayerPropertyConfig config = PlayerPropertyConfig.Get(attrId); long attrValue = attrDict.ContainsKey(attrId) ? attrDict[attrId] : 0; attrs[i].text = Language.Get("OtherPlayerDetail15", config.Name, PlayerPropertyConfig.GetValueDescription(attrId, attrValue)); } else { attrs[i].SetActive(false); } } else { attrs[i].SetActive(false); } } } private void DisplayHeroShow(int heroID, int skinID, int breakLevel, int star, int awakeLevel, int lv) { heroShow.Init(heroID, skinID, breakLevel, star, awakeLevel, lv); } private void DisplaySkill(int heroID, int atkSkillID, int angerSkillID) { if (!HeroConfig.HasKey(heroID) || !SkillConfig.HasKey(atkSkillID) || !SkillConfig.HasKey(angerSkillID)) { skill.SetActive(false); return; } SkillConfig atkSkillIDConfig = SkillConfig.Get(atkSkillID); SkillConfig angerSkillIDConfig = SkillConfig.Get(angerSkillID); //没有技能图标也不显示技能 if (string.IsNullOrEmpty(atkSkillIDConfig.IconName) || string.IsNullOrEmpty(angerSkillIDConfig.IconName)) { skill.SetActive(false); return; } skill.SetActive(true); normalSkillCell.Init(atkSkillID, () => { UIManager.Instance.OpenWindow(heroID); }, true); angerSkillCell.Init(angerSkillID, () => { UIManager.Instance.OpenWindow(heroID); }, true); } /// /// 强制刷新Layout,解决嵌套Layout和ContentSizeFitter的重叠问题 /// async UniTask ForceRefreshLayout() { await UniTask.DelayFrame(2); // 刷新所有Layout组件 var layouts = allAttrScroll.GetComponentsInChildren(true); foreach (var layout in layouts) { LayoutRebuilder.ForceRebuildLayoutImmediate(layout.GetComponent()); } await UniTask.DelayFrame(2); // 刷新所有Layout组件 foreach (var layout in layouts) { LayoutRebuilder.ForceRebuildLayoutImmediate(layout.GetComponent()); } // Layout刷新完成后重新设置滚动位置 if (allAttrScroll != null) allAttrScroll.verticalNormalizedPosition = 1f; } }