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()); checkInButton.SetListener(() => UIManager.Instance.OpenWindow()); starUpButton.SetListener(() => { if (manager.IsLockStarHero(manager.GetOperationHeroAppearInfo())) { UIManager.Instance.OpenWindow(); return; } if (!manager.LoadStarUpChooseHeroStateKey(manager.GetOperationHeroAppearInfo())) { UIManager.Instance.OpenWindow(); return; } UIManager.Instance.OpenWindow(); }); shopButton.SetListener(() => UIManager.Instance.OpenWindow()); skinButton.SetListener(() => UIManager.Instance.OpenWindow()); giftButton.SetListener(() => UIManager.Instance.OpenWindow()); callButton.SetListener(() => UIManager.Instance.OpenWindow()); } 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); } } /// /// 显示指定武将的背景和立绘 /// 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(); if (lhCanvasGroup == null) { lhCanvasGroup = lhController.gameObject.AddComponent(); } 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(); if (lhCanvasGroup != null) { lhCanvasGroup.alpha = 1f; } } } /// /// 更新武将显示资源 /// 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())); } /// /// 开始轮播 /// private void StartCarousel() { if (isCarouselActive) return; isCarouselActive = true; carouselTimer = 0f; } /// /// 停止轮播 /// private void StopCarousel() { isCarouselActive = false; carouselTimer = 0f; carouselTween?.Kill(); carouselTween = null; } private void OnSecondEvent() { manager.GetActTimeStr(timeText); } }