using System.Collections.Generic;
|
using UnityEngine;
|
using UnityEngine.UI;
|
|
public class HeroReturnSkinWin : UIBase
|
{
|
[SerializeField] float modelScale = 1f;
|
[SerializeField] RawImage bgImage;
|
[SerializeField] ImageEx heroNameImage;
|
[SerializeField] ImageEx skinInfoImage;
|
[SerializeField] ImageEx awardBgImage;
|
[SerializeField] TextEx timeText;
|
[SerializeField] ButtonEx buyButton;
|
[SerializeField] ImageEx buyImage;
|
[SerializeField] ImageEx countryImage;
|
[SerializeField] TextEx buyText;
|
[SerializeField] ButtonEx closeButton;
|
[SerializeField] UIHeroController uiHeroController;
|
[SerializeField] UIHeroController lhController;
|
[SerializeField] ScrollerController awardScroller;
|
[SerializeField] ScrollerController tabScroller;
|
[SerializeField] Color numColor;
|
[SerializeField] TextEx[] wearAttrText;
|
[SerializeField] TextEx[] roleAttrText;
|
[SerializeField] ButtonEx infoButton;
|
HeroReturnManager manager => HeroReturnManager.Instance;
|
protected override void InitComponent()
|
{
|
closeButton.SetListener(CloseWindow);
|
infoButton.SetListener(() =>
|
{
|
int heroID = manager.GetHeroIDBySkinID(manager.currentChooseSkinID);
|
HeroUIManager.Instance.selectForPreviewHeroID = heroID;
|
HeroUIManager.Instance.selectSkinIndex = manager.GetSkinIndexInHeroConfig(heroID, manager.currentChooseSkinID);
|
UIManager.Instance.OpenWindow<HeroBestBaseWin>(1);
|
});
|
}
|
|
protected override void OnPreOpen()
|
{
|
GlobalTimeEvent.Instance.secondEvent += OnSecondEvent;
|
RechargeManager.Instance.rechargeCountEvent += OnRechargeCountEvent;
|
awardScroller.OnRefreshCell += OnRefreshAwardCell;
|
tabScroller.OnRefreshCell += OnRefreshTabCell;
|
manager.OnCurrentChooseSkinIDChangeEevent += OnCurrentChooseSkinIDChange;
|
CreateTabScroller();
|
Display();
|
}
|
|
protected override void OnPreClose()
|
{
|
GlobalTimeEvent.Instance.secondEvent -= OnSecondEvent;
|
RechargeManager.Instance.rechargeCountEvent -= OnRechargeCountEvent;
|
awardScroller.OnRefreshCell -= OnRefreshAwardCell;
|
tabScroller.OnRefreshCell -= OnRefreshTabCell;
|
manager.OnCurrentChooseSkinIDChangeEevent -= OnCurrentChooseSkinIDChange;
|
}
|
|
private void OnCurrentChooseSkinIDChange()
|
{
|
tabScroller.m_Scorller.RefreshActiveCellViews();
|
Display();
|
}
|
|
void OnRefreshTabCell(ScrollerDataType type, CellView cell)
|
{
|
var _cell = cell as HeroReturnSkinTabCell;
|
_cell.Display(cell.index, skinIDList);
|
}
|
|
List<int> skinIDList;
|
void CreateTabScroller()
|
{
|
var act = manager.GetOperationHeroAppearInfo();
|
if (act == null) return;
|
|
var config = ActHeroAppearConfig.Get(act.CfgID);
|
if (config == null) return;
|
|
int heroID = manager.GetFirstHeroId();
|
var artConfig = ActHeroReturnArtConfig.Get(heroID);
|
if (artConfig == null) return;
|
|
skinIDList = manager.GetSkinIDList(act.CfgID, heroID, artConfig.MainSkinID);
|
if (skinIDList.IsNullOrEmpty()) return;
|
manager.currentChooseSkinID = skinIDList[0];
|
|
tabScroller.Refresh();
|
for (int i = 0; i < skinIDList.Count; i++)
|
{
|
tabScroller.AddCell(ScrollerDataType.Header, i);
|
}
|
tabScroller.Restart();
|
}
|
|
int[][] arr = null;
|
void OnRefreshAwardCell(ScrollerDataType type, CellView cell)
|
{
|
var _cell = cell as HeroReturnSkinAwardCell;
|
_cell.Display(cell.index, arr);
|
}
|
|
void CreateAwardScroller(int[][] sourceArr)
|
{
|
if (sourceArr == null) return;
|
|
// 1. 获取已拥有的 ID 集合 (使用 LINQ 简洁明了)
|
var ownedItems = HeroSkinAttrConfig.GetItemList();
|
var itemIds = ownedItems != null ? new HashSet<int>(ownedItems) : new HashSet<int>();
|
|
// 2. 过滤掉 items 中已有的项,并直接赋值给成员变量
|
// arr[i][0] 假设为判断是否存在于 items 中的 ID
|
this.arr = System.Array.FindAll(sourceArr, row => !itemIds.Contains(row[0]));
|
|
// 3. 刷新 UI
|
awardScroller.Refresh();
|
for (int i = 0; i < this.arr.Length; i++)
|
{
|
awardScroller.AddCell(ScrollerDataType.Header, i);
|
}
|
awardScroller.Restart();
|
}
|
|
private void OnSecondEvent()
|
{
|
manager.GetActTimeStr(timeText);
|
}
|
|
private void OnRechargeCountEvent(int obj)
|
{
|
Display();
|
}
|
|
public void Display()
|
{
|
var act = manager.GetOperationHeroAppearInfo();
|
if (act == null) return;
|
|
var config = ActHeroAppearConfig.Get(act.CfgID);
|
if (config == null) return;
|
|
int heroID = manager.GetFirstHeroId();
|
var artConfig = ActHeroReturnArtConfig.Get(heroID);
|
if (artConfig == null) return;
|
|
var heroConfig = HeroConfig.Get(heroID);
|
if (heroConfig == null) return;
|
|
int skinID = manager.currentChooseSkinID;
|
|
var heroSkinAttrConfig = HeroSkinAttrConfig.Get(skinID);
|
if (heroSkinAttrConfig == null) return;
|
if (heroSkinAttrConfig.WearAttrIDList == null) return;
|
if (heroSkinAttrConfig.WearAttrValueList == null) return;
|
if (heroSkinAttrConfig.RoleAttrIDList == null) return;
|
if (heroSkinAttrConfig.RoleAttrValueList == null) return;
|
|
var skinIDList = manager.GetSkinIDList(act.CfgID, heroID, skinID);
|
if (skinIDList.IsNullOrEmpty()) return;
|
|
int ctgId = manager.GetCtgIDBySkinID(skinID);
|
var ctgConfig = CTGConfig.Get(ctgId);
|
if (ctgConfig == null) return;
|
|
if (!RechargeManager.Instance.TryGetOrderInfo(ctgId, out var orderConfig)) return;
|
if (!RechargeManager.Instance.TryGetRechargeCount(ctgId, out var rechargeCount)) return;
|
if (!RechargeManager.Instance.TryGetRechargeItem(ctgId, out var rechargeItemList)) return;
|
|
bgImage.SetTexture2D(StringUtility.Concat("HeroReturnSkinBG_", skinID.ToString()));
|
|
heroNameImage.SetSprite(StringUtility.Concat("HeroReturnSkinHeroName_", skinID.ToString()));
|
heroNameImage.SetNativeSize();
|
|
skinInfoImage.SetSprite(StringUtility.Concat("HeroReturnSkinInfo_", skinID.ToString()));
|
skinInfoImage.SetNativeSize();
|
|
awardBgImage.SetSprite(StringUtility.Concat("HeroReturnSkinAwardBG_", skinID.ToString()));
|
awardBgImage.SetNativeSize();
|
|
uiHeroController.Create(skinID, modelScale);
|
lhController.Create(skinID, 1, motionName: "", isLh: true);
|
countryImage.SetSprite(HeroUIManager.Instance.GetCountryIconName(heroConfig.Country));
|
OnSecondEvent();
|
|
CreateAwardScroller(ctgConfig.GainItemList);
|
|
bool isCanBuy = manager.IsNoSellOutCTGID(ctgId);
|
//buyImage.gray = !isCanBuy;
|
buyText.text = !isCanBuy ? Language.Get("storename11") : Language.Get("PayMoneyNum", UIHelper.GetMoneyFormat(orderConfig.PayRMBNumOnSale));
|
|
buyButton.interactable = isCanBuy;
|
buyButton.SetListener(() =>
|
{
|
RechargeManager.Instance.CTG(ctgId);
|
});
|
|
for (int i = 0; i < wearAttrText.Length; i++)
|
SetAttrInfo(0, i, heroSkinAttrConfig, wearAttrText[i]);
|
|
for (int i = 0; i < roleAttrText.Length; i++)
|
SetAttrInfo(1, i, heroSkinAttrConfig, roleAttrText[i]);
|
|
}
|
|
// type 0 穿戴属性值 1 主公属性
|
public void SetAttrInfo(int type, int index, HeroSkinAttrConfig heroSkinAttrConfig, TextEx info)
|
{
|
if (heroSkinAttrConfig == null) return;
|
|
int[] arrID = type == 0 ? heroSkinAttrConfig.WearAttrIDList : heroSkinAttrConfig.RoleAttrIDList;
|
int[] arrValue = type == 0 ? heroSkinAttrConfig.WearAttrValueList : heroSkinAttrConfig.RoleAttrValueList;
|
if (arrID?.Length <= index || arrValue?.Length <= index)
|
{
|
info.text = string.Empty;
|
return;
|
}
|
|
info.text = GetFullDescription(arrID[index], arrValue[index]);
|
}
|
|
string GetFullDescription(int id, long value)
|
{
|
var config = PlayerPropertyConfig.Get(id);
|
if (config == null) return string.Empty;
|
return Language.Get("HeroDebut33", config.ShowName, PlayerPropertyConfig.GetValueDescription(id, value));
|
}
|
}
|