using System;
|
using System.Collections;
|
using System.Collections.Generic;
|
using Cysharp.Threading.Tasks;
|
using DG.Tweening;
|
using UnityEngine;
|
using UnityEngine.UI;
|
|
|
/// <summary>
|
/// 公会基础界面
|
/// </summary>
|
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<GuildBossPowerUPWin>();
|
});
|
atkBtn.AddListener(OnAtkBtnClick);
|
scoreBtn.AddListener(() =>
|
{
|
UIManager.Instance.OpenWindow<GuildBossHurtRankWin>();
|
});
|
awardBtn.AddListener(() =>
|
{
|
UIManager.Instance.OpenWindow<GuildBossAwardWin>();
|
});
|
|
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<PositionTween>();
|
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<PositionTween>();
|
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");
|
}
|
}
|