TH1/My project/Assets/Scripts/UI/LibraryUI.cs
2025-07-16 15:37:19 +08:00

373 lines
14 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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);
}
}
}