using System.Collections;
|
using System.Collections.Generic;
|
using UnityEngine;
|
using UnityEngine.UI;
|
using DG.Tweening;
|
using Cysharp.Threading.Tasks;
|
using System.Threading;
|
using System;
|
|
/// <summary>
|
/// 武将布阵界面
|
/// </summary>
|
public class HeroPosWin : UIBase
|
{
|
[SerializeField] Text[] attrOnList; //上阵属性加成
|
[SerializeField] Button countryOnBtn;
|
[SerializeField] Image countryOnImg; //上阵阵型激活国家
|
[SerializeField] UIEffectPlayer countryEffect;
|
[SerializeField] List<Image> OnCountImgs; //上阵数量激活
|
[SerializeField] List<Image> scenePosImgs; //场景布阵位置
|
[SerializeField] HeroScenePosCell[] sceneHero;
|
|
[SerializeField] GroupButtonEx attackTeamBtn;
|
[SerializeField] GroupButtonEx defendTeamBtn;
|
|
[SerializeField] Text fightPowerText; //由客户端自己预算的战力
|
[SerializeField] ScrollerController heroListScroller;
|
[SerializeField] Transform heroListEmpty;
|
[SerializeField] Toggle showConnTipToggleBtn;
|
|
[SerializeField] HeroSelectBehaviour fiterManager; //武将筛选
|
|
[SerializeField] Button oneKeyOnBtn; //一键上阵
|
[SerializeField] Button saveBtn; //保存阵型
|
[SerializeField] Button backBtn; //退出界面
|
[SerializeField] GroupButtonEx jjcBtn; //竞技场
|
// [SerializeField] GroupButtonEx tttBtn; //通天塔
|
[SerializeField] GroupButtonEx mainFBBtn; //主线副本
|
|
//羁绊
|
[SerializeField] HeroConnectionCell connetionForm;
|
[SerializeField] HeroHeadBaseCell flyHead;
|
[SerializeField] CanvasGroup flyAlphaTween;
|
|
Sequence sequence;
|
CancellationTokenSource _cts;
|
Queue<int> showConnectTipQueue = new Queue<int>();
|
|
private bool m_IsToggleOn = false;
|
private bool isToggleOn
|
{
|
get { return m_IsToggleOn; }
|
set
|
{
|
if (m_IsToggleOn != value)
|
{
|
m_IsToggleOn = value;
|
LocalSave.SetBool("ShowConn" + PlayerDatas.Instance.baseData.PlayerID, value);
|
}
|
}
|
}
|
|
protected override void InitComponent()
|
{
|
attackTeamBtn.AddListener(() =>
|
{
|
SelectTeamFunc((TeamType)HeroUIManager.Instance.GetSelectTeamTypeByAttackType(0));
|
});
|
defendTeamBtn.AddListener(() =>
|
{
|
SelectTeamFunc((TeamType)HeroUIManager.Instance.GetSelectTeamTypeByAttackType(1));
|
});
|
|
mainFBBtn.AddListener(() =>
|
{
|
SelectTeamFunc(TeamType.Story);
|
});
|
|
jjcBtn.AddListener(() =>
|
{
|
SelectTeamFunc(TeamType.Arena);
|
});
|
// tttBtn.AddListener(() =>
|
// {
|
// SelectTeamFunc(TeamType.Tower);
|
// });
|
|
showConnTipToggleBtn.AddListener((value) =>
|
{
|
isToggleOn = showConnTipToggleBtn.isOn;
|
if (isToggleOn == false)
|
{
|
CancelCurrentTask();
|
}
|
});
|
oneKeyOnBtn.AddListener(OneKeyOnPos);
|
saveBtn.AddListener(SaveTeam);
|
|
backBtn.AddListener(CloseWindow);
|
|
countryOnBtn.AddListener(() =>
|
{
|
UIManager.Instance.OpenWindow<HeroFormationWin>();
|
});
|
|
m_IsToggleOn = LocalSave.GetBool("ShowConn" + PlayerDatas.Instance.baseData.PlayerID, false);
|
}
|
|
|
protected override void OnPreOpen()
|
{
|
HeroUIManager.Instance.selectTeamPosJob = 0;
|
HeroUIManager.Instance.selectTeamPosCountry = 0;
|
HeroUIManager.Instance.SortHeroOnTeamList();
|
heroListScroller.OnRefreshCell += OnRefreshCell;
|
HeroUIManager.Instance.OnTeamPosChangeEvent += TeamChangeEvent;
|
TeamManager.Instance.OnTeamChange += OnTeamChange;
|
CreateScroller();
|
Refresh();
|
}
|
|
protected override void OnPreClose()
|
{
|
CancelCurrentTask();
|
heroListScroller.OnRefreshCell -= OnRefreshCell;
|
HeroUIManager.Instance.OnTeamPosChangeEvent -= TeamChangeEvent;
|
TeamManager.Instance.OnTeamChange -= OnTeamChange;
|
TeamManager.Instance.GetTeam(HeroUIManager.Instance.selectTeamType).RestoreTeam();
|
}
|
|
|
public override void Refresh()
|
{
|
OnBattleTeamAttrPer();
|
RefreshOnTeamCountry();
|
RefreshOnTeamBtn();
|
RefreshTeamHero();
|
RefreshFlyHead();
|
RefreshConn();
|
|
RefreshEmptyTip();
|
|
showConnTipToggleBtn.isOn = isToggleOn;
|
|
fiterManager.Display(0, HeroUIManager.Instance.selectTeamPosJob, HeroUIManager.Instance.selectTeamPosCountry, SelectJobCountry);
|
|
|
fightPowerText.text = UIHelper.ReplaceLargeArtNum(FightPowerManager.Instance.GetTeamFightPower(HeroUIManager.Instance.selectTeamType, true));
|
|
|
}
|
|
void RefreshFlyHead()
|
{
|
var flyCanvas = flyAlphaTween.GetComponent<Canvas>();
|
flyCanvas.sortingLayerID = canvas.sortingLayerID;
|
flyCanvas.sortingOrder = canvas.sortingOrder + 9;
|
flyAlphaTween.alpha = 0;
|
flyHead.transform.localScale = Vector3.zero;
|
}
|
|
void RefreshConn()
|
{
|
connetionForm.SetActive(false);
|
var canvasConn = connetionForm.GetComponent<Canvas>();
|
canvasConn.sortingLayerID = canvas.sortingLayerID;
|
canvasConn.sortingOrder = canvas.sortingOrder + 9;
|
CancelCurrentTask();
|
}
|
|
void SelectJobCountry(int job, int country)
|
{
|
HeroUIManager.Instance.selectTeamPosJob = job;
|
HeroUIManager.Instance.selectTeamPosCountry = country;
|
HeroUIManager.Instance.SortHeroOnTeamList();
|
CreateScroller();
|
RefreshEmptyTip();
|
}
|
|
void RefreshEmptyTip()
|
{
|
if (HeroUIManager.Instance.heroOnTeamSortList.Count <= 0)
|
{
|
heroListEmpty.SetActive(true);
|
heroListScroller.SetActive(false);
|
}
|
else
|
{
|
heroListEmpty.SetActive(false);
|
heroListScroller.SetActive(true);
|
}
|
}
|
|
void OnRefreshCell(ScrollerDataType type, CellView cell)
|
{
|
var _cell = cell as HeroPosLineCell;
|
_cell.Display(cell.index);
|
}
|
|
void CreateScroller()
|
{
|
heroListScroller.Refresh();
|
for (int i = 0; i < HeroUIManager.Instance.heroOnTeamSortList.Count; i++)
|
{
|
if (i % 5 == 0)
|
{
|
heroListScroller.AddCell(ScrollerDataType.Header, i);
|
}
|
}
|
heroListScroller.Restart();
|
}
|
|
//上阵加成
|
void OnBattleTeamAttrPer()
|
{
|
var valuePer = 0;
|
var team = TeamManager.Instance.GetTeam(HeroUIManager.Instance.selectTeamType);
|
if (team != null)
|
{
|
for (int i = 0; i < team.serverHeroes.Length; i++)
|
{
|
if (team.serverHeroes[i] == null)
|
continue;
|
var hero = HeroManager.Instance.GetHero(team.serverHeroes[i].guid);
|
if (hero != null)
|
{
|
valuePer += hero.GetOnBattleAddPer();
|
}
|
}
|
|
}
|
//上阵属性
|
for (int i = 0; i < attrOnList.Length; i++)
|
{
|
string format = valuePer == 0 ? "{0}+{1}" : "{0}+" + UIHelper.AppendColor(TextColType.Green, "{1}", false);
|
attrOnList[i].text = PlayerPropertyConfig.GetFullDescription(PlayerPropertyConfig.basePerAttrs[i], valuePer, format);
|
}
|
}
|
|
//上阵武将国家光环激活
|
void RefreshOnTeamCountry(bool playEffect = false)
|
{
|
Int2 result = HeroUIManager.Instance.GetMaxCountHeroCountry(HeroUIManager.Instance.selectTeamType, true);
|
|
var config = HeroLineupHaloConfig.GetConfig(result.x, result.y);
|
if (config == null)
|
{
|
countryOnImg.SetSprite("heroTeamCountry0");
|
for (int i = 0; i < OnCountImgs.Count; i++)
|
{
|
OnCountImgs[i].SetActive(false);
|
}
|
}
|
else
|
{
|
countryOnImg.SetSprite("heroTeamCountry" + result.x);
|
for (int i = 0; i < OnCountImgs.Count; i++)
|
{
|
if (i < result.y)
|
{
|
OnCountImgs[i].SetActive(true);
|
OnCountImgs[i].SetSprite("heroTeamCountryPoint" + result.x);
|
}
|
else
|
{
|
OnCountImgs[i].SetActive(false);
|
}
|
}
|
if (playEffect)
|
countryEffect.Play();
|
}
|
|
}
|
|
//管理布阵入口按钮:如竞技场是否根据功能显隐,通天塔和主线只有进攻方布阵默认不显示
|
void RefreshOnTeamBtn()
|
{
|
if (HeroUIManager.Instance.selectTeamType == TeamType.Arena ||
|
HeroUIManager.Instance.selectTeamType == TeamType.ArenaDefense)
|
{
|
attackTeamBtn.SetActive(true);
|
defendTeamBtn.SetActive(true);
|
if (HeroUIManager.Instance.selectTeamType == TeamType.Arena)
|
{
|
attackTeamBtn.SelectBtn(true);
|
}
|
else
|
{
|
defendTeamBtn.SelectBtn(true);
|
}
|
}
|
else
|
{
|
attackTeamBtn.SetActive(false);
|
defendTeamBtn.SetActive(false);
|
}
|
|
}
|
|
void RefreshTeamHero()
|
{
|
var team = TeamManager.Instance.GetTeam(HeroUIManager.Instance.selectTeamType);
|
for (int i = 0; i < sceneHero.Length; i++)
|
{
|
var teamHero = team.tempHeroes[i];
|
if (teamHero == null)
|
{
|
sceneHero[i].SetActive(false);
|
}
|
else
|
{
|
sceneHero[i].SetActive(true);
|
sceneHero[i].Display(teamHero.guid, i);
|
//按scenePosImgs 顺序排序对应位置
|
sceneHero[i].transform.position = scenePosImgs[i].transform.position;
|
sceneHero[i].transform.localScale = Vector3.one;
|
}
|
|
}
|
RefreshPosScale();
|
}
|
|
void RefreshPosScale()
|
{
|
for (int i = 0; i < scenePosImgs.Count; i++)
|
{
|
scenePosImgs[i].transform.localScale = Vector3.one;
|
}
|
}
|
|
/// <summary>
|
/// 点击上阵,拖拉,一键等触发;
|
/// </summary>
|
/// <param name="posList">要刷新的布阵位置</param>
|
/// <param name="flyFrom">大于-1代表是点击上阵,需要表现飞行效果</param>
|
void TeamChangeEvent(List<int> posList, int flyFrom, Vector3 startPos)
|
{
|
var team = TeamManager.Instance.GetTeam(HeroUIManager.Instance.selectTeamType);
|
foreach (var i in posList)
|
{
|
var teamHero = team.tempHeroes[i];
|
if (teamHero == null)
|
{
|
sceneHero[i].SetActive(false);
|
}
|
else
|
{
|
sceneHero[i].SetActive(true);
|
sceneHero[i].Display(teamHero.guid, i, flyFrom >= 0, true);
|
//按scenePosImgs 顺序排序对应位置
|
sceneHero[i].transform.position = scenePosImgs[i].transform.position;
|
sceneHero[i].transform.localScale = Vector3.one;
|
|
}
|
}
|
RefreshPosScale();
|
heroListScroller.m_Scorller.RefreshActiveCellViews();
|
RefreshOnTeamCountry(true);
|
|
//表现飞入,连续点击不同头像触发的话则重置
|
if (flyFrom > -1)
|
{
|
var flyHero = HeroManager.Instance.GetHero(HeroUIManager.Instance.heroOnTeamSortList[flyFrom]);
|
if (flyHero == null)
|
return;
|
|
//先停止 sequence
|
if (sequence != null)
|
{
|
sequence.Kill();
|
}
|
sequence = DOTween.Sequence();
|
|
|
flyAlphaTween.alpha = 1;
|
flyHead.Init(flyHero.heroId, flyHero.SkinID);
|
flyHead.transform.position = startPos;
|
var targetPos = scenePosImgs[posList[0]].transform.position;
|
flyHead.transform.localScale = Vector3.one;
|
sequence.Append(flyHead.transform.DOMove(targetPos, HeroUIManager.clickFlyPosTime).SetEase(Ease.OutQuad))
|
.Join(flyHead.transform.DOScale(new Vector3(0.5f, 0.5f, 0.5f), HeroUIManager.clickFlyPosTime).SetEase(Ease.OutQuad))
|
.Join(flyAlphaTween.DOFade(0f, HeroUIManager.clickFlyPosTime).SetEase(Ease.OutQuad));
|
sequence.onComplete = () => { flyHead.transform.localScale = Vector3.zero; };
|
|
if (isToggleOn)
|
{
|
ShowFetter(flyHero);
|
}
|
}
|
fightPowerText.text = UIHelper.ReplaceLargeArtNum(FightPowerManager.Instance.GetTeamFightPower(HeroUIManager.Instance.selectTeamType, true));
|
|
}
|
|
void ShowFetter(HeroInfo hero)
|
{
|
var heroConfig = hero.heroConfig;
|
var fetterList = hero.GetActiveFetter(heroConfig, TeamManager.Instance.GetTeam(HeroUIManager.Instance.selectTeamType));
|
for (int i = 0; i < fetterList.Count; i++)
|
{
|
if (!showConnectTipQueue.Contains(fetterList[i]))
|
showConnectTipQueue.Enqueue(fetterList[i]);
|
}
|
|
if (_cts == null)
|
{
|
_cts = new CancellationTokenSource();
|
RunTaskAsync(_cts.Token).Forget(); // Forget() 表示不等待此任务完成
|
}
|
|
}
|
async UniTask RunTaskAsync(CancellationToken token)
|
{
|
try
|
{
|
while (showConnectTipQueue.Count > 0)
|
{
|
await UniTask.Delay(300, cancellationToken: token);
|
showConnectTipQueue.TryDequeue(out int fetterID);
|
if (fetterID == 0)
|
{
|
continue;
|
}
|
connetionForm.SetActive(true);
|
connetionForm.Display(fetterID);
|
//显示1.5秒后关闭
|
await UniTask.Delay(1500, cancellationToken: token);
|
connetionForm.SetActive(false);
|
}
|
|
}
|
catch (OperationCanceledException)
|
{
|
Debug.Log("羁绊 协程被取消");
|
connetionForm.SetActive(false);
|
}
|
finally
|
{
|
_cts?.Dispose(); // 释放资源
|
_cts = null; // 置空避免重复取消
|
showConnectTipQueue.Clear();
|
}
|
|
}
|
|
// 取消当前正在运行的任务
|
public void CancelCurrentTask()
|
{
|
_cts?.Cancel(); // 触发取消
|
_cts?.Dispose(); // 释放资源
|
_cts = null; // 置空避免重复取消
|
showConnectTipQueue.Clear();
|
}
|
|
void OneKeyOnPos()
|
{
|
var guidList = HeroUIManager.Instance.SelectRecommend();
|
var team = TeamManager.Instance.GetTeam(HeroUIManager.Instance.selectTeamType);
|
team.RemoveAllHeroes();
|
for (int i = 0; i < guidList.Count; i++)
|
{
|
team.AddHero(HeroManager.Instance.GetHero(guidList[i]), i);
|
}
|
|
TeamChangeEvent(new List<int>() { 0, 1, 2, 3, 4, 5 }, -1, Vector3.zero);
|
|
}
|
|
void SaveTeam()
|
{
|
var team = TeamManager.Instance.GetTeam(HeroUIManager.Instance.selectTeamType);
|
team.SaveTeam();
|
}
|
|
void SelectTeamFunc(TeamType type)
|
{
|
if (HeroUIManager.Instance.selectTeamType == type)
|
{
|
return;
|
}
|
HeroUIManager.Instance.selectTeamPosJob = 0;
|
HeroUIManager.Instance.selectTeamPosCountry = 0;
|
HeroUIManager.Instance.selectTeamType = type;
|
HeroUIManager.Instance.SortHeroOnTeamList();
|
Refresh();
|
heroListScroller.m_Scorller.RefreshActiveCellViews();
|
}
|
|
protected void OnTeamChange(TeamType teamType)
|
{
|
if (HeroUIManager.Instance.selectTeamType == teamType)
|
{
|
HeroUIManager.Instance.SortHeroOnTeamList();
|
heroListScroller.m_Scorller.RefreshActiveCellViews();
|
}
|
}
|
}
|