200 lines
8.9 KiB
C#
200 lines
8.9 KiB
C#
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);
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
}
|
||
} |