TH1/Unity/Assets/Scripts/TH1_UI/View/Info/UIInfoTechTreeView.cs
2025-11-24 12:24:50 +08:00

154 lines
4.3 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 System;
using System.Collections.Generic;
using Animancer;
using Logic;
using Logic.Action;
using Logic.Audio;
using Logic.CrashSight;
using Logic.Multilingual;
using RuntimeData;
using TH1_Core.Events;
using TH1_Logic.Core;
using TH1_UI.Components;
using TH1_UI.HintUI;
using TH1Resource;
using TMPro;
using UI.HintUI;
using UnityEngine;
using UnityEngine.UI;
//用于匹配科技树视觉位置的enum标记
public enum TechTreeCircleViewType { t1,t2,t3,t4,t5,t11,t12,t21,t22,t31,t32,t41,t42,t51,t52,t110,t120,t210,t220,t310,t320,t410,t420,t510,t520 }
namespace TH1_UI.View.Info
{
public class UIInfoTechTreeView : Base.View
{
public Button closeButton;
public ViDelegateAssisstant.Dele OnBtnCloseClick;
[System.Serializable]
public class TechTreeCirclePair
{
public TechTreeCircleViewType ViewType;
public UIInfoTechTreeCircleMono CircleMono;
}
public List< TechTreeCirclePair > TechTreeCircleMonoList;
private CivEnum _showCivEnum = CivEnum.Common;
private ForceEnum _showForceEnum = ForceEnum.Common;
[Header("TreeLine相关")]
public List<UIInfoTechTreeViewTypeMono> treeLineList;
public Color TreeLineColorYellow;
public Color TreeLineColorGray;
public Color TreeLineColorWhite;
[Header("子窗口相关")]
public UIInfoTechTreeCheckPanelMono CheckPanel;
protected override void InitStart()
{
base.InitStart();
closeButton.onClick.RemoveAllListeners();
closeButton.onClick.AddListener(() => { OnBtnCloseClick.Invoke(); });
CheckPanel.InitStart(RefreshStatus);
}
public bool InitAllTechCircle()
{
//Step #1 获得当前player和playerInfo
var viewPlayer = Main.MapData.PlayerMap.SelfPlayerData;
if (viewPlayer == null || !Table.Instance.PlayerDataAssets.GetPlayerInfo(viewPlayer, out var playerInfo))
{
LogSystem.LogError("UIInfoTechTreeView.InitAllTechCircle(): viewPlayer or playerInfo is null");
return false;
}
//Step #2
foreach (var tech in playerInfo.TechPool)
{
if (!Table.Instance.TechDataAssets.GetTechInfo(tech, out var techInfo)) continue;
foreach(var techCircleMonoPair in TechTreeCircleMonoList)
if (techCircleMonoPair.ViewType == techInfo.TechTreeCircleViewType)
{
techCircleMonoPair.CircleMono.SetContent(techInfo,OnCircleClick);
break;
}
}
return true;
}
public void RefreshStatus()
{
//Step #1 获得当前player和playerInfo
var viewPlayer = Main.MapData.PlayerMap.SelfPlayerData;
if (viewPlayer == null || !Table.Instance.PlayerDataAssets.GetPlayerInfo(viewPlayer, out var playerInfo))
{
LogSystem.LogError("UIInfoTechTreeView.InitAllTechCircle(): viewPlayer or playerInfo is null");
return;
}
//Step #2 处理每个circle
foreach (var tech in playerInfo.TechPool)
{
if (!Table.Instance.TechDataAssets.GetTechInfo(tech, out var techInfo)) continue;
foreach(var techCircleMonoPair in TechTreeCircleMonoList)
if (techCircleMonoPair.ViewType == techInfo.TechTreeCircleViewType)
{
techCircleMonoPair.CircleMono.RefreshStatus(techInfo);
break;
}
}
//Step #3 处理每个TreeLine和TreeNode
foreach (var line in treeLineList)
{
if (line.IsNode)
line.GetComponent<Image>().color = TreeLineColorWhite;
else
line.GetComponent<Image>().color = TreeLineColorYellow;
}
foreach (var tech in playerInfo.TechPool)
{
if (viewPlayer.TechTree.CheckIfTechCanLearn(tech) || viewPlayer.TechTree.CheckIfHasTech(tech)) continue;
if (!Table.Instance.TechDataAssets.GetTechInfo(tech, out var techInfo)) continue;
foreach (var line in treeLineList)
if (line.viewType == techInfo.TechTreeCircleViewType)
line.GetComponent<Image>().color = TreeLineColorGray;
}
}
public void SetContent()
{
var player = Main.MapData.PlayerMap.SelfPlayerData;
//Step #1 开局初始化 如果目前科技树上的circle已经是上一局的老版本或者这是第一次打开科技树
if(_showCivEnum != player.CivEnum || _showForceEnum != player.ForceEnum)
InitAllTechCircle();
RefreshStatus();
//Step #6 设置BGM
//AudioManager.Instance.PlayMusic(info.MusicName,1f,2f,true);
}
public void OnCircleClick(TechType techType)
{
CheckPanel.Open(techType);
}
public void CloseView()
{
AudioManager.Instance.StopMusic();
}
}
}