Main/System/Arena/ArenaBattleFailWin.cs
@@ -71,6 +71,11 @@ PlayerDatas.Instance.baseData.face, PlayerDatas.Instance.baseData.facePic)); enemyAvatarCell.InitUI(AvatarHelper.GetAvatarModel((int)tagPlayerID, (int)enemyFace, (int)enemyFacePic)); enemyAvatarCell.SetListener(() => { AvatarHelper.TryViewOtherPlayerInfo((int)tagPlayerID, viewPlayerLineupType: (int)ViewPlayerLineupType.ArenaDef); }); txtMyName.text = PlayerDatas.Instance.baseData.PlayerName; txtEnemyName.text = UIHelper.ServerStringTrim(info.PlayerName); txtMyScore.text = Language.Get("Arena17", atkAddScore); Main/System/Arena/ArenaBattleVictoryWin.cs
@@ -16,7 +16,7 @@ [SerializeField] ButtonEx detailBtn; JsonData jsonData; string battleName = BattleConst.ArenaBattleField; protected override void InitComponent() { detailBtn.SetListener(() => @@ -65,6 +65,11 @@ PlayerDatas.Instance.baseData.face, PlayerDatas.Instance.baseData.facePic)); enemyAvatarCell.InitUI(AvatarHelper.GetAvatarModel((int)tagPlayerID, (int)enemyFace, (int)enemyFacePic)); enemyAvatarCell.SetListener(() => { AvatarHelper.TryViewOtherPlayerInfo((int)tagPlayerID, viewPlayerLineupType: (int)ViewPlayerLineupType.ArenaDef); }); txtMyName.text = PlayerDatas.Instance.baseData.PlayerName; txtEnemyName.text = UIHelper.ServerStringTrim(info.PlayerName); txtMyScore.text = Language.Get("Arena17", atkAddScore); Main/System/Arena/ArenaChallengeCell.cs
@@ -33,6 +33,11 @@ arenaMatchInfo = list[index]; avatarCell.InitUI(AvatarHelper.GetAvatarModel((int)arenaMatchInfo.PlayerID, (int)arenaMatchInfo.Face, (int)arenaMatchInfo.FacePic)); avatarCell.SetListener(() => { AvatarHelper.TryViewOtherPlayerInfo((int)arenaMatchInfo.PlayerID, viewPlayerLineupType: (int)ViewPlayerLineupType.ArenaDef); }); txtName.text = UIHelper.ServerStringTrim(arenaMatchInfo.PlayerName); txtFightPoint.text = UIHelper.ReplaceLargeArtNum(arenaMatchInfo.FightPower); txtAddScore.text = Language.Get("Arena16", ArenaManager.Instance.GetChallengePoints(index)); Main/System/Arena/ArenaPlayerRankCell.cs
@@ -15,6 +15,7 @@ public void Display(int rankType, int rank, string valueFormat) { RankData rankData = null; int viewPlayerId = (int)PlayerDatas.Instance.baseData.PlayerID; if (rank != 0) { rankData = RankModel.Instance.GetRankDataByRank(rankType, rank); @@ -45,10 +46,15 @@ } else { viewPlayerId = (int)rankData.id; officialTitleCell.SetActive(true); officialTitleCell.InitUI((int)rankData.value1, (int)rankData.value2); avatarCell.SetActive(true); avatarCell.InitUI(AvatarHelper.GetAvatarModel((int)rankData.id, (int)rankData.value3, (int)rankData.value4)); avatarCell.SetListener(() => { AvatarHelper.TryViewOtherPlayerInfo((int)rankData.id, viewPlayerLineupType: (int)ViewPlayerLineupType.ArenaDef); }); nameText.text = rankData.name1; rankValueText.text = string.Format(valueFormat, UIHelper.ReplaceLargeNum(rankData.cmpValue)); } @@ -58,7 +64,7 @@ { queryPlayerBtn.AddListener(() => { AvatarHelper.TryViewOtherPlayerInfo(viewPlayerId, viewPlayerLineupType: (int)ViewPlayerLineupType.ArenaDef); }); } } Main/System/Arena/ArenaPlayerTop3Cell.cs
@@ -25,6 +25,10 @@ nameText.text = rankData.name1; officialTitleCell.InitUI((int)rankData.value1, (int)rankData.value2); model.Create(HorseManager.Instance.GetOtherPlayerHorseSkinID((int)rankData.value6), (int)rankData.value5, 1); queryPlayerBtn.SetListener(() => { AvatarHelper.TryViewOtherPlayerInfo((int)rankData.id, viewPlayerLineupType: (int)ViewPlayerLineupType.ArenaDef); }); } Main/System/Arena/ArenaRecordCell.cs
@@ -65,6 +65,10 @@ } avatarCell.InitUI(AvatarHelper.GetAvatarModel((int)arenaGameRec.Value3, (int)arenaGameRec.Value5, (int)arenaGameRec.Value6)); avatarCell.SetListener(() => { AvatarHelper.TryViewOtherPlayerInfo((int)arenaGameRec.Value3, viewPlayerLineupType: (int)ViewPlayerLineupType.ArenaDef); }); txtName.text = arenaGameRec.Name; txtFightPoint.text = UIHelper.ReplaceLargeArtNum(arenaGameRec.FightPower); officialTitleCell.InitUI(PlayerDatas.Instance.baseData.realmLevel, PlayerDatas.Instance.baseData.TitleID); Main/System/Battle/ArenaBattleWin.cs
@@ -188,7 +188,10 @@ txtEnemyName.text = UIHelper.ServerStringTrim(info.PlayerName); txtEnemyFightPonit.text = UIHelper.ReplaceLargeArtNum(info.FightPower); enemyAvatarCell.InitUI(AvatarHelper.GetAvatarModel((int)info.PlayerID, (int)info.Face, (int)info.FacePic)); enemyAvatarCell.SetListener(() => { AvatarHelper.TryViewOtherPlayerInfo((int)info.PlayerID, viewPlayerLineupType: (int)ViewPlayerLineupType.ArenaDef); }); var team = GetTeamHeroList(enemyTeam); enemyCountry.RefreshOnTeamCountry(team, true); Main/System/BillboardRank/PlayerRankCell.cs
@@ -13,12 +13,13 @@ [SerializeField] Text rankValueText; //排名比较内容 [SerializeField] Text nameText; [SerializeField] OfficialTitleCell officialTitleCell; [SerializeField] Button queryPlayerBtn; //后续添加点击查看玩家详情 // rank 为0 代表玩家自己 public void Display(int rankType, int rank) { RankData rankData = null; int viewPlayerId = (int)PlayerDatas.Instance.baseData.PlayerID; if (rank != 0) { rankData = RankModel.Instance.GetRankDataByRank(rankType, rank); @@ -53,12 +54,19 @@ officialTitleCell.InitUI((int)rankData.value1, (int)rankData.value2); avatarCell.SetActive(true); avatarCell.InitUI(AvatarHelper.GetAvatarModel((int)rankData.id, (int)rankData.value3, (int)rankData.value4)); viewPlayerId = (int)rankData.id; nameText.text = rankData.name1; rankValueText.text = RankModel.Instance.GetCmpValueStr(rankType, rankData.cmpValue); ; } rankText.text = rank.ToString(); if (queryPlayerBtn != null) { queryPlayerBtn.AddListener(() => { AvatarHelper.TryViewOtherPlayerInfo(viewPlayerId); }); } } } Main/System/BillboardRank/PlayerTop3Cell.cs
@@ -11,6 +11,7 @@ [SerializeField] Text rankValueText; //排名比较内容 [SerializeField] Text nameText; [SerializeField] OfficialTitleCell officialTitleCell; [SerializeField] Button queryPlayerBtn; //后续添加点击查看玩家详情 [SerializeField] HorseController model; public void Display(int rankType, int rank) @@ -29,6 +30,10 @@ nameText.text = rankData.name1; officialTitleCell.InitUI((int)rankData.value1, (int)rankData.value2); model.Create(HorseManager.Instance.GetOtherPlayerHorseSkinID((int)rankData.value6), (int)rankData.value5, rank == 1 ? 1f : 0.8f); queryPlayerBtn.SetListener(() => { AvatarHelper.TryViewOtherPlayerInfo((int)rankData.id); }); } Main/System/Chat/ChatPlayerMineCell.cs
@@ -23,10 +23,6 @@ avatarCell.InitUI(AvatarHelper.GetAvatarModel((int)PlayerDatas.Instance.baseData.PlayerID, PlayerDatas.Instance.baseData.face, PlayerDatas.Instance.baseData.facePic)); avatarCell.button.SetListener(() => { }); title.InitUI(PlayerDatas.Instance.baseData.realmLevel, PlayerDatas.Instance.baseData.TitleID); if (manager.nowChatTab == ChatTab.World) Main/System/Chat/ChatPlayerOtherCell.cs
@@ -22,10 +22,7 @@ TalkData data = hasNewPlayerInfo ? newPlayerInfo : nowData; avatarCell.InitUI(AvatarHelper.GetAvatarModel((int)data.PlayerID, (int)data.Face, (int)data.FacePic, data.Job)); avatarCell.button.SetListener(() => { }); title.InitUI(data.RealmLV, (int)data.TitleID); int bubbleID = ChatBubbleHelper.GetOtherChatBubbleID(data.Job, (int)data.BubbleBox); m_ChatBubble.DisplayBubble(bubbleID, (int)data.PlayerID); Main/System/Guild/GuildManager.cs
@@ -68,12 +68,12 @@ void OnPlayerLoginOk() { UpdateDonateRedPoint(); } void PlayerDataRefreshEvent(PlayerDataType type) { if(type == PlayerDataType.default33) if (type == PlayerDataType.default33) { UpdateDonateRedPoint(); } @@ -93,7 +93,7 @@ familyZBGActions.Clear(); sortPlayerCut.Clear(); } //退出公会 public void AfterQuitGuild() { @@ -107,7 +107,7 @@ // zhenbaogeCutState = 0; // familyZBGActions.Clear(); // sortPlayerCut.Clear(); UpdateZBGRedpoint(); UpdateDonateRedPoint(); EnterOrQuitGuildEvent?.Invoke(false); @@ -154,7 +154,7 @@ public int renameFairyNameMoneyType; //珍宝阁(行商) public int zhenbaogeCutState = 0; @@ -163,7 +163,7 @@ public event Action UpdateZhenbaogeEvent; public bool isQueryZBGYet = false; public float lastZBGStartTime = 0; //过天刷新用 //{id:数据} 砍价行为,value1为玩家ID,特殊约定为1时为家族的数据 public Dictionary<int, HA513_tagMCFamilyActionInfo.tagMCFamilyAction> familyZBGActions = new Dictionary<int, HA513_tagMCFamilyActionInfo.tagMCFamilyAction>(); public List<int> sortPlayerCut = new List<int>(); @@ -567,6 +567,21 @@ GameNetSystem.Instance.SendInfo(pack); } public void SendFindGuildNoDecrypt(string msg, int pageIndex = 0, int pageSize = 20) { if (pageIndex == 0) { //默认查询第一页即代表重新开始查询,清空之前的数据 guildsDict.Clear(); pageIndexList.Clear(); } var pack = new CA620_tagCMViewFamilyPage(); pack.Msg = msg; pack.MsgLen = (byte)msg.Length; pack.PageIndex = (byte)pageIndex; pack.ShowCount = (byte)pageSize; GameNetSystem.Instance.SendInfo(pack); } public static void SetFairyViewData(FairyData data, HA523_tagMCFamilyViewList.tagMCFamilyView view) { @@ -804,7 +819,7 @@ #endregion #region 珍宝阁 public void UpdateZhenbaogeInfo(HA512_tagMCFamilyZhenbaogeInfo netPack) { @@ -913,7 +928,7 @@ } public Dictionary <int, FairyMember> tmpNoCutMembers = new Dictionary<int, FairyMember>(); public Dictionary<int, FairyMember> tmpNoCutMembers = new Dictionary<int, FairyMember>(); //未议价成员 public void CalcNoCutMembers() @@ -925,7 +940,7 @@ return; } foreach(var playerID in fairy.memberIDList) foreach (var playerID in fairy.memberIDList) { if (!familyZBGActions.ContainsKey(playerID)) { @@ -938,7 +953,7 @@ #region 红点 Redpoint donateRedpoint = new Redpoint(MainRedDot.guildHallRedpointID, MainRedDot.donateRedpointID); //珍宝阁(行商) Redpoint zbgRedpoint = new Redpoint(MainRedDot.MainGuildRedpoint, MainRedDot.hawkerRedpointID); @@ -972,7 +987,7 @@ } } } public void UpdateZBGRedpoint() { zbgRedpoint.state = RedPointState.None; Main/System/Guild/GuildMemberCell.cs
@@ -47,7 +47,7 @@ fightPowerText.text = UIHelper.ReplaceLargeArtNum(playerInfo.FightPower); avatarCell.button.AddListener(() => avatarCell.AddListener(() => { OtherPlayerDetailManager.Instance.ViewPlayerDetail(playerID); }); Main/System/Guild/GuildPreviewWin.cs
@@ -45,7 +45,7 @@ SysNotifyMgr.Instance.ShowTip("GuildSys8"); }); leaderAvatar.button.AddListener(() => leaderAvatar.AddListener(() => { OtherPlayerDetailManager.Instance.ViewPlayerDetail(leaderID); }); Main/System/Main/MainWin.cs
@@ -40,7 +40,7 @@ { base.InitComponent(); avatarCell.redpoint.redpointId = MainRedDot.PhantasmPavilionRepoint; avatarCell.button.SetListener(() => avatarCell.SetListener(() => { UIManager.Instance.OpenWindow<PlayerProfileWin>(); }); Main/System/OtherPlayerDetail.meta
File was renamed from Main/System/RoleParticulars.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 guid: 7f4be2a6d73bb8c40b77b85620ca4026 guid: 776fe4907b83bde4eb75533ee79ae268 folderAsset: yes DefaultImporter: externalObjects: {} Main/System/OtherPlayerDetail/OtherEquipCardItem.cs
New file @@ -0,0 +1,60 @@ using UnityEngine; using UnityEngine.UI; public class OtherEquipCardItem : MonoBehaviour { [SerializeField] Button btnClick; [SerializeField] Image imgQuality; //装备的底图,不同品质颜色 [SerializeField] Image imgNull; //空装备的部位图标 [SerializeField] Image imgIcon; //装备图标 [SerializeField] UIEffectPlayer uiEffect; [SerializeField] Text txtLv; OtherPlayerDetailManager manager { get { return OtherPlayerDetailManager.Instance; } } public void Display(OtherPlayerDetailManager.RolePlusData.EquipData equip) { if (equip == null || !ItemConfig.HasKey(equip.ItemID)) { imgQuality.SetSprite("equipQuality0"); imgNull.SetActive(true); imgIcon.SetActive(false); uiEffect.Stop(); txtLv.text = string.Empty; return; } ItemConfig config = ItemConfig.Get(equip.ItemID); imgNull.SetActive(false); imgIcon.SetActive(true); imgQuality.SetSprite("equipQuality" + config.ItemColor); imgIcon.SetOrgSprite(config.IconKey); txtLv.text = Language.Get("L1113", manager.GetEquipLV(equip)); if (config.ItemColor >= 7) { uiEffect.effectId = 1026; uiEffect.PlayByArrIndex(config.ItemColor - 7, true, true); } else { uiEffect.Stop(); } // //特效参考尺寸106*150 同比例缩放 var rect = this.transform.GetComponent<RectTransform>(); uiEffect.transform.localScale = new Vector3(rect.sizeDelta.x / 106f, rect.sizeDelta.y / 150f, 1); btnClick.SetListener(() => { manager.equip = equip; if (!UIManager.Instance.IsOpened<OtherEquipTipWin>()) { UIManager.Instance.OpenWindow<OtherEquipTipWin>(); } }); } } Main/System/OtherPlayerDetail/OtherEquipCardItem.cs.meta
New file @@ -0,0 +1,11 @@ fileFormatVersion: 2 guid: fc508978e84be984fafbe320e2dd0f8d MonoImporter: externalObjects: {} serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: assetBundleName: assetBundleVariant: Main/System/OtherPlayerDetail/OtherEquipTipWin.cs
New file @@ -0,0 +1,141 @@ using System; using System.Collections.Generic; using Cysharp.Threading.Tasks; using UnityEngine; using UnityEngine.UI; //装备TIP界面 public class OtherEquipTipWin : UIBase { [SerializeField] Image equipImage; [SerializeField] Text itemName; [SerializeField] OutlineEx itemNameOutline; [SerializeField] Text qualityName; [SerializeField] OutlineEx qualityNameOutline; [SerializeField] Text placeName; [SerializeField] Text lvText; [SerializeField] Image bgFlower; //背景花纹变色 [SerializeField] List<Text> baseAttrNames; [SerializeField] List<Text> baseAttrValues; [SerializeField] GameObject fightAttrGameObj; [SerializeField] List<GameObject> fightAttrLine; [SerializeField] List<Text> fightAttrNames; [SerializeField] List<Text> fightAttrValues; [SerializeField] UIEffectPlayer uieffect; [SerializeField] RectTransform bgRect; int equipID; ItemConfig itemConfig; OtherPlayerDetailManager.RolePlusData.EquipData equip; OtherPlayerDetailManager manager { get { return OtherPlayerDetailManager.Instance; } } protected override void OnPreOpen() { equip = manager.equip; if (equip == null) { DelayCloseWindow().Forget(); return; } equipID = equip.ItemID; if (!ItemConfig.HasKey(equipID)) { DelayCloseWindow().Forget(); return; } itemConfig = ItemConfig.Get(equipID); Display(itemConfig); } protected override void OnOpen() { //先缩小,这样不会因为间隔帧产生明显的闪烁 uieffect.transform.localScale = Vector3.zero; //特效显示依赖rect的排版,放在下一帧 RefreshEffect(itemConfig.ItemColor).Forget(); } protected override void OnPreClose() { } public void Display(ItemConfig config) { equipImage.SetOrgSprite(config.IconKey); itemName.text = UIHelper.AppendColor(config.ItemColor, config.ItemName, true, 1); itemNameOutline.OutlineColor = UIHelper.GetUIOutlineColor(config.ItemColor); qualityName.text = UIHelper.GetQualityNameWithColor(config.ItemColor, Language.Get("L1039")); qualityNameOutline.OutlineColor = UIHelper.GetUIOutlineColor(config.ItemColor); placeName.text = EquipModel.Instance.GetEquipPlaceName(config.EquipPlace); lvText.text = Language.Get("EquipExchangeWin7", manager.GetEquipLV(equip)); bgFlower.color = UIHelper.GetUIColor(config.ItemColor); var baseAttrs = manager.GetEquipBaseAttrs(equip); var baseValues = manager.GetEquipBaseValues(equip); var fightAttrs = manager.GetEquipFightAttrs(equip); var fightValues = manager.GetEquipFightValues(equip); for (var i = 0; i < baseAttrNames.Count; i++) { if (i >= baseAttrs.Count) { baseAttrNames[i].text = ""; baseAttrValues[i].text = ""; } else { baseAttrNames[i].text = PlayerPropertyConfig.Get(baseAttrs[i]).Name; baseAttrValues[i].text = PlayerPropertyConfig.GetValueDescription(baseAttrs[i], baseValues[i]); } } if (fightAttrs.IsNullOrEmpty()) { fightAttrGameObj.SetActive(false); } else { fightAttrGameObj.SetActive(true); for (var i = 0; i < fightAttrNames.Count; i++) { if (i >= fightAttrs.Count) { fightAttrNames[i].SetActive(false); } else { fightAttrNames[i].SetActive(true); fightAttrNames[i].text = PlayerPropertyConfig.Get(fightAttrs[i]).Name; fightAttrValues[i].text = PlayerPropertyConfig.GetValueDescription(fightAttrs[i], fightValues[i]); } } } } //延迟处理特效大小 async UniTask RefreshEffect(int itemColor) { await UniTask.DelayFrame(3); int effectID = EquipModel.Instance.equipUIEffects[Math.Min(itemColor, EquipModel.Instance.equipUIEffects.Length) - 1]; if (effectID == 0) { uieffect.Stop(); } else { uieffect.effectId = effectID; //计算高度缩放比例 特效显示依赖rect的排版 uieffect.transform.localScale = new Vector3(0.98f, bgRect.rect.height / uieffect.GetComponent<RectTransform>().rect.height, 1); uieffect.Play(); } } } Main/System/OtherPlayerDetail/OtherEquipTipWin.cs.meta
New file @@ -0,0 +1,11 @@ fileFormatVersion: 2 guid: b22e83cf6038bb54c9b27407690ace89 MonoImporter: externalObjects: {} serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: assetBundleName: assetBundleVariant: Main/System/OtherPlayerDetail/OtherHeroDetailWin.cs
New file @@ -0,0 +1,386 @@ using System.Collections.Generic; using System.Linq; using Cysharp.Threading.Tasks; using UnityEngine; using UnityEngine.UI; public class OtherHeroDetailWin : UIBase { [SerializeField] SkillBaseCell normalSkillCell; [SerializeField] SkillBaseCell angerSkillCell; [SerializeField] HeroShowBaseCell heroShow; [SerializeField] ButtonEx btnTotalAttr; [SerializeField] TextEx[] attrs; [SerializeField] GiftBaseCell[] giftBaseCells; //天赋 [SerializeField] ScrollRect allAttrScroll; //培养属性 滚动区 [SerializeField] GameObject fetterGo; [SerializeField] Text[] fetterText; //羁绊 [SerializeField] Text[] fetterNameText; //羁绊 [SerializeField] GameObject potential; [SerializeField] GameObject potentialCell; //潜能和觉醒用于创建 [SerializeField] Transform potentialCellParent; //潜能父节点 [SerializeField] Transform awakeCellParent; //潜能父节点 [SerializeField] GameObject awakeGo; OtherPlayerDetailManager.RolePlusData.HeroData heroData; List<OtherPlayerDetailManager.RolePlusData.HeroData> heroDatas; Dictionary<int, long> attrDict; OtherPlayerDetailManager manager { get { return OtherPlayerDetailManager.Instance; } } protected override void InitComponent() { awakeCellList = new List<GameObject>(); potentialCellList = new List<GameObject>(); btnTotalAttr.SetListener(() => { AttributeManager.Instance.OpenTotalAttributeWin(attrDict); }); } protected override void OnPreOpen() { // 重置所有滚动区到顶部 if (allAttrScroll != null) { allAttrScroll.verticalNormalizedPosition = 1f; } heroData = manager.heroData; heroDatas = manager.heroDatas; attrDict = heroData.AttrDict; Display(); } protected override void OnPreClose() { } private void Display() { if (heroDatas.IsNullOrEmpty() || heroData == null) { return; } int heroID = heroData.HeroID; if (!HeroConfig.HasKey(heroID)) { return; } HeroConfig heroConfig = HeroConfig.Get(heroID); int skinID = heroData.SkinID; int lv = heroData.LV; int star = heroData.Star; int quality = heroConfig.Quality; int breakLevel = manager.GetBreakLevel(heroData); int awakeLevel = manager.GetAwakeLevel(heroData); int atkSkillID = heroConfig.AtkSkillID; int angerSkillID = heroConfig.AngerSkillID; List<int> talentIDList = manager.GetTalentIDList(heroData); List<int> talentLvList = manager.GetTalentLvList(heroData); int[] FetterIDList = heroConfig.FetterIDList; DisplaySkill(heroID, atkSkillID, angerSkillID); DisplayHeroShow(heroID, skinID, breakLevel, star, awakeLevel, lv); DisplayAttr(heroData); DisplayGiftBaseCell(heroID, awakeLevel, talentIDList, talentLvList); DisplayFetter(heroDatas, FetterIDList); 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)) return; 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(OtherPlayerDetailManager.RolePlusData.HeroData heroData) { if (heroData == null || heroData.AttrDict == null) { return; } var attrDict = heroData.AttrDict; var baseAttrIDList = PlayerPropertyConfig.playerPropertyDict[PlayerPropertyConfig.baseType]; var fightAttrIDList = PlayerPropertyConfig.playerPropertyDict[PlayerPropertyConfig.fightType]; var totalAttrIDList = baseAttrIDList.Concat(fightAttrIDList).ToList(); for (int i = 0; i < attrs.Length; i++) { if (i < totalAttrIDList.Count) { attrs[i].SetActive(true); int attrId = totalAttrIDList[i]; long attrValue = attrDict.ContainsKey(attrId) ? attrDict[attrId] : 0; attrs[i].text = PlayerPropertyConfig.GetFullDescription(attrId, attrValue); } else { attrs[i].SetActive(false); } } } private bool HasFetterHero(List<OtherPlayerDetailManager.RolePlusData.HeroData> heroDatas, int heroID) { if (heroDatas.IsNullOrEmpty()) { return false; } for (int i = 0; i < heroDatas.Count; i++) { if (heroDatas[i].HeroID == heroID) { return true; } } return false; } private void DisplayFetter(List<OtherPlayerDetailManager.RolePlusData.HeroData> heroDatas, int[] FetterIDList) { if (FetterIDList.IsNullOrEmpty() || heroDatas.IsNullOrEmpty()) { fetterGo.SetActive(false); return; } for (int i = 0; i < fetterText.Length; i++) { if (i < FetterIDList.Length) { fetterText[i].SetActive(true); var fetterID = FetterIDList[i]; HeroFetterConfig fetterConfig = HeroFetterConfig.Get(fetterID); List<string> heroNames = new List<string>(); bool isAllCollect = true; //是否全收集 foreach (var tmpHeroID in fetterConfig.HeroIDList) { heroNames.Add(HeroConfig.Get(tmpHeroID).Name); bool hasFetterHero = HasFetterHero(heroDatas, tmpHeroID); if (!hasFetterHero) { isAllCollect = false; } } fetterGo.SetActive(isAllCollect); var attrStr = string.Join(Language.Get("SplitString1"), heroNames) + Language.Get("herocard38"); for (int j = 0; j < fetterConfig.AttrIDList.Length; j++) { string format = !isAllCollect ? "{0}+{1}" : "{0}+" + UIHelper.AppendColor(TextColType.Green, "{1}"); attrStr += Language.Get("L1112") + PlayerPropertyConfig.GetFullDescription(fetterConfig.AttrIDList[j], fetterConfig.AttrValueList[j], format); } fetterText[i].text = attrStr; fetterText[i].color = UIHelper.GetUIColor(isAllCollect ? TextColType.NavyBrown : TextColType.NavyGray); fetterNameText[i].text = fetterConfig.FetterName; fetterNameText[i].color = UIHelper.GetUIColor(isAllCollect ? TextColType.NavyBrown : TextColType.NavyGray); } else { fetterText[i].SetActive(false); } } } private void DisplayGiftBaseCell(int heroID, int awakeLevel, List<int> talentIDList, List<int> talentLvList) { if (talentIDList == null || talentLvList == null) { return; } int showCount = HeroUIManager.Instance.GetGiftGirdMaxCount(heroID); for (int i = 0; i < giftBaseCells.Length; i++) { if (i >= showCount) { giftBaseCells[i].SetActive(false); continue; } giftBaseCells[i].SetActive(true); if (i < talentIDList.Count) { int giftID = talentIDList[i]; int giftLV = talentLvList[i]; int state = 0; //0:不显示 1:新增 2:提升 giftBaseCells[i].Init(giftID, giftLV, state, heroID, i, awakeLevel); } else { //非对比的显示 if (i < HeroUIManager.Instance.normalGiftMaxCnt) { giftBaseCells[i].Init(0, 0); } else { giftBaseCells[i].Init(-1, 0, 0, heroID, i); } } } } 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) { 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>()); } } } Main/System/OtherPlayerDetail/OtherHeroDetailWin.cs.meta
New file @@ -0,0 +1,11 @@ fileFormatVersion: 2 guid: f7e36dee1de95fc478795e453dcde29a MonoImporter: externalObjects: {} serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: assetBundleName: assetBundleVariant: Main/System/OtherPlayerDetail/OtherHeroFightingCardItem.cs
New file @@ -0,0 +1,96 @@ using UnityEngine; using UnityEngine.UI; using System.Collections.Generic; public class OtherHeroFightingCardItem : MonoBehaviour { [SerializeField] Button btnClick; [SerializeField] Image imgQuality; [SerializeField] Image imgHero; [SerializeField] Text txtLv; [SerializeField] Image imgCountry; [SerializeField] Transform rectStar; [SerializeField] List<Image> imgStars; OtherPlayerDetailManager.RolePlusData.HeroData heroData; List<OtherPlayerDetailManager.RolePlusData.HeroData> heros; OtherPlayerDetailManager manager { get { return OtherPlayerDetailManager.Instance; } } public void Display(int index, List<OtherPlayerDetailManager.RolePlusData.HeroData> heros) { this.heros = heros; if (heros.IsNullOrEmpty() || index < 0 || index >= heros.Count) { return; } heroData = heros[index]; var heroID = heroData.HeroID; if (!HeroConfig.HasKey(heroID)) { return; } var heroConfig = HeroConfig.Get(heroID); imgQuality.SetSprite("herocBG" + heroConfig.Quality); imgCountry.SetSprite(HeroUIManager.Instance.GetCountryIconName(heroConfig.Country)); txtLv.text = heroData.LV == 0 ? "" : Language.Get("L1094") + heroData.LV; DisplayHero(heroData); DisplayStars(heroData); btnClick.SetListener(ClickHero); } void DisplayHero(OtherPlayerDetailManager.RolePlusData.HeroData heroData) { var sprite = UILoader.LoadSprite("HeroHead", HeroSkinConfig.Get(heroData.SkinID).RectangleIcon); if (sprite == null) { // 内网未配置时 imgHero.SetSprite("herohead_big_default"); } else { imgHero.overrideSprite = sprite; } } void DisplayStars(OtherPlayerDetailManager.RolePlusData.HeroData heroData) { var star = heroData.Star; if (star == 0) { rectStar.SetActive(false); } else { rectStar.SetActive(true); for (int i = 0; i < imgStars.Count; i++) { if ((star - 1) % imgStars.Count >= i) { imgStars[i].SetActive(true); imgStars[i].SetSprite("herostar" + (((star - 1) / imgStars.Count) + 1) * imgStars.Count); } else { imgStars[i].SetActive(false); } } } } void ClickHero() { if (heroData == null) { return; } manager.heroData = heroData; manager.heroDatas = heros; if (!UIManager.Instance.IsOpened<OtherHeroDetailWin>()) { UIManager.Instance.OpenWindow<OtherHeroDetailWin>(); } } } Main/System/OtherPlayerDetail/OtherHeroFightingCardItem.cs.meta
New file @@ -0,0 +1,11 @@ fileFormatVersion: 2 guid: 9d90695eaf6736e418297ded40202c00 MonoImporter: externalObjects: {} serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: assetBundleName: assetBundleVariant: Main/System/OtherPlayerDetail/OtherPlayerDetailManager.cs
New file @@ -0,0 +1,541 @@ using System; using System.Collections.Generic; using UnityEngine; using LitJson; using System.Linq; //查看其他玩家的简短信息, 该模块处理数据,其他由各自功能模块处理 通过OnRevPackage public class OtherPlayerDetailManager : GameSystemManager<OtherPlayerDetailManager> { public override void Init() { DTC0102_tagCDBPlayer.beforePlayerDataInitializeEventOnRelogin += OnBeforePlayerDataInitializeEventOnRelogin; } public override void Release() { DTC0102_tagCDBPlayer.beforePlayerDataInitializeEventOnRelogin -= OnBeforePlayerDataInitializeEventOnRelogin; } public void OnBeforePlayerDataInitializeEventOnRelogin() { viewPlayerType = -1; viewPlayerLineupType = -1; } public int viewPlayer { get; private set; } // 查询类型:根据类型做不同处理 // 按功能自定义枚举值 EnumHelper的 ViewPlayerType public int viewPlayerType { get; private set; } public int viewPlayerLineupType { get; private set; } public RolePlusData.HeroData heroData; public List<RolePlusData.HeroData> heroDatas; public RolePlusData.EquipData equip; private Dictionary<int, ViewPlayerData> viewPlayerDataDic = new Dictionary<int, ViewPlayerData>(); // 查看类型,玩家ID public event Action<int, int> OnRevPackage; //尽量不要用第一个参数viewtype做判断,容易出错 // 获取其他玩家本地缓存数据 public ViewPlayerData GetViewPlayerData(int player) { ViewPlayerData viewPlayerData = null; viewPlayerDataDic.TryGetValue(player, out viewPlayerData); return viewPlayerData; } // 向服务端请求其他玩家数据 public void ViewPlayerDetail(int _playerId, int viewType = (int)ViewPlayerType.viewPlayerData, int viewPlayerLineupType = (int)ViewPlayerLineupType.Story) { if (_playerId == PlayerDatas.Instance.baseData.PlayerID) { return; } viewPlayerType = viewType; this.viewPlayerLineupType = viewPlayerLineupType; ViewRoleParticulars(_playerId); } // 向服务端请求玩家数据 void ViewRoleParticulars(int playerID) { if (playerID == 0) { return; } viewPlayer = playerID; if (viewPlayerDataDic.ContainsKey(playerID)) { ViewPlayerData viewPlayerData = viewPlayerDataDic[playerID]; if ((DateTime.Now - viewPlayerData.getTime).TotalSeconds < 30) { ShowRoleParticulars(playerID); return; } } //CC002_tagCGViewCrossPlayerInfo c002 = new CC002_tagCGViewCrossPlayerInfo(); CA212_tagCMViewPlayerInfo pak = new CA212_tagCMViewPlayerInfo(); pak.PlayerID = (uint)playerID; GameNetSystem.Instance.SendInfo(pak); } //本服竞技场假查询模拟封包,返回查看机器人数据 打开RoleParticularsWin界面,专用接口其他地方不要调用 public void ViewFairyArenaRobot(int playerID, ViewPlayerData _viewPlayerData) { ViewPlayerData viewPlayerData = null; viewPlayer = playerID; if (!viewPlayerDataDic.TryGetValue(playerID, out viewPlayerData)) { viewPlayerDataDic.Add(playerID, _viewPlayerData); } else { viewPlayerDataDic[playerID] = _viewPlayerData; } viewPlayerType = (int)ViewPlayerType.viewPlayerData; ShowRoleParticulars(playerID); } public void OnRevRoleEquip(HA705_tagSCQueryPlayerCacheResult package) { ViewPlayerData viewPlayerData = null; if (!viewPlayerDataDic.TryGetValue((int)package.PlayerID, out viewPlayerData)) { viewPlayerData = new ViewPlayerData(); viewPlayerData.getTime = DateTime.Now; viewPlayerDataDic.Add((int)package.PlayerID, viewPlayerData); } viewPlayerData.getTime = DateTime.Now; viewPlayerData.PlayerID = (int)package.PlayerID; viewPlayerData.PlayerName = UIHelper.ServerStringTrim(package.PlayerName); viewPlayerData.LV = package.LV; viewPlayerData.Job = package.Job; viewPlayerData.RealmLV = package.RealmLV; viewPlayerData.Face = (int)package.Face; viewPlayerData.FacePic = (int)package.FacePic; viewPlayerData.ModelMark = (int)package.ModelMark; viewPlayerData.EquipShowSwitch = (int)package.EquipShowSwitch; viewPlayerData.TitleID = (int)package.TitleID; viewPlayerData.ServerID = (int)package.ServerID; viewPlayerData.FightPower = package.FightPower + package.FightPowerEx * (long)Constants.ExpPointValue; viewPlayerData.FamilyID = (int)package.FamilyID; viewPlayerData.FamilyName = UIHelper.ServerStringTrim(package.FamilyName); viewPlayerData.FamilyEmblemID = (int)package.FamilyEmblemID; viewPlayerData.FamilyEmblemWord = UIHelper.ServerStringTrim(package.FamilyEmblemWord); if (viewPlayerData.rolePlusData == null) { //第一次初始化 viewPlayerData.rolePlusData = new RolePlusData(); } if (package.PlusDataSize != 0) { viewPlayerData.rolePlusData.AnalysisRolePlusData(package.PlusData); } ShowRoleParticulars((int)package.PlayerID); } //尽量不要用第一个参数viewtype做判断,容易出错,比如同时发送两个不同的viewPlayerType请求的时候 private void ShowRoleParticulars(int playerID) { if (viewPlayerType == (int)ViewPlayerType.viewPlayerData) { if (!UIManager.Instance.IsOpened<OtherPlayerDetailWin>()) { UIManager.Instance.OpenWindow<OtherPlayerDetailWin>(viewPlayerLineupType); } } OnRevPackage?.Invoke(viewPlayerType, playerID); viewPlayerType = -1; viewPlayerLineupType = -1; } #region 获取PlusData中的数据 public Dictionary<int, RolePlusData.HeroData> GetHeroDataDict(int playerID, int lineupType) { ViewPlayerData viewPlayerData = GetViewPlayerData(playerID); if (viewPlayerData?.rolePlusData?.LineupDic?.TryGetValue(lineupType, out var lineupData) != true) { return null; } return lineupData?.HeroDic; } public List<RolePlusData.HeroData> GetHeroDataSortList(int playerID, int lineupType) { var heroDataDict = GetHeroDataDict(playerID, lineupType); if (heroDataDict == null) { return null; } var res = new List<RolePlusData.HeroData>(); List<int> keyList = heroDataDict.Keys.ToList(); keyList.Sort(); foreach (var num in keyList) { if (!heroDataDict.ContainsKey(num)) { continue; } res.Add(heroDataDict[num]); } return res; } public Dictionary<int, RolePlusData.EquipData> GetEquipDataDict(int playerID) { ViewPlayerData viewPlayerData = GetViewPlayerData(playerID); return viewPlayerData?.rolePlusData?.EquipDic; } public int GetUseDataFirstValue(RolePlusData.EquipData equip, int key) { if (equip.UserData != null && equip.UserData.ContainsKey(key) && equip.UserData[key].Count > 0) { return equip.UserData[key][0]; } return 0; } public int GetUseDataFirstValue(RolePlusData.HeroData hero, int key) { if (hero.Data != null && hero.Data.ContainsKey(key) && hero.Data[key].Count > 0) { return hero.Data[key][0]; } return 0; } public int GetEquipLV(RolePlusData.EquipData equip) { if (equip == null) { return 0; } return GetUseDataFirstValue(equip, 22); } public List<int> GetUseData(RolePlusData.EquipData equip, int key) { List<int> list = null; if (equip.UserData != null) { equip.UserData.TryGetValue(key, out list); } return list == null ? new List<int>() : list; } public List<int> GetUseData(RolePlusData.HeroData hero, int key) { List<int> list = null; if (hero.Data != null) { hero.Data.TryGetValue(key, out list); } return list == null ? new List<int>() : list; } //基础属性ID列表 public List<int> GetEquipBaseAttrs(RolePlusData.EquipData equip) { if (equip == null) { return new List<int>(); } return GetUseData(equip, 21); } //基础属性值列表 public List<int> GetEquipBaseValues(RolePlusData.EquipData equip) { if (equip == null) { return new List<int>(); } return GetUseData(equip, 23); } //战斗属性ID列表 public List<int> GetEquipFightAttrs(RolePlusData.EquipData equip) { if (equip == null) { return new List<int>(); } return GetUseData(equip, 17); } //战斗属性值列表 public List<int> GetEquipFightValues(RolePlusData.EquipData equip) { if (equip == null) { return new List<int>(); } return GetUseData(equip, 19); } // 武将突破等级 public int GetBreakLevel(RolePlusData.HeroData hero) { if (hero == null) return 0; return GetUseDataFirstValue(hero, 74); } // 武将觉醒等级 public int GetAwakeLevel(RolePlusData.HeroData hero) { if (hero == null) return 0; return GetUseDataFirstValue(hero, 76); } // 71 # 英雄天赋ID列表 public List<int> GetTalentIDList(RolePlusData.HeroData hero) { if (hero == null) return new List<int>(); return GetUseData(hero, 71); } // 73 # 英雄天赋ID等级列表,对应71天赋ID的等级 public List<int> GetTalentLvList(RolePlusData.HeroData hero) { if (hero == null) return new List<int>(); return GetUseData(hero, 73); } #endregion #region 解析PlusData public class ViewPlayerData { public int PlayerID; public string PlayerName; public int LV; public int Job; public int RealmLV; public int Face; public int FacePic; public int ModelMark; // 变形模型mark public int EquipShowSwitch; // 其他外观信息 public int TitleID; public int ServerID; public long FightPower; public int FamilyID; public string FamilyName; public int FamilyEmblemID; public string FamilyEmblemWord; public RolePlusData rolePlusData; public DateTime getTime; } public class RolePlusData { // --- 定义存储数据的结构 --- // 装备字典 <位置索引, 装备数据> public Dictionary<int, EquipData> EquipDic = new Dictionary<int, EquipData>(); // 阵容字典 <阵容ID, 阵容数据> public Dictionary<int, LineupData> LineupDic = new Dictionary<int, LineupData>(); // 装备数据类 public class EquipData { public int ItemID; public Dictionary<int, List<int>> UserData = new Dictionary<int, List<int>>(); } // 阵容数据类 public class LineupData { public int PlayerID; public long FightPower; public int ShapeType; // 英雄字典 <站位, 英雄数据> public Dictionary<int, HeroData> HeroDic = new Dictionary<int, HeroData>(); } // 英雄数据类 public class HeroData { public int HeroID; public int SkinID; public int LV; public int Star; public long FightPower; public List<int> SkillIDList = new List<int>(); // 属性字典 <属性ID, 属性值> public Dictionary<int, long> AttrDict = new Dictionary<int, long>(); // 英雄专属UserData (格式与物品UserData相同) // 使用 Dictionary<int, List<int>> 结构,key为ItemUseDataKey枚举值 public Dictionary<int, List<int>> Data = new Dictionary<int, List<int>>(); } // --- 解析逻辑 --- public void AnalysisRolePlusData(string jsonStr) { try { if (string.IsNullOrEmpty(jsonStr)) return; // 清除旧数据,防止重用对象时数据堆叠 EquipDic.Clear(); LineupDic.Clear(); // 1. 转为 JsonData 对象 JsonData jd = JsonMapper.ToObject(jsonStr); // 2. 解析装备 (Equip) if (jd.Keys.Contains("Equip")) { JsonData equipJd = jd["Equip"]; foreach (string key in equipJd.Keys) { if (int.TryParse(key, out int posIndex)) { JsonData itemJd = equipJd[key]; EquipData equipData = new EquipData(); if (itemJd.Keys.Contains("ItemID")) equipData.ItemID = (int)itemJd["ItemID"]; if (itemJd.Keys.Contains("UserData") && !string.IsNullOrEmpty((string)itemJd["UserData"])) equipData.UserData = ConfigParse.Analysis((string)itemJd["UserData"]); EquipDic[posIndex] = equipData; } } } // 3. 解析阵容 (Lineup) if (jd.Keys.Contains("Lineup")) { JsonData lineupJd = jd["Lineup"]; foreach (string key in lineupJd.Keys) { if (int.TryParse(key, out int lineupId)) { JsonData oneLineupJd = lineupJd[key]; LineupData lineupData = new LineupData(); if (oneLineupJd.Keys.Contains("PlayerID")) lineupData.PlayerID = (int)oneLineupJd["PlayerID"]; if (oneLineupJd.Keys.Contains("FightPower")) lineupData.FightPower = long.Parse(oneLineupJd["FightPower"].ToString()); if (oneLineupJd.Keys.Contains("ShapeType")) lineupData.ShapeType = (int)oneLineupJd["ShapeType"]; // 解析阵容下的英雄 (Hero) if (oneLineupJd.Keys.Contains("Hero")) { JsonData heroRootJd = oneLineupJd["Hero"]; foreach (string heroKey in heroRootJd.Keys) { if (int.TryParse(heroKey, out int heroPos)) { JsonData heroJd = heroRootJd[heroKey]; HeroData heroData = new HeroData(); if (heroJd.Keys.Contains("HeroID")) heroData.HeroID = (int)heroJd["HeroID"]; if (heroJd.Keys.Contains("SkinID")) heroData.SkinID = (int)heroJd["SkinID"]; if (heroJd.Keys.Contains("LV")) heroData.LV = (int)heroJd["LV"]; if (heroJd.Keys.Contains("Star")) heroData.Star = (int)heroJd["Star"]; if (heroJd.Keys.Contains("FightPower")) heroData.FightPower = long.Parse(heroJd["FightPower"].ToString()); // 解析Data字段(武将物品UserData) if (heroJd.Keys.Contains("Data") && !string.IsNullOrEmpty((string)heroJd["Data"])) { heroData.Data = ConfigParse.Analysis((string)heroJd["Data"]); } // 解析技能列表 List<int> if (heroJd.Keys.Contains("SkillIDList")) { JsonData skills = heroJd["SkillIDList"]; for (int i = 0; i < skills.Count; i++) { heroData.SkillIDList.Add((int)skills[i]); } } // 【修改点 2】: 属性解析逻辑更新 if (heroJd.Keys.Contains("AttrDict")) { JsonData attrs = heroJd["AttrDict"]; foreach (string attrKey in attrs.Keys) { if (int.TryParse(attrKey, out int attrId)) { JsonData v = attrs[attrKey]; long val = 0; // 健壮性判断:无论Json里是int, long还是double,都安全转为long if (v.IsLong) { val = (long)v; } else if (v.IsInt) { val = (long)(int)v; } else if (v.IsDouble) { // 如果服务端发了小数,这里会截断取整,防止报错 val = (long)(double)v; } else if (v.IsString) { // 防止有些极端情况数值变成了字符串 long.TryParse(v.ToString(), out val); } heroData.AttrDict[attrId] = val; } } } lineupData.HeroDic[heroPos] = heroData; } } } LineupDic[lineupId] = lineupData; } } } } catch (Exception e) { Debug.LogError("AnalysisRolePlusData Error: " + e.Message + "\nJSON: " + jsonStr); } } } #endregion } Main/System/OtherPlayerDetail/OtherPlayerDetailManager.cs.meta
Main/System/OtherPlayerDetail/OtherPlayerDetailWin.cs
New file @@ -0,0 +1,205 @@ using System.Collections.Generic; using UnityEngine; public class OtherPlayerDetailWin : UIBase { [SerializeField] AvatarCell avatarCell; [SerializeField] OfficialTitleCell officialTitle; [SerializeField] HorseController horseModel; [SerializeField] TextEx txtPlayerName; [SerializeField] TextEx txtPlayerId; [SerializeField] TextEx txtServerName; [SerializeField] TextEx txtLV; [SerializeField] TextEx txtFightPower; [SerializeField] ButtonEx btnCopy; [SerializeField] ButtonEx btnGuild; [SerializeField] GuildEmblemCell guildEmblem; [SerializeField] TextEx txtGuildName; [SerializeField] OtherHeroFightingCardItem[] heroFightingCards; [SerializeField] OtherEquipCardItem[] equipCards; [SerializeField] ButtonEx btnMM; [SerializeField] TextEx txtMMCnt; [SerializeField] ButtonEx btnBlock; [SerializeField] ButtonEx btnReport; [SerializeField] ButtonEx btnAddFriend; [SerializeField] ButtonEx btnPrivateChat; OtherPlayerDetailManager.ViewPlayerData viewPlayerData; OtherPlayerDetailManager manager { get { return OtherPlayerDetailManager.Instance; } } int viewPlayerLineupType = -1; protected override void InitComponent() { btnReport.SetListener(OnClickReport); btnCopy.SetListener(OnClickCopy); btnGuild.SetListener(OnClickGuild); } protected override void OnPreOpen() { viewPlayerLineupType = functionOrder; Display(); } protected override void OnPreClose() { } private void Display() { viewPlayerData = manager.GetViewPlayerData(manager.viewPlayer); if (viewPlayerData == null) { Debug.LogError($"OtherPlayerDetailWin Display 未找到玩家ID{manager.viewPlayer}的数据"); CloseWindow(); return; } DisplayMM(); DisplayPlayerInfo(viewPlayerData); DisplayGuildInfo(viewPlayerData); int playerID = viewPlayerData.PlayerID; var heroList = manager.GetHeroDataSortList(playerID, viewPlayerLineupType); if (heroList.IsNullOrEmpty()) { heroList = manager.GetHeroDataSortList(playerID, (int)ViewPlayerLineupType.Story); } DisplayCard(heroList); var equipDict = manager.GetEquipDataDict(playerID); DisplayEquip(equipDict); } private void DisplayMM() { txtMMCnt.text = Language.Get("OtherPlayerDetail08", 0); } private void DisplayGuildInfo(OtherPlayerDetailManager.ViewPlayerData viewPlayerData) { if (viewPlayerData.FamilyEmblemID <= 0 || string.IsNullOrEmpty(viewPlayerData.FamilyEmblemWord)) { btnGuild.SetActive(false); return; } btnGuild.SetActive(true); guildEmblem.Display(viewPlayerData.FamilyEmblemID, viewPlayerData.FamilyEmblemWord, 0.35f); txtGuildName.text = viewPlayerData.FamilyName; GuildManager.Instance.SendFindGuildNoDecrypt(viewPlayerData.FamilyID.ToString()); } private void DisplayPlayerInfo(OtherPlayerDetailManager.ViewPlayerData viewPlayerData) { txtPlayerName.text = viewPlayerData.PlayerName; txtPlayerId.text = Language.Get("OtherPlayerDetail02", viewPlayerData.PlayerID); txtServerName.text = Language.Get("PlayerProfile11", ServerListCenter.Instance.GetServerName(viewPlayerData.ServerID)); txtFightPower.text = UIHelper.ReplaceLargeArtNum(viewPlayerData.FightPower); txtLV.text = viewPlayerData.LV.ToString(); avatarCell.InitUI(AvatarHelper.GetAvatarModel(viewPlayerData.PlayerID, viewPlayerData.Face, viewPlayerData.FacePic)); officialTitle.InitUI(viewPlayerData.RealmLV, viewPlayerData.TitleID); DisplayHorseModel(viewPlayerData); } private void DisplayHorseModel(OtherPlayerDetailManager.ViewPlayerData viewPlayerData) { int HorseSkinID = viewPlayerData.EquipShowSwitch % 1000; int modelMark = viewPlayerData.ModelMark; // 如果 ModelMark 为 0,获取默认的 ModelMark if (modelMark == 0) { PhantasmPavilionManager.Instance.TryGetDefaultID(PhantasmPavilionType.Model, viewPlayerData.Job, out modelMark); } if (!ModelConfig.HasKey(modelMark)) { horseModel.SetActive(false); return; } horseModel.SetActive(true); var modelConfig = ModelConfig.Get(modelMark); int heroSkinID = modelConfig.SkinID; horseModel.Create(HorseManager.Instance.GetOtherPlayerHorseSkinID(HorseSkinID), heroSkinID, 1); } private void DisplayCard(List<OtherPlayerDetailManager.RolePlusData.HeroData> heros) { if (heros.IsNullOrEmpty()) { return; } //显示卡牌 for (int i = 0; i < heroFightingCards.Length; i++) { if (i < heros.Count) { heroFightingCards[i].Display(i, heros); heroFightingCards[i].SetActive(true); } else { heroFightingCards[i].SetActive(false); } } } private void DisplayEquip(Dictionary<int, OtherPlayerDetailManager.RolePlusData.EquipData> equips) { if (equips.IsNullOrEmpty()) { return; } for (int i = 0; i < equipCards.Length; i++) { equipCards[i].Display(equips.TryGetValue(i, out var equipData) ? equipData : null); } } private void OnClickReport() { ConfirmCancel.ShowPopConfirm( Language.Get("L1003"), Language.Get("OtherPlayerDetail06", "山寨名字"), (bool isOK) => { if (isOK) { } }); } private void OnClickCopy() { if (viewPlayerData == null) { return; } UIHelper.CopyToClipboard(viewPlayerData.PlayerID.ToString()); SysNotifyMgr.Instance.ShowTip("CopySuccess"); } private void OnClickGuild() { if (viewPlayerData == null) { return; } //自己的公会 if (PlayerDatas.Instance.fairyData.HasFairy && PlayerDatas.Instance.fairyData.fairy.FamilyID == viewPlayerData.FamilyID) { return; } UIManager.Instance.OpenWindow<GuildPreviewWin>(viewPlayerData.FamilyID); } } Main/System/OtherPlayerDetail/OtherPlayerDetailWin.cs.meta
New file @@ -0,0 +1,11 @@ fileFormatVersion: 2 guid: 684d231e50deab144b92606e0f6373fa MonoImporter: externalObjects: {} serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: assetBundleName: assetBundleVariant: Main/System/PhantasmPavilion/AvatarCell.cs
@@ -1,5 +1,6 @@ using System; using UnityEngine; using UnityEngine.Events; //头像模块 public class AvatarCell : MonoBehaviour @@ -144,7 +145,7 @@ return m_redpoint; } } public ViewPlayerLineupType lineupEnum = ViewPlayerLineupType.Story; GameObject prefab; AvatarModel avatarModel; PhantasmPavilionManager manager { get { return PhantasmPavilionManager.Instance; } } @@ -221,7 +222,36 @@ faceBGImage.SetNativeSize(); faceImage.SetNativeSize(); facePicImage.SetNativeSize(); BindButtonClick(model); } // 添加标志位:是否已设置自定义监听器 private bool hasCustomListener = false; public void SetListener(UnityAction action) { hasCustomListener = true; // 标记已设置自定义监听 button.SetListener(action); } public void AddListener(UnityAction action) { hasCustomListener = true; // 标记已设置自定义监听 button.SetListener(action); } private void BindButtonClick(AvatarModel model) { // 如果已经设置了自定义监听器,不覆盖 if (hasCustomListener) return; button.SetListener(() => { if (avatarModel == null) { return; } AvatarHelper.TryViewOtherPlayerInfo(avatarModel.playerID, (int)ViewPlayerType.viewPlayerData, (int)lineupEnum); }); } } public class AvatarModel @@ -229,15 +259,11 @@ public int playerID { get; private set; } public int faceID { get; private set; } public int facePicID { get; private set; } public int redpointID { get; private set; } public Action clickAction { get; private set; } public AvatarModel(int playerID, int faceID, int facePicID, int redpointID = 0, Action clickAction = null) public AvatarModel(int playerID, int faceID, int facePicID) { this.playerID = playerID; this.faceID = faceID; this.facePicID = facePicID; this.redpointID = redpointID; this.clickAction = clickAction; } } Main/System/PhantasmPavilion/AvatarHelper.cs
@@ -1,5 +1,14 @@ using System; public static class AvatarHelper { public static void TryViewOtherPlayerInfo(int _playerId, int viewType = (int)ViewPlayerType.viewPlayerData, int viewPlayerLineupType = (int)ViewPlayerLineupType.Story) { if (_playerId == PlayerDatas.Instance.PlayerId || UIManager.Instance.IsOpened<OtherPlayerDetailWin>()) return; OtherPlayerDetailManager.Instance.ViewPlayerDetail(_playerId, viewType, viewPlayerLineupType); } public static AvatarModel GetAvatarModel(int playerId, int face, int facePic, int job = 0) { bool isMyself = playerId == PlayerDatas.Instance.PlayerId; Main/System/PlayerProfile/PlayerProfileWin.cs
@@ -47,7 +47,7 @@ UIManager.Instance.OpenWindow<GameAgeWarnWin>(); }); avatarCell.redpoint.redpointId = MainRedDot.PhantasmPavilionRepoint; avatarCell.button.SetListener(() => avatarCell.SetListener(() => { UIManager.Instance.OpenWindow<PhantasmPavilionWin>(); }); Main/System/RoleParticulars/OtherPlayerDetailManager.cs
File was deleted Main/System/TianziBillborad/TianziBillboradPlayerRankCell.cs
@@ -20,6 +20,7 @@ public void Display(int rankType, int rank, string valueFormat) { RankData rankData = null; int viewPlayerId = (int)PlayerDatas.Instance.baseData.PlayerID; if (rank != 0) { rankData = RankModel.Instance.GetRankDataByRank(rankType, rank); @@ -54,6 +55,7 @@ officialTitleCell.InitUI((int)rankData.value1, (int)rankData.value2); avatarCell.SetActive(true); avatarCell.InitUI(AvatarHelper.GetAvatarModel((int)rankData.id, (int)rankData.value3, (int)rankData.value4)); viewPlayerId = (int)rankData.id; nameText.text = rankData.name1; rankValueText.text = string.Format(valueFormat, UIHelper.ReplaceLargeNum(rankData.cmpValue2 + rankData.cmpValue * Constants.ExpPointValue)); } @@ -63,7 +65,7 @@ { queryPlayerBtn.AddListener(() => { AvatarHelper.TryViewOtherPlayerInfo(viewPlayerId); }); } } Main/System/TianziBillborad/TianziBillboradPlayerTop3Cell.cs
@@ -32,6 +32,10 @@ officialTitleCell.InitUI((int)rankData.value1, (int)rankData.value2); model.SetActive(true); model.Create(HorseManager.Instance.GetOtherPlayerHorseSkinID((int)rankData.value6), (int)rankData.value5, rank == 1 ? 1f : 0.8f); queryPlayerBtn.SetListener(() => { AvatarHelper.TryViewOtherPlayerInfo((int)rankData.id); }); } Main/Utility/EnumHelper.cs
@@ -1844,4 +1844,12 @@ viewPlayerData = 0, //查看玩家基本信息,公用打开界面 viewGuildLeader = 1, //查看玩家的公会族长信息 } //查询其他玩家数据 展示的阵容 public enum ViewPlayerLineupType { Story = 1, //主线 ArenaAtk = 2, //竞技场进攻 ArenaDef = 3, //竞技场防守 }