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<int, long> attrDict;
|
ViewNPCManager manager { get { return ViewNPCManager.Instance; } }
|
protected override void InitComponent()
|
{
|
awakeCellList = new List<GameObject>();
|
potentialCellList = new List<GameObject>();
|
btnTotalAttr.SetListener(() =>
|
{
|
AttributeManager.Instance.OpenTotalAttributeWin(attrDict == null ? new Dictionary<int, long>() : 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<GameObject> 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<Text>();
|
var nameText = go.GetComponent<Text>("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<GameObject> 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<string> attrStrArr = new List<string>();
|
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<Text>();
|
var nameText = go.GetComponent<Text>("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<int, long> 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<HeroSkillWin>(heroID);
|
}, true);
|
angerSkillCell.Init(angerSkillID, () =>
|
{
|
UIManager.Instance.OpenWindow<HeroSkillWin>(heroID);
|
}, true);
|
}
|
|
/// <summary>
|
/// 强制刷新Layout,解决嵌套Layout和ContentSizeFitter的重叠问题
|
/// </summary>
|
async UniTask ForceRefreshLayout()
|
{
|
await UniTask.DelayFrame(2);
|
// 刷新所有Layout组件
|
var layouts = allAttrScroll.GetComponentsInChildren<LayoutGroup>(true);
|
foreach (var layout in layouts)
|
{
|
LayoutRebuilder.ForceRebuildLayoutImmediate(layout.GetComponent<RectTransform>());
|
}
|
await UniTask.DelayFrame(2);
|
// 刷新所有Layout组件
|
foreach (var layout in layouts)
|
{
|
LayoutRebuilder.ForceRebuildLayoutImmediate(layout.GetComponent<RectTransform>());
|
}
|
// Layout刷新完成后重新设置滚动位置
|
if (allAttrScroll != null)
|
allAttrScroll.verticalNormalizedPosition = 1f;
|
}
|
}
|