TH1/Unity/Assets/Scripts/TH1_Renderer/CityInfoMono.cs
2026-05-14 16:37:34 +08:00

257 lines
8.0 KiB
C#

using System.Collections;
using System.Collections.Generic;
using Logic.CrashSight;
using Logic.Multilingual;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
namespace TH1_Renderer
{
public class CityInfoMono : MonoBehaviour
{
public RectTransform CityInfoBar;
public Image BG;
public Image ConnectIcon;
public Image CapitalIcon;
public Image EmbassyIcon;
public Image EmbassyWarIcon;
public Image CityStolenIcon;
public Image CoinIcon;
public TextMeshProUGUI CoinText;
public Image TechIcon;
public TextMeshProUGUI TechText;
public Image CultureIcon;
public TextMeshProUGUI CultureText;
public TextMeshProUGUI CityName;
public Transform LevelBar;
public GameObject HousePrefab;
public Color BGBlue;
public Color BGRed;
private List<CityInfoHouseMono> _houseList = null;
private void RebuildCityInfoBar()
{
if (CityInfoBar == null)
{
LogSystem.LogError("CityInfoMono.RebuildCityInfoBar: CityInfoBar is null.");
return;
}
LayoutRebuilder.ForceRebuildLayoutImmediate(CityInfoBar);
}
private bool PrepareHouseList(int level)
{
if (LevelBar == null)
{
LogSystem.LogError("CityInfoMono.PrepareHouseList: LevelBar is null.");
return false;
}
if(_houseList == null)
_houseList = new List<CityInfoHouseMono>();
while (_houseList.Count < level)
{
if (HousePrefab == null)
{
LogSystem.LogError("CityInfoMono.PrepareHouseList: HousePrefab is null.");
return false;
}
var obj = Instantiate(HousePrefab,LevelBar);
if (obj == null)
{
LogSystem.LogError("CityInfoMono.PrepareHouseList: Instantiate HousePrefab failed.");
return false;
}
var mono = obj.GetComponent<CityInfoHouseMono>();
if (mono == null)
{
LogSystem.LogError("CityInfoMono.PrepareHouseList: HousePrefab missing CityInfoHouseMono.");
Destroy(obj);
return false;
}
if (mono.House == null || mono.People == null)
{
LogSystem.LogError("CityInfoMono.PrepareHouseList: CityInfoHouseMono missing House or People reference.");
Destroy(obj);
return false;
}
_houseList.Add(mono);
obj.SetActive(true);
}
for(int i = level;i < _houseList.Count;i++)
_houseList[i]?.gameObject.SetActive(false);
//TODO 这里check是否要强制刷新layout group
return true;
}
public void SetBG(bool self)
{
if (BG == null)
{
LogSystem.LogError("CityInfoMono.SetBG: BG is null.");
return;
}
BG.color = self ? BGBlue : BGRed;
}
public void SetLevelBar(bool showLevelBar,int level,int levelExp,int pop)
{
if (LevelBar == null)
{
LogSystem.LogError("CityInfoMono.SetLevelBar: LevelBar is null.");
return;
}
LevelBar.gameObject.SetActive(showLevelBar);
if (!showLevelBar) return;
level = Mathf.Max(0, level);
if (!PrepareHouseList(level)) return;
var houseCount = _houseList?.Count ?? 0;
var count = Mathf.Min(level, houseCount);
for (int i = 0; i < count; i++)
{
if (_houseList[i] == null)
{
LogSystem.LogError("CityInfoMono.SetLevelBar: houseList item is null.");
continue;
}
CityInfoHouseMono.CityInfoHouseStatusEnum status = i + 1 > Mathf.Abs(levelExp) ? CityInfoHouseMono.CityInfoHouseStatusEnum.NoExp:
(levelExp > 0 ? CityInfoHouseMono.CityInfoHouseStatusEnum.Exp: CityInfoHouseMono.CityInfoHouseStatusEnum.LackExp);
_houseList[i].SetContent(pop > i,status);
}
}
public void SetConnect(bool connect)
{
if (ConnectIcon == null)
{
LogSystem.LogError("CityInfoMono.SetConnect: ConnectIcon is null.");
return;
}
ConnectIcon.gameObject.SetActive(connect);
RebuildCityInfoBar();
}
public void SetCapital(bool capital)
{
if (CapitalIcon == null)
{
LogSystem.LogError("CityInfoMono.SetCapital: CapitalIcon is null.");
return;
}
CapitalIcon.gameObject.SetActive(capital);
RebuildCityInfoBar();
}
public void SetEmbassy(bool embassy)
{
if (EmbassyIcon == null)
{
LogSystem.LogError("CityInfoMono.SetEmbassy: EmbassyIcon is null.");
return;
}
EmbassyIcon.gameObject.SetActive(embassy);
RebuildCityInfoBar();
}
public void SetWarEmbassy(bool warEmbassy)
{
if (EmbassyWarIcon == null)
{
LogSystem.LogError("CityInfoMono.SetWarEmbassy: EmbassyWarIcon is null.");
return;
}
EmbassyWarIcon.gameObject.SetActive(warEmbassy);
RebuildCityInfoBar();
}
public void SetCityStolen(bool stolen)
{
if (CityStolenIcon == null)
{
LogSystem.LogError("CityInfoMono.SetCityStolen: CityStolenIcon is null.");
return;
}
CityStolenIcon.gameObject.SetActive(stolen);
RebuildCityInfoBar();
}
public void SetCoin(bool coinIcon,int coin)
{
if (CoinIcon == null || CoinText == null)
{
LogSystem.LogError("CityInfoMono.SetCoin: CoinIcon or CoinText is null.");
return;
}
CoinIcon.gameObject.SetActive(coinIcon);
CoinText.gameObject.SetActive(coinIcon);
if (coinIcon)
CoinText.text = coin.ToString();
RebuildCityInfoBar();
}
public void SetTech(bool techIcon,int tech)
{
if (TechIcon == null || TechText == null)
{
LogSystem.LogError("CityInfoMono.SetTech: TechIcon or TechText is null.");
return;
}
TechIcon.gameObject.SetActive(techIcon);
TechText.gameObject.SetActive(techIcon);
if (techIcon)
TechText.text = tech.ToString();
RebuildCityInfoBar();
}
public void SetCulture(bool cultureIcon,int culture)
{
if (CultureIcon == null || CultureText == null)
{
LogSystem.LogError("CityInfoMono.SetCulture: CultureIcon or CultureText is null.");
return;
}
CultureIcon.gameObject.SetActive(cultureIcon);
CultureText.gameObject.SetActive(cultureIcon);
if (cultureIcon)
CultureText.text = culture.ToString();
RebuildCityInfoBar();
}
public void SetCityName(string cityName_ENCODE)
{
if (CityName == null)
{
LogSystem.LogError("CityInfoMono.SetCityName: CityName is null.");
return;
}
MultilingualManager.Instance.SetUIText(CityName,cityName_ENCODE);
RebuildCityInfoBar();
}
}
}