using System;
|
using UnityEngine;
|
using UnityEngine.UI;
|
using DG.Tweening;
|
|
public class HeroReturnWin : UIBase
|
{
|
[SerializeField] RectTransform activeRect;
|
[SerializeField] RectTransform moveRect;
|
[SerializeField] RectTransform startRect;
|
[SerializeField] RectTransform endRect;
|
|
[SerializeField] ImageEx bgImage;
|
[SerializeField] ImageEx titleImage;
|
[SerializeField] TextEx timeText;
|
[SerializeField] ButtonEx animationButton;
|
[SerializeField] ButtonEx checkInButton; // 签到赠礼
|
[SerializeField] RedpointBehaviour checkInRedpoint;
|
[SerializeField] ButtonEx starUpButton; // 升星计划
|
[SerializeField] RedpointBehaviour starUpRedpoint;
|
[SerializeField] ButtonEx shopButton; // 兑换商店
|
[SerializeField] RedpointBehaviour shopRedpoint;
|
[SerializeField] ImageEx skinImage;
|
[SerializeField] ButtonEx skinButton; // 时装特卖
|
[SerializeField] ButtonEx giftButton; // 皇权礼包
|
[SerializeField] RedpointBehaviour giftRedpoint;
|
[SerializeField] ButtonEx callButton; // 皇权招募
|
[SerializeField] UIHeroController uiHeroController;
|
[SerializeField] UIHeroController lhController;
|
[SerializeField] Image callRedImage;
|
[SerializeField] ButtonEx closeButton;
|
[SerializeField] float modleSize = 0.8f;
|
|
// 轮播相关
|
private const float CarouselInterval = 5f; // 轮播间隔5秒
|
private const float FadeDuration = 0.4f; // 渐变时长
|
private int[] heroIdList; // 武将ID列表
|
private int currentHeroIndex; // 当前武将索引
|
private bool isCarouselActive; // 是否正在轮播
|
private Tween carouselTween; // 轮播淡入淡出tween
|
private float carouselTimer; // 轮播计时器
|
|
HeroReturnManager manager => HeroReturnManager.Instance;
|
|
protected override void InitComponent()
|
{
|
closeButton.SetListener(() => UIManager.Instance.CloseWindow<HeroReturnWin>());
|
checkInButton.SetListener(() => UIManager.Instance.OpenWindow<HeroReturnCheckInWin>());
|
starUpButton.SetListener(() =>
|
{
|
|
if (manager.IsLockStarHero(manager.GetOperationHeroAppearInfo()))
|
{
|
UIManager.Instance.OpenWindow<HeroReturnStarUpWin>();
|
return;
|
}
|
|
if (!manager.LoadStarUpChooseHeroStateKey(manager.GetOperationHeroAppearInfo()))
|
{
|
UIManager.Instance.OpenWindow<HeroReturnStarUpChangeWin>();
|
return;
|
}
|
UIManager.Instance.OpenWindow<HeroReturnStarUpWin>();
|
});
|
shopButton.SetListener(() => UIManager.Instance.OpenWindow<HeroReturnShopWin>());
|
skinButton.SetListener(() => UIManager.Instance.OpenWindow<HeroReturnSkinWin>());
|
giftButton.SetListener(() => UIManager.Instance.OpenWindow<HeroReturnGiftWin>());
|
callButton.SetListener(() => UIManager.Instance.OpenWindow<HeroReturnCallWin>());
|
}
|
|
protected override void OnPreOpen()
|
{
|
InitRedpoint();
|
|
GlobalTimeEvent.Instance.secondEvent += OnSecondEvent;
|
RechargeManager.Instance.rechargeCountEvent += OnRechargeCountEvent;
|
StoreModel.Instance.RefreshBuyShopLimitEvent += Display;
|
manager.OnUpdateHeroAppearPlayerInfoEvent += OnUpdateHeroAppearPlayerInfoEvent;
|
Display();
|
}
|
|
protected override void OnPreClose()
|
{
|
StopCarousel();
|
GlobalTimeEvent.Instance.secondEvent -= OnSecondEvent;
|
RechargeManager.Instance.rechargeCountEvent -= OnRechargeCountEvent;
|
StoreModel.Instance.RefreshBuyShopLimitEvent -= Display;
|
manager.OnUpdateHeroAppearPlayerInfoEvent -= OnUpdateHeroAppearPlayerInfoEvent;
|
}
|
|
private void OnUpdateHeroAppearPlayerInfoEvent()
|
{
|
Display();
|
}
|
|
private void OnRechargeCountEvent(int obj)
|
{
|
Display();
|
}
|
|
public void InitRedpoint()
|
{
|
checkInRedpoint.redpointId = manager.GetRedPointId(HeroReturnRedPointType.CheckIn);
|
starUpRedpoint.redpointId = manager.GetRedPointId(HeroReturnRedPointType.StarUp);
|
shopRedpoint.redpointId = manager.GetRedPointId(HeroReturnRedPointType.Shop);
|
giftRedpoint.redpointId = manager.GetRedPointId(HeroReturnRedPointType.Gift);
|
}
|
|
private void Display()
|
{
|
var act = manager.GetOperationHeroAppearInfo();
|
if (act == null) return;
|
|
var config = ActHeroAppearConfig.Get(act.CfgID);
|
if (config == null || config.ActHeroIDList.IsNullOrEmpty()) return;
|
|
// 获取武将列表
|
heroIdList = config.ActHeroIDList;
|
currentHeroIndex = 0;
|
|
// 如果只有一个武将,不轮播,直接显示
|
if (heroIdList.Length <= 1)
|
{
|
StopCarousel();
|
DisplayHero(heroIdList[0], false);
|
}
|
else
|
{
|
// 多个武将,开启轮播
|
carouselTimer = 0f;
|
DisplayHero(heroIdList[currentHeroIndex], false);
|
StartCarousel();
|
}
|
|
callRedImage.SetActive(!manager.IsShopVisitedToday || manager.HasGiftCanHave());
|
OnSecondEvent();
|
}
|
|
private void LateUpdate()
|
{
|
if (!isCarouselActive) return;
|
if (heroIdList == null || heroIdList.Length <= 1) return;
|
|
// 检查是否存在更高层级的窗口,如果有则不播放轮播
|
if (UIManager.Instance.ExistAnySameLevelWinHigherSortingOrder(uiLayer, uiName))
|
{
|
return;
|
}
|
|
carouselTimer += Time.deltaTime;
|
if (carouselTimer >= CarouselInterval)
|
{
|
carouselTimer = 0f;
|
// 切换到下一个武将
|
currentHeroIndex = (currentHeroIndex + 1) % heroIdList.Length;
|
int nextHeroID = heroIdList[currentHeroIndex];
|
// 带动画切换
|
DisplayHero(nextHeroID, true);
|
}
|
}
|
|
/// <summary>
|
/// 显示指定武将的背景和立绘
|
/// </summary>
|
private void DisplayHero(int heroID, bool withAnimation)
|
{
|
var artConfig = ActHeroReturnArtConfig.Get(heroID);
|
if (artConfig == null) return;
|
|
int skinID = manager.GetDefaultSkinID(heroID);
|
var skinConfig = HeroSkinConfig.Get(skinID);
|
if (skinConfig == null) return;
|
|
int mainSkinID = artConfig.MainSkinID;
|
|
if (withAnimation)
|
{
|
carouselTween?.Kill();
|
|
Sequence seq = DOTween.Sequence();
|
seq.Append(bgImage.DOFade(0.7f, FadeDuration));
|
|
CanvasGroup lhCanvasGroup = lhController.GetComponent<CanvasGroup>();
|
if (lhCanvasGroup == null)
|
{
|
lhCanvasGroup = lhController.gameObject.AddComponent<CanvasGroup>();
|
}
|
seq.Join(lhCanvasGroup.DOFade(0f, FadeDuration));
|
|
seq.OnComplete(() =>
|
{
|
UpdateHeroDisplay(heroID, skinID, artConfig, mainSkinID);
|
// 淡入
|
bgImage.DOFade(1f, FadeDuration);
|
lhCanvasGroup.DOFade(1f, FadeDuration);
|
});
|
|
carouselTween = seq;
|
}
|
else
|
{
|
UpdateHeroDisplay(heroID, skinID, artConfig, mainSkinID);
|
CanvasGroup lhCanvasGroup = lhController.GetComponent<CanvasGroup>();
|
if (lhCanvasGroup != null)
|
{
|
lhCanvasGroup.alpha = 1f;
|
}
|
}
|
}
|
|
/// <summary>
|
/// 更新武将显示资源
|
/// </summary>
|
private void UpdateHeroDisplay(int heroID, int skinID, ActHeroReturnArtConfig artConfig, int mainSkinID)
|
{
|
int chosenHeroSkinID = manager.GetDefaultSkinID(
|
manager.LoadCallChooseHeroStateKey(manager.GetOperationHeroAppearInfo()) ?
|
manager.GetCurrentDisplayCallHeroId() :
|
manager.GetFirstHeroId());
|
uiHeroController.Create(chosenHeroSkinID, modleSize);
|
|
uiHeroController.transform.localScale = new Vector3(-modleSize, modleSize, modleSize);
|
lhController.Create(skinID, 1, motionName: "", isLh: true);
|
|
// 更新背景
|
bgImage.SetSprite(StringUtility.Concat("HeroReturnMainBG_", heroID.ToString()));
|
bgImage.SetNativeSize();
|
|
// 更新标题
|
titleImage.SetSprite(StringUtility.Concat("HeroReturnMainTitle_", heroID.ToString()));
|
titleImage.SetNativeSize();
|
|
// 更新皮肤图片
|
int firstHeroID = manager.GetFirstHeroId();
|
var firstHeroIDArtConfig = ActHeroReturnArtConfig.Get(firstHeroID);
|
if (firstHeroIDArtConfig == null) return;
|
skinImage.SetSprite(StringUtility.Concat("HeroReturnSkinEnterBG_", firstHeroIDArtConfig.MainSkinID.ToString()));
|
}
|
|
/// <summary>
|
/// 开始轮播
|
/// </summary>
|
private void StartCarousel()
|
{
|
if (isCarouselActive) return;
|
isCarouselActive = true;
|
carouselTimer = 0f;
|
}
|
|
/// <summary>
|
/// 停止轮播
|
/// </summary>
|
private void StopCarousel()
|
{
|
isCarouselActive = false;
|
carouselTimer = 0f;
|
carouselTween?.Kill();
|
carouselTween = null;
|
}
|
|
private void OnSecondEvent()
|
{
|
manager.GetActTimeStr(timeText);
|
}
|
}
|