using System; using System.Collections; using System.Collections.Generic; using Cysharp.Threading.Tasks; using DG.Tweening; using UnityEngine; using UnityEngine.UI; /// /// 公会基础界面 /// public class GuildBossWin : UIBase { [SerializeField] Text endTimeText; [SerializeField] Text fightPowerText; [SerializeField] Transform rankRect; [SerializeField] Text rankText; [SerializeField] Text noRankText; [SerializeField] AvatarCell headCell; [SerializeField] Text nameText; [SerializeField] Text todayHurtText; [SerializeField] Image newHighestHurtImg; //布阵 [SerializeField] Text bzAttrText; [SerializeField] UIEffectPlayer bzEffect1; [SerializeField] Text bzLayerText; //公会布阵层级 [SerializeField] UIEffectPlayer bzEffect2; [SerializeField] Button bzBtn; [SerializeField] Text bzTimesText; //个人布阵次数 [SerializeField] Button bzRecordBtn; //怒气条 [SerializeField] Image processLeft; //颜色从00FF0B 到 FFE400 到 E30400 [SerializeField] Image processRight; [SerializeField] Button atkBtn; [SerializeField] Image angerAtk; //怒气攻击 [SerializeField] Transform normalAtk; //普通攻击 [SerializeField] UIEffectPlayer atkEffect; //普通攻击特效 0次不显示 按钮用 [SerializeField] Text normalAtkCntText; //普通攻击次数 [SerializeField] Text atkCDText; //攻击cd [SerializeField] Transform addTimesRect; [SerializeField] Image addTimesItemImg; [SerializeField] ButtonEx closeBtn; [SerializeField] ButtonEx scoreBtn; [SerializeField] ButtonEx awardBtn; [SerializeField] Transform awardCntRect; [SerializeField] Text awardCntText; //攻击区 [SerializeField] UIHeroController bossModel; [SerializeField] HorseController heroModel; [SerializeField] Transform attackArea1; [SerializeField] Transform attackArea2; [SerializeField] Transform attackArea3; [SerializeField] GuildBossOtherPlayer otherPlayer; //创建多个用 [SerializeField] GuildBossOtherPlayerAttack otherPlayerAttack; //创建多个用 //自己的攻击 [SerializeField] UIEffectPlayer hurtEffect; [SerializeField] UIEffectPlayer hurtAngerEffect; [SerializeField] Text[] hurtValues; [SerializeField] Text[] awardValues; [SerializeField] Image[] awardIcons; [SerializeField] Transform pos1; [SerializeField] Transform pos2; [SerializeField] Transform fakeRedBZ; [SerializeField] Transform fakeRedAward; bool isCD = false; int beforeLayerNum; //布阵层级 对比变化展示特效 protected override void InitComponent() { closeBtn.AddListener(CloseWindow); bzBtn.AddListener(OnBzBtnClick); bzRecordBtn.AddListener(() => { UIManager.Instance.OpenWindow(); }); atkBtn.AddListener(OnAtkBtnClick); scoreBtn.AddListener(() => { UIManager.Instance.OpenWindow(); }); awardBtn.AddListener(() => { UIManager.Instance.OpenWindow(); }); bossModel.Create(GuildBossManager.Instance.bossSkinID, 1, motionName: "chuxian"); } protected override void OnPreOpen() { GlobalTimeEvent.Instance.secondEvent += OnSecondEvent; PlayerDatas.Instance.playerDataRefreshEvent += OnPlayerDataRefresh; GuildBossManager.Instance.BossHurtEvent += BossHurtEvent; GuildBossManager.Instance.AtkResultEvent += AtkResultEvent; Display(); InitAttack(); } protected override void OnPreClose() { GlobalTimeEvent.Instance.secondEvent -= OnSecondEvent; PlayerDatas.Instance.playerDataRefreshEvent -= OnPlayerDataRefresh; GuildBossManager.Instance.BossHurtEvent -= BossHurtEvent; GuildBossManager.Instance.AtkResultEvent -= AtkResultEvent; } protected override void NextFrameAfterOpen() { SoundPlayer.Instance.PlayUIAudio(28); } void Display() { endTimeText.text = Language.Get("Arena14", TimeUtility.SecondsToHMS((int)(TimeUtility.GetTodayEndTime() - TimeUtility.ServerNow).TotalSeconds)); fightPowerText.text = PlayerDatas.Instance.baseData.FightPower.ToString(); headCell.InitUI(AvatarHelper.GetAvatarModel((int)PlayerDatas.Instance.baseData.PlayerID, PlayerDatas.Instance.baseData.face, PlayerDatas.Instance.baseData.facePic)); nameText.text = PlayerDatas.Instance.baseData.PlayerName; BossHurtEvent(); } //战力变化 void OnPlayerDataRefresh(PlayerDataType type) { if (type == PlayerDataType.FightPower) fightPowerText.text = PlayerDatas.Instance.baseData.FightPower.ToString(); } //显示动态UI void ShowDynamicUI() { var bossAction = GuildBossManager.Instance.GetGuildBossAction(); ShowRank(); ShowBzInfo(bossAction); todayHurtText.text = Language.Get("GuildBoss17") + UIHelper.ReplaceLargeNum(GuildBossManager.Instance.m_BoxHurt); if (GuildBossManager.Instance.m_BoxHurt >= GuildBossManager.Instance.m_BoxHurtHis) { newHighestHurtImg.SetActive(true); } else { newHighestHurtImg.SetActive(false); } bzTimesText.text = Language.Get("Guild_65") + (GuildBossManager.Instance.m_BuZhenState == 1 ? "0/1" : UIHelper.AppendColor(TextColType.Green, "1/1", false)); ShowProcess(GuildBossManager.Instance.m_Anger * 1.0f / GuildBossManager.Instance.maxAngerValue); if (isCD) { angerAtk.SetActive(false); normalAtk.SetActive(false); } else { atkCDText.text = ""; if (GuildBossManager.Instance.m_Anger >= GuildBossManager.Instance.maxAngerValue) { angerAtk.SetActive(true); normalAtk.SetActive(false); } else { angerAtk.SetActive(false); normalAtk.SetActive(true); int cnt = GuildBossManager.Instance.GetHasAtkCnt(); if (cnt > 0) { atkEffect.Play(); } else { atkEffect.Stop(); } normalAtkCntText.text = Language.Get("TianziBillborad07", cnt); } } var hasCnt = GuildBossManager.Instance.GetHasAtkCnt(); if (hasCnt > 0 || GuildBossManager.Instance.m_Anger >= GuildBossManager.Instance.maxAngerValue) { addTimesRect.SetActive(false); } else { addTimesRect.SetActive(true); addTimesItemImg.SetItemSprite(GuildBossManager.Instance.addAtkCntItemID); } if (GuildBossManager.Instance.m_BoxUnGetCount > 0) { awardCntRect.SetActive(true); awardCntText.text = Language.Get("TianziBillborad07", GuildBossManager.Instance.m_BoxUnGetCount); } else { awardCntRect.SetActive(false); } fakeRedBZ.SetActive(GuildBossManager.Instance.m_BuZhenState != 1); fakeRedAward.SetActive(GuildBossManager.Instance.m_BoxUnGetCount > 0); } void BossHurtEvent() { var bossAction = GuildBossManager.Instance.GetGuildBossAction(); var layer = bossAction == null ? 0 : bossAction.Value3; if (beforeLayerNum != layer) { bzEffect1.Play(); bzEffect2.Play(); beforeLayerNum = (int)layer; } ShowDynamicUI(); } void ShowRank() { int myRank = GuildBossManager.Instance.GetMyRank(); if (myRank > 0) { rankRect.SetActive(true); noRankText.SetActive(false); rankText.text = myRank.ToString(); } else { rankRect.SetActive(false); noRankText.SetActive(true); } } //布阵 void ShowBzInfo(HA513_tagMCFamilyActionInfo.tagMCFamilyAction bossAction) { bzAttrText.text = GetAddAttrs(bossAction); var layer = bossAction == null ? 0 : bossAction.Value3; var bzTime = bossAction == null ? 0 : bossAction.Value2; if (bzTime == 0) { bzLayerText.text = $"{layer}/{GuildBossManager.Instance.bzMaxLevel}"; } else { int remainTime = (int)Math.Max(0, bzTime - TimeUtility.AllSeconds); if (remainTime > 0) { bzLayerText.text = $"{layer}/{GuildBossManager.Instance.bzMaxLevel}" + Language.Get("GuildBoss28", TimeUtility.SecondsToHMS(remainTime)); } } } //获取布阵属性 string GetAddAttrs(HA513_tagMCFamilyActionInfo.tagMCFamilyAction action) { var layerNum = action == null ? 0 : action.Value3; var superHitRate = GuildBossManager.Instance.initSuperHitRate + (int)layerNum * GuildBossManager.Instance.bzAddAttrs[0]; var addHurtPer = (int)layerNum * GuildBossManager.Instance.bzAddAttrs[1]; if (addHurtPer == 0) { return Language.Get("GuildBoss18_0", superHitRate / 100); } return Language.Get("GuildBoss18_0", superHitRate / 100) + Language.Get("L1112") + Language.Get("GuildBoss18_1", addHurtPer / 100); } void OnSecondEvent() { endTimeText.text = Language.Get("Arena14", TimeUtility.SecondsToHMS((int)(TimeUtility.GetTodayEndTime() - TimeUtility.ServerNow).TotalSeconds)); var bossAction = GuildBossManager.Instance.GetGuildBossAction(); ShowBzInfo(bossAction); } void ShowProcess(float value) { //颜色从00FF0B 到 FFE400 到 E30400 processLeft.fillAmount = value; processRight.fillAmount = value; Color processColor = GetProcessColor(value); processLeft.color = processColor; processRight.color = processColor; } Color GetProcessColor(float value) { // 限制值在0-1范围内 value = Mathf.Clamp01(value); if (value <= 0.5f) { float t = value / 0.5f; return Color.Lerp(new Color(0f, 1f, 0.043f), new Color(1f, 0.894f, 0f), t); } else { float t = (value - 0.5f) / 0.5f; return Color.Lerp(new Color(1f, 0.894f, 0f), new Color(0.89f, 0.016f, 0f), t); } } void OnBzBtnClick() { int curLayer = 0; var bossAction = GuildBossManager.Instance.GetGuildBossAction(); if (bossAction != null) { curLayer = (int)bossAction.Value3; } // if (curLayer >= GuildBossManager.Instance.bzMaxLevel) // { // SysNotifyMgr.Instance.ShowTip("GuildBoss2"); // return; // } if (GuildBossManager.Instance.m_BuZhenState == 1) { SysNotifyMgr.Instance.ShowTip("GuildBoss1"); return; } GuildBossManager.Instance.TaofaBoss(1); } void OnAtkBtnClick() { if (isCD) return; //怒气伤害不消耗次数 //次数不足 提示使用道具,若用完提示本日次数已用完 if (GuildBossManager.Instance.m_Anger < GuildBossManager.Instance.maxAngerValue) { if (GuildBossManager.Instance.GetHasAtkCnt() <= 0) { var itemCfg = ItemConfig.Get(GuildBossManager.Instance.addAtkCntItemID); var singleCnt = itemCfg.EffectValueA1; var todayUseMaxCnt = itemCfg.MaxSkillCnt; if (GuildBossManager.Instance.m_ItemAddCount / singleCnt >= todayUseMaxCnt) { SysNotifyMgr.Instance.ShowTip("HeroWishFinish"); return; } ConfirmCancel.ShowUseItemPopConfirm(Language.Get("GuildBoss24"), Language.Get("GuildBoss23", itemCfg.IconKey, singleCnt, todayUseMaxCnt - GuildBossManager.Instance.m_ItemAddCount / singleCnt), GuildBossManager.Instance.addAtkCntItemID, 1, (bool isOK) => { if (isOK) { if (ItemLogicUtility.CheckItemCount(PackType.Item, GuildBossManager.Instance.addAtkCntItemID, 1, 2)) { ItemLogicUtility.Instance.UseItem(PackManager.Instance.GetItemGUIDByID(GuildBossManager.Instance.addAtkCntItemID)); } } }); return; } } GuildBossManager.Instance.TaofaBoss(0); ShowAttackCD().Forget(); } async UniTask ShowAttackCD() { angerAtk.SetActive(false); normalAtk.SetActive(false); isCD = true; atkBtn.SetColorful(null, false); atkCDText.text = "3"; await UniTask.Delay(1000); atkCDText.text = "2"; await UniTask.Delay(1000); atkCDText.text = "1"; await UniTask.Delay(1000); atkBtn.SetColorful(null, true); isCD = false; ShowDynamicUI(); } void AtkResultEvent() { //1. 玩家从pos1 移动到pos2 //2. 播放攻击动作 - 显示对应类型特效 //3. 延迟100毫秒飘血物品 heroModel.GetHero().onComplete = null; heroModel.PlayAnimation("run", true); heroModel.transform.localPosition = pos1.localPosition; heroModel.transform.DOLocalMove(pos2.localPosition, 0.3f).OnComplete(() => { ShowDmg().Forget(); }); } async UniTask ShowDmg() { heroModel.GetHero().onComplete = () => { heroModel.transform.localPosition = pos1.localPosition; }; heroModel.HeroPlay("attack"); if (GuildBossManager.Instance.atkResult.AtkType == 0) { hurtEffect.Play(); } else { hurtAngerEffect.Play(); } bossModel.PlayAnimation("hit"); bossModel.onComplete = () => { bossModel.PlayAnimation("idle", true); bossModel.onComplete = null; }; for (int i = 0; i < hurtValues.Length; i++) { if (i < GuildBossManager.Instance.atkResult.HurtCount) { int index = i; hurtValues[i].transform.localScale = Vector3.one; var tween = hurtValues[i].GetComponent(); if (tween.isActiveAndEnabled) { tween.SetStartState(); tween.Play(() => { hurtValues[index].transform.localScale = Vector3.zero; }); } var hurtData = GuildBossManager.Instance.atkResult.HurtList[i]; BattleDmg dmg = new BattleDmg() { damage = hurtData.HurtValue + hurtData.HurtValueEx * Constants.ExpPointValue, attackType = hurtData.IsSuper == 1 ? (int)DamageType.CritDamage : 2 }; hurtValues[i].text = BattleUtility.DisplayDamageNum(dmg); await UniTask.Delay(200); } else { hurtValues[i].transform.localScale = Vector3.zero; } } for (int i = 0; i < awardValues.Length; i++) { if (i < GuildBossManager.Instance.atkResult.ItemCount) { var itemData = GuildBossManager.Instance.atkResult.ItemList[i]; awardValues[i].transform.localScale = Vector3.one; int index = i; var tween = awardValues[i].GetComponent(); if (tween.isActiveAndEnabled) { tween.SetStartState(); tween.Play(() => { awardValues[index].transform.localScale = Vector3.zero; }); } awardValues[i].text = itemData.Count.ToString(); awardIcons[i].SetItemSprite((int)itemData.ItemID); await UniTask.Delay(200); } else { awardValues[i].transform.localScale = Vector3.zero; } } } void InitAttack() { var skinConfig = HorseSkinConfig.Get(HorseManager.Instance.GetUsingHorseSkinID(false)); heroModel.Create(skinConfig.SkinID, PhantasmPavilionManager.Instance.GetMyModelSkinID(), 1.2f); for (int i = 0; i < hurtValues.Length; i++) { hurtValues[i].transform.localScale = Vector3.zero; } for (int i = 0; i < awardValues.Length; i++) { awardValues[i].transform.localScale = Vector3.zero; } heroModel.transform.localPosition = pos1.localPosition; bossModel.onComplete = () => { bossModel.PlayAnimation("idle", true); bossModel.onComplete = null; }; bossModel.PlayAnimation("chuxian"); } }