373 lines
14 KiB
C#
373 lines
14 KiB
C#
using UnityEngine;
|
||
using Logic;
|
||
using RuntimeData;
|
||
using Animancer;
|
||
using UnityEngine.UI;
|
||
using System.Collections.Generic;
|
||
using System.Net;
|
||
using Logic.Multilingual;
|
||
using TH1Resource;
|
||
using TMPro;
|
||
using YooAsset.Editor;
|
||
|
||
public enum LibraryTabType
|
||
{
|
||
Force,
|
||
Giant,
|
||
Wonder,
|
||
Achievement
|
||
}
|
||
|
||
public class LibraryUI
|
||
{
|
||
private Main _main;
|
||
private MapData _mapData;
|
||
public GameObject ROLibraryUI;
|
||
|
||
public bool NeedShow = false;
|
||
|
||
private bool _isShowing = false;
|
||
private bool _isAnimating = false;
|
||
private float _fadeDuration = 0.2f;
|
||
|
||
public Button ForceButton;
|
||
public Button GiantButton;
|
||
public Button WonderButton;
|
||
public Button AchievementButton;
|
||
|
||
public Transform SelectedGiantListItem;
|
||
public Transform DefaultGiantListItem;
|
||
|
||
private class LibraryTab
|
||
{
|
||
public LibraryTabType Type;
|
||
public GameObject Panel;
|
||
public string FadeInClipPath;
|
||
public string FadeOutClipPath;
|
||
|
||
public LibraryTab(LibraryTabType type, GameObject panel, string fadeIn, string fadeOut)
|
||
{
|
||
Type = type;
|
||
Panel = panel;
|
||
FadeInClipPath = fadeIn;
|
||
FadeOutClipPath = fadeOut;
|
||
}
|
||
}
|
||
|
||
private Dictionary<LibraryTabType, LibraryTab> _tabs = new();
|
||
private LibraryTabType? _currentTab = null;
|
||
|
||
public LibraryUI(Main main, MapData mapData)
|
||
{
|
||
_main = main;
|
||
_mapData = mapData;
|
||
ROLibraryUI = UIManager.Instance.ROUIManager.transform.Find("GameUI/LibraryUI").gameObject;
|
||
ROLibraryUI.transform.Find("CloseButton").GetComponent<Button>().onClick.AddListener(
|
||
() => {
|
||
NeedShow = false;
|
||
UIManager.Instance.GameUI.MainUI.NeedShow = true;
|
||
});
|
||
ROLibraryUI.gameObject.SetActive(false);
|
||
|
||
Init();
|
||
}
|
||
|
||
public void Init()
|
||
{
|
||
ForceButton = ROLibraryUI.transform.Find("TopBar/Force").GetComponent<Button>();
|
||
GiantButton = ROLibraryUI.transform.Find("TopBar/Giant").GetComponent<Button>();
|
||
WonderButton = ROLibraryUI.transform.Find("TopBar/Wonder").GetComponent<Button>();
|
||
AchievementButton = ROLibraryUI.transform.Find("TopBar/Achievement").GetComponent<Button>();
|
||
|
||
_tabs[LibraryTabType.Force] = new LibraryTab(
|
||
LibraryTabType.Force,
|
||
ROLibraryUI.transform.Find("Force").gameObject,
|
||
"Animations/UI/LibraryForceUIFadeIn",
|
||
"Animations/UI/LibraryForceUIFadeOut");
|
||
|
||
_tabs[LibraryTabType.Giant] = new LibraryTab(
|
||
LibraryTabType.Giant,
|
||
ROLibraryUI.transform.Find("Giant").gameObject,
|
||
"Animations/UI/LibraryGiantUIFadeIn",
|
||
"Animations/UI/LibraryGiantUIFadeOut");
|
||
|
||
_tabs[LibraryTabType.Wonder] = new LibraryTab(
|
||
LibraryTabType.Wonder,
|
||
ROLibraryUI.transform.Find("Wonder").gameObject,
|
||
"Animations/UI/LibraryWonderUIFadeIn",
|
||
"Animations/UI/LibraryWonderUIFadeOut");
|
||
|
||
_tabs[LibraryTabType.Achievement] = new LibraryTab(
|
||
LibraryTabType.Achievement,
|
||
ROLibraryUI.transform.Find("Achievement").gameObject,
|
||
"Animations/UI/LibraryAchievementUIFadeIn",
|
||
"Animations/UI/LibraryAchievementUIFadeOut");
|
||
|
||
//ForceButton.onClick.AddListener(() => SwitchTab(LibraryTabType.Force));
|
||
GiantButton.onClick.AddListener(() =>
|
||
{
|
||
|
||
SwitchTab(LibraryTabType.Giant);
|
||
});
|
||
WonderButton.onClick.AddListener(() =>
|
||
{
|
||
UpdateWonderListData();
|
||
SwitchTab(LibraryTabType.Wonder);
|
||
});
|
||
//AchievementButton.onClick.AddListener(() => SwitchTab(LibraryTabType.Achievement));
|
||
|
||
|
||
//设置各种初始化值
|
||
_currentTab = LibraryTabType.Giant;
|
||
DefaultGiantListItem = ROLibraryUI.transform.Find("Giant/LibraryGiantListPanel/Scroll View/Viewport/Content")?.GetChild(0)?.GetChild(0);
|
||
UpdateGiantListData();
|
||
InitSubPanel(LibraryTabType.Giant);
|
||
}
|
||
|
||
public void UpdateGiantListData()
|
||
{
|
||
var table = ROLibraryUI.transform.Find("Giant/LibraryGiantListPanel/Scroll View/Viewport/Content");
|
||
|
||
|
||
//构造needList,需要展示的giant list
|
||
int needCount = 5;
|
||
var needList = new List<GiantType>();
|
||
needList.Add(GiantType.EgyptianRemilia);
|
||
needList.Add(GiantType.EgyptianPatchouli);
|
||
needList.Add(GiantType.EgyptianSakuya);
|
||
needList.Add(GiantType.EgyptianFlandre);
|
||
needList.Add(GiantType.EgyptianMeiling);
|
||
//根据需要展示的情况,确定table下的显示位置够不够,多的setactive false,少的clone
|
||
int hasCount = table.childCount * 3;
|
||
//如果坑位少于需要展示的数量,增加坑位
|
||
var sampleRow = table.Find("SampleRow");
|
||
while (hasCount < needCount)
|
||
{
|
||
GameObject.Instantiate(sampleRow, table);
|
||
hasCount += 3;
|
||
}
|
||
//将最后一行多出来的坑位setactive false
|
||
int lastCount = needCount;
|
||
while (lastCount < hasCount)
|
||
{
|
||
table.GetChild(lastCount / 3).GetChild(lastCount % 3).gameObject.SetActive(false);
|
||
lastCount++;
|
||
}
|
||
|
||
|
||
//设置每一个giant
|
||
for(int i = 0;i < needList.Count; i++)
|
||
{
|
||
var giant = needList[i];
|
||
if(!Table.Instance.UnitTypeDataAssets.GetUnitTypeInfo(UnitType.Giant, giant, out var unitInfo))continue;
|
||
//更换sprite
|
||
if (table.GetChild(i / 3) == null) continue;
|
||
var slot = table.GetChild( i / 3).GetChild(i % 3);
|
||
if (slot == null) continue;
|
||
slot.Find("TribeIconMask/TribeIcon").GetComponent<Image>().sprite = unitInfo.Sprite;
|
||
//如果是giantCivId !=0 默认锁角色
|
||
if (unitInfo.GiantCivId != 0) continue;
|
||
//处理remilia 阵营
|
||
slot.Find("TribeIconMask").GetComponent<Image>().color = Color.white;
|
||
slot.Find("TribeIconMask/TribeIcon").GetComponent<Image>().color = Color.white;
|
||
slot.Find("TribeIconMask/Locked").gameObject.SetActive(false);
|
||
|
||
Button slotButton = slot.GetComponent<Button>();
|
||
if (slotButton == null)
|
||
slotButton = slot.gameObject.AddComponent<Button>();
|
||
|
||
// 移除旧的监听器,防止重复添加
|
||
slotButton.onClick.RemoveAllListeners();
|
||
// 添加新的监听器,使用 lambda 表达式捕获当前的 giant 变量
|
||
Debug.Log(giant);
|
||
slotButton.onClick.AddListener(() =>
|
||
{
|
||
// 当按钮被点击时,调用 UpdateGiantInfoData 并传入对应的 GiantType
|
||
GiantListItemOnClick(table,slot,giant);
|
||
});
|
||
}
|
||
|
||
}
|
||
|
||
public void GiantListItemOnClick(Transform table, Transform selected, GiantType giant)
|
||
{
|
||
//消除之前选中对象的红圈,换成当前这个
|
||
SelectedGiantListItem?.Find("TribeIconMask/Selected")?.gameObject.SetActive(false);
|
||
selected.Find("TribeIconMask/Selected")?.gameObject.SetActive(true);
|
||
SelectedGiantListItem = selected;
|
||
|
||
var infoPanel = ROLibraryUI.transform.Find("Giant/LibraryGiantInfoPanel");
|
||
infoPanel.GetComponent<AnimancerComponent>()?.Play(ResourceCache.Instance.AnimCache.UICommonPanelFadeOut);
|
||
|
||
Timer.Instance.TimerRegister(this, () =>
|
||
{
|
||
UpdateGiantInfoData(giant);
|
||
infoPanel.GetComponent<AnimancerComponent>()?.Play(ResourceCache.Instance.AnimCache.UICommonPanelFadeIn);
|
||
},ResourceCache.Instance.AnimCache.UICommonPanelFadeOut.length);
|
||
}
|
||
|
||
public void UpdateGiantInfoData(GiantType giant)
|
||
{
|
||
Debug.Log(giant);
|
||
if (!Table.Instance.UnitTypeDataAssets.GetUnitTypeInfo(UnitType.Giant, giant, out var unitInfo)) return;
|
||
if (!Table.Instance.LibraryDataAssets.GetLibraryInfoByGiant(giant, out var libraryInfo)) return;
|
||
if (!Table.Instance.PlayerDataAssets.GetPlayerInfoByCivId(unitInfo.GiantCivId,unitInfo.GiantForceId, out var playerInfo)) return;
|
||
var image = ROLibraryUI.transform.Find("Giant/LibraryGiantInfoPanel/GiantImage/Img");
|
||
var info = ROLibraryUI.transform.Find("Giant/LibraryGiantInfoPanel/GiantInfo");
|
||
//设置立绘
|
||
image.GetComponent<Image>().sprite = libraryInfo.Illust;
|
||
//设置英文名称装饰
|
||
if(ROLibraryUI.transform.Find("Giant/LibraryGiantInfoPanel/TitleEN"))
|
||
ROLibraryUI.transform.Find("Giant/LibraryGiantInfoPanel/TitleEN").GetComponent<TextMeshProUGUI>().text = libraryInfo.EnglishName.ToUpper();
|
||
//设置角色名称
|
||
Debug.Log(libraryInfo.Name);
|
||
MultilingualManager.Instance.SetUIText(ROLibraryUI.transform.Find("Giant/LibraryGiantInfoPanel/Title")?.GetComponent<TextMeshProUGUI>(),libraryInfo.Name);
|
||
//设置帝国名称
|
||
//设置角色介绍
|
||
MultilingualManager.Instance.SetUIText(info.Find("Info1/Desc")?.GetComponent<TextMeshProUGUI>(),libraryInfo.Desc);
|
||
//设置角色读白
|
||
MultilingualManager.Instance.SetUIText(info.Find("Info1/Diag/Text")?.GetComponent<TextMeshProUGUI>(),libraryInfo.Diag);
|
||
//设置角色读白角色头像
|
||
info.Find("Info1/Diag/AvatarCircle/Avatar").GetComponent<Image>().sprite = unitInfo.Sprite;
|
||
//设置角色读白对话框背景颜色
|
||
if(info.Find("Info1/Diag") != null)
|
||
info.Find("Info1/Diag").GetComponent<Image>().color = libraryInfo.DiagColor;
|
||
|
||
|
||
//处理成就
|
||
uint bigid = 2;
|
||
uint smallid = giant switch
|
||
{
|
||
GiantType.EgyptianMeiling => 5,
|
||
GiantType.EgyptianFlandre => 4,
|
||
GiantType.EgyptianSakuya => 3,
|
||
GiantType.EgyptianPatchouli => 2,
|
||
_ => 1
|
||
};
|
||
for (uint i = 0; i < 3; i++)
|
||
{
|
||
//star坑位
|
||
var star = info.Find($"Info3/Star{i + 1}/Star")?.GetComponent<Image>();
|
||
//成就标题star坑位
|
||
var title = info.Find($"Info3/Star{i + 1}/Title")?.GetComponent<TextMeshProUGUI>();
|
||
//成就描述star坑位
|
||
var desc = info.Find($"Info3/Star{i + 1}/Desc")?.GetComponent<TextMeshProUGUI>();
|
||
|
||
var infoData = AchievementDataManager.Instance.Achievement.GetAchievementItem(bigid, smallid, i + 1);
|
||
bool finished = AchievementDataManager.Instance.IsFinished(bigid, smallid, i);
|
||
if (infoData == null) continue;
|
||
MultilingualManager.Instance.SetUIText(title,infoData.Name);
|
||
MultilingualManager.Instance.SetUIText(desc,infoData.Desc);
|
||
if (star != null)
|
||
star.sprite = finished ? ResourceCache.Instance.SpriteCache.AchievementStar : ResourceCache.Instance.SpriteCache.AchievementStarGray ;
|
||
|
||
}
|
||
|
||
}
|
||
|
||
public void UpdateWonderListData()
|
||
{
|
||
return;
|
||
var fa = ROLibraryUI.transform.Find("Wonder").Find("WonderListPanel").Find("WonderList");
|
||
for (int i = 0; i < 4; i++)
|
||
for(int j = 0;j < 7; j++)
|
||
{
|
||
var p = fa.Find($"LibraryWonder{i}").Find($"LibraryWonderItem ({j})");
|
||
/*p.Find("TribeIconMask").Find("GroundIcon").GetComponent<Image>().sprite
|
||
= null;*/
|
||
p.Find("Size/TribeIconMask/TribeIcon").GetComponent<Image>().sprite
|
||
= Table.Instance.GridAndResourceDataAssets.WonderInfoList[i * 7 + j].Sprite;
|
||
|
||
}
|
||
}
|
||
|
||
public void Update()
|
||
{
|
||
if (_isAnimating) return;
|
||
|
||
if (NeedShow && !ROLibraryUI.activeSelf)
|
||
{
|
||
Show();
|
||
}
|
||
else if (!NeedShow && ROLibraryUI.activeSelf)
|
||
{
|
||
Hide();
|
||
}
|
||
}
|
||
|
||
public void Show()
|
||
{
|
||
if (_isShowing || _isAnimating) return;
|
||
|
||
_isShowing = true;
|
||
_isAnimating = true;
|
||
ROLibraryUI.SetActive(true);
|
||
|
||
var animancer = ROLibraryUI.GetComponent<AnimancerComponent>();
|
||
var fadeIn = ResourceCache.Instance.AnimCache.UICommonPanelFadeIn;
|
||
animancer.Play(fadeIn);
|
||
if (_currentTab == LibraryTabType.Giant)
|
||
UpdateGiantListData();
|
||
SwitchTab(LibraryTabType.Giant);
|
||
Timer.Instance.TimerRegister(ROLibraryUI, () =>
|
||
{
|
||
_isAnimating = false;
|
||
}, fadeIn.length);
|
||
}
|
||
|
||
|
||
public void Hide()
|
||
{
|
||
if (!_isShowing || _isAnimating) return;
|
||
|
||
_isShowing = false;
|
||
_isAnimating = true;
|
||
|
||
var animancer = ROLibraryUI.GetComponent<AnimancerComponent>();
|
||
var fadeOut = Resources.Load<AnimationClip>("Animations/UI/LibraryUIFadeOut");
|
||
if (fadeOut != null) animancer.Play(fadeOut);
|
||
|
||
Timer.Instance.TimerRegister(ROLibraryUI, () =>
|
||
{
|
||
ROLibraryUI.SetActive(false);
|
||
_isAnimating = false;
|
||
}, _fadeDuration);
|
||
}
|
||
|
||
private void SwitchTab(LibraryTabType target)
|
||
{
|
||
if (_currentTab == target) return;
|
||
|
||
if (_currentTab.HasValue)
|
||
{
|
||
var oldTab = _tabs[_currentTab.Value];
|
||
var animancerOut = oldTab.Panel.GetComponent<AnimancerComponent>();
|
||
var fadeOut = Resources.Load<AnimationClip>(oldTab.FadeOutClipPath);
|
||
if (fadeOut != null) animancerOut.Play(fadeOut);
|
||
Timer.Instance.TimerRegister(oldTab.Panel, () => oldTab.Panel.SetActive(false), _fadeDuration);
|
||
}
|
||
|
||
var newTab = _tabs[target];
|
||
newTab.Panel.SetActive(true);
|
||
var animancerIn = newTab.Panel.GetComponent<AnimancerComponent>();
|
||
var fadeIn = Resources.Load<AnimationClip>(newTab.FadeInClipPath);
|
||
if (fadeIn != null) animancerIn.Play(fadeIn);
|
||
|
||
_currentTab = target;
|
||
InitSubPanel(target);
|
||
}
|
||
|
||
//每个subpanel都有一个初始化函数,如果切换到这个页面,要进行一次初始化选择(默认选择左上角的单位)
|
||
private void InitSubPanel(LibraryTabType target)
|
||
{
|
||
if (target == LibraryTabType.Giant)
|
||
{
|
||
SelectedGiantListItem?.Find("TribeIconMask/Selected")?.gameObject.SetActive(false);
|
||
DefaultGiantListItem?.Find("TribeIconMask/Selected")?.gameObject.SetActive(true);
|
||
SelectedGiantListItem = DefaultGiantListItem;
|
||
UpdateGiantInfoData(GiantType.EgyptianRemilia);
|
||
|
||
}
|
||
}
|
||
}
|