TH1/My project/Assets/Scripts/TH1Renderer/CityInfoRenderer.cs
2025-06-24 16:16:00 +08:00

200 lines
8.9 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 RuntimeData;
using TMPro;
using Logic;
using Logic.Multilingual;
namespace TH1Renderer
{
public class CityInfoRenderer
{
private MapData _mapData;
private Main _main;
private GameObject _ROCityInfo;
private GameObject _RODebugText;
private TextMeshProUGUI _debugText;
private uint _cityId;
//-------- Update缓存数据 --------//
private GridData _gridData;
private CityData _cityData;
private PlayerData _playerData;
public CityInfoRenderer(GameObject prefab,Transform father, uint cid, MapData mapData, Main main)
{
_mapData = mapData;
_main = main;
_cityId = cid;
_mapData.GetGridDataByCityId(_cityId,out _gridData);
_mapData.CityMap.GetCityById(_cityId,out _cityData);
_mapData.GetPlayerDataByCityId(_cityId,out _playerData);
Vector3 tpos = Table.Instance.GridToWorld(_gridData,"isCityInfo");
_ROCityInfo = GameObject.Instantiate(prefab,tpos, Quaternion.identity, father);
_RODebugText = _ROCityInfo.transform.Find("CityInfoCanvas/DebugText").gameObject;
_debugText = _RODebugText.GetComponent<TextMeshProUGUI>();
}
public void Update()
{
_mapData.GetGridDataByCityId(_cityId,out _gridData);
_mapData.CityMap.GetCityById(_cityId,out _cityData);
_mapData.GetPlayerDataByCityId(_cityId,out _playerData);
if (_cityData.CityInfoRenderMark)
{
_cityData.CityInfoRenderMark = false;
RenderUpdateCityInfo();
}
RenderUpdateDebug();
}
public void RenderUpdateCityInfo()
{
//更新联通图标的情况
RenderUpdateCityConnected();
//更新首都图标的情况
RenderUpdateCityCapital();
//更新人口条,会自动处理不在视野的情况
RenderUpdateCityPops();
//更新GDP,会自动处理不在视野的情况
RenderUpdateCityGDP();
//更新城市名,会自动处理不在视野的情况
RenderUpdateCityName();
_ROCityInfo.SetActive(_mapData.PlayerMap.SelfPlayerData.Sight.CheckIsInSight(_gridData.Id));
}
public void RenderUpdateDebug()
{
if (DebugCenter.Instance.DebugMode)
{
if(!_RODebugText.activeSelf)
_RODebugText.SetActive(true);
}
else
{
_RODebugText.SetActive(false);
return;
}
_debugText.text = "";
_debugText.text += $"CID={_cityId} PID={_playerData.Id} CIV={_playerData.PlayerCivId} gold={_playerData.PlayerWealth}\n";
//如果不是我方单位显示city和player的战略
if(!_mapData.CheckCityIdBelongPlayerId(_cityId,_mapData.PlayerMap.SelfPlayerData.Id))
if (MainEditor.Instance.Data != null)
_debugText.text += $"CST={MainEditor.Instance.GetCityStrategy(_cityId)} PST={MainEditor.Instance.GetPlayerStrategy(_playerData.Id)}";
//如果是首都,展示科技
if (_cityData.IsCapital)
{
_debugText.text += "tech={";
foreach (var tech in _playerData.TechTree.TechList)
{
_debugText.text += tech + ",";
}
_debugText.text += "}\n";
}
}
private void RenderUpdateCityConnected()
{
bool st = false;
//如果是己方的城市,才显示这个
if (_playerData.Id == _mapData.PlayerMap.SelfPlayerData.Id)
st = _cityData.IsConnectedCapital;
_ROCityInfo.transform.Find("CityInfoCanvas/CityName/Connected").gameObject.SetActive(st);
}
private void RenderUpdateCityCapital()
{
_ROCityInfo.transform.Find("CityInfoCanvas")
.transform.Find("CityName").transform.Find("CapitalIcon").gameObject.SetActive(_cityData.IsCapital);
}
private void RenderUpdateCityGDP() //更新城市的GDP显示,一线打工的渲染函数
{
//如果不是己方的城市,不显示
if (_playerData.Id != _mapData.PlayerMap.SelfPlayerData.Id)
{
_ROCityInfo.transform.Find("CityInfoCanvas/CityName/Wealth").gameObject.SetActive(false);
_ROCityInfo.transform.Find("CityInfoCanvas/CityName/CircleBG").gameObject.SetActive(false);
return;
}
_ROCityInfo.transform.Find("CityInfoCanvas/CityName/Wealth").gameObject.SetActive(true);
_ROCityInfo.transform.Find("CityInfoCanvas/CityName/CircleBG").gameObject.SetActive(true);
//if (!map.player[map.renko].sight[map.city[cityId].cityCenter.x, map.city[cityId].cityCenter.y])
// return; //如果不在玩家视野就不更新具体的内容直接return
TextMeshProUGUI wealth = _ROCityInfo.transform.Find("CityInfoCanvas/CityName/Wealth")
.GetComponent<TextMeshProUGUI>();
wealth.text = Main.CityLogic.GetCityStarsPerTurn(_mapData,_cityData).ToString();
}
private void RenderUpdateCityName() //更新城市的名称显示,一线打工的渲染函数
{
//if (!map.player[map.renko].sight[map.city[cityId].cityCenter.x, map.city[cityId].cityCenter.y])
// return; //如果不在玩家视野就不更新具体的内容直接return
TextMeshProUGUI cityName = _ROCityInfo.transform
.Find("CityInfoCanvas").transform.Find("CityName").transform.Find("CityNameText")
.GetComponent<TextMeshProUGUI>();
Table.Instance.CivDataAssets.GetCityInfo(_cityData.Name,out var cityInfo);
MultilingualManager.Instance.SetUIText(cityName, cityInfo.CityName);
}
private void RenderUpdateCityPops() //更新经验条+人口条的显示,一线打工的渲染函数
{
if (!_mapData.PlayerMap.SelfPlayerData.Sight.CheckIsInSight(_gridData.Id))
return;
//如果不是己方的城市,不显示
if (_playerData.Id != _mapData.PlayerMap.SelfPlayerData.Id)
{
_ROCityInfo.transform.Find("CityInfoCanvas/CityLevelBar").gameObject.SetActive(false);
return;
}
_ROCityInfo.transform.Find("CityInfoCanvas/CityLevelBar").gameObject.SetActive(true);
//第0part 更新基础信息,主要是cityname
RenderUpdateCityName();
//第1part设置城市的经验条
int lineNo, rankNo;//行号和顺次
float scale = _cityData.Level < 4? 1.3f:(_cityData.Level > 7? 0.7f:1.3f);
int population = _mapData.GetUnitCount(_cityData.Id);
for (int i = 0; i < _cityData.Level; i++)
{
lineNo = i / 10;
rankNo = i % 10;
GameObject houseFather = _ROCityInfo.transform.Find("CityInfoCanvas").transform.Find("CityLevelBar")
.transform.Find($"CityLevelBarLine ({lineNo})").transform.Find($"HouseFather ({rankNo})").gameObject;
houseFather.SetActive(true);
//处理绿色house城市经验的情况
if (_cityData.LevelExp > i)
houseFather.transform.Find("House").GetComponent<SpriteRenderer>().sprite
= Resources.Load<Sprite>("ArtResources/TH1Miscs/TH1Misc_House_green");
//处理负citylevel的情况
else if (_cityData.LevelExp < -i)
houseFather.transform.Find("House").GetComponent<SpriteRenderer>().sprite
= Resources.Load<Sprite>("ArtResources/TH1Miscs/TH1Misc_House_red");
//其他情况是白色house
else
houseFather.transform.Find("House").GetComponent<SpriteRenderer>().sprite
= Resources.Load<Sprite>("ArtResources/TH1Miscs/TH1Misc_House_white");
//处理人口显示
houseFather.transform.Find("Population").gameObject.SetActive(population > i);
}
//根据level确定缩放尺寸
_ROCityInfo.transform.Find("CityInfoCanvas").transform.Find("CityLevelBar").localScale = new Vector3(scale,scale,scale);
}
}
}