TH1/Unity/Assets/Scripts/TH1_Renderer/GridRenderer.cs
2025-09-01 22:31:23 +08:00

1019 lines
40 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 UnityEngine;
using RuntimeData;
using Animancer;
using Logic;
using Logic.AI;
using NUnit.Framework;
using TH1_Logic.Core;
using TH1Resource;
using TMPro.Examples;
using Unity.IO.LowLevel.Unsafe;
using Object = UnityEngine.Object;
using Random = UnityEngine.Random;
using TMPro;
using Unity.VisualScripting;
using UnityEngine.UI;
namespace TH1Renderer
{
public class GridRenderer
{
private MapData _mapData;
private GameObject _ROGrid;
private uint _gridId;
private bool _cityWallMark = false;
//-------- 表现层数据Rdata --------//
public bool IsSelectHighlight = false;
public bool IsMoveHighlight = false;
//-------- Update缓存数据 --------//
private GridData _gridData;
private bool _freeland;
private CityData _cityData;
private PlayerData _playerData;
private GameObject _land,
_mountain,
_forest,
_road,
_resource,
_cityBuilding,
_cityWall,
_fog,
_borderUpLeft,
_borderUpRight,
_borderDownLeft,
_borderDownRight,
_cityBorderUpLeft,
_cityBorderUpRight,
_cityBorderDownLeft,
_cityBorderDownRight,
_selectHighlight,
_moveHighlight,
_effect,
_RODebugText;
private TextMeshPro _debugText;
public int x, y;
string forcesName, civName;
bool needBounce = false, isBounceDown = true;
Vector3 bounceUpPos, bounceDownPos;
private float _bounceWaitTime = 0f;
float bounceTime = 0f;
float bounceDownFullTime = 0.07f;
float bounceUpFullTime = 0.2f;
//------- VFX相关参数 --------//
public AnimationClip FogEffectAnim;
public float RandomWait; //播放fog前的随机等待参数
bool _playFogEffect = false;
bool _isPlayingFog = false;
//TODO 把下面这些零散的rendermark全部整合到VFXManagerDict里去
public AnimationClip HurtVFXAnim;
private bool _playHurtVFX;
private bool _isPlayingHurtVFX;
public AnimationClip DieVFXAnim;
private bool _playDieVFX;
private bool _isPlayingDieVFX;
public AnimationClip DieHintVFXAnim;
private bool _playDieHintVFX;
public bool _isPlayingDieHintVFX;
private bool _stopDieHintVFX;
public AnimationClip TreasureVFXAnim;
private bool _playTreasureVFX;
private bool _isPlayingTreasureVFX;
public AnimationClip HealVFXAnim;
private bool _playHealVFX;
private bool _isPlayingHealVFX;
private Sprite _dieHint;
private Sprite _counterDieHint;
public Dictionary<GridVFXType, GridVFXRenderer> VFXManagerDict;
bool renderVeteran = false;
// Start is called before the first frame update
public GridRenderer(GameObject prefab,Transform father, uint gridId, MapData mapData, Main main)
{
_mapData = mapData;
_gridId = gridId;
mapData.GridMap.GetGridDataByGid(_gridId,out _gridData);
_freeland = !_mapData.GetCityDataByTerritoryGid(_gridId,out _cityData);
if(!_freeland)
_mapData.GetPlayerDataByCityId(_cityData.Id,out _playerData);
if (!(_cityData == null) && !(_playerData == null))
{
_mapData.GridMap.GetGridDataByGid(gridId, out var g1);
}
Vector3 tpos = Table.Instance.GridToWorld(_gridData);
_ROGrid = GameObject.Instantiate(prefab,tpos, Quaternion.identity, father);
Init(_gridData);
}
public GameObject GetROGrid() { return _ROGrid; }
private void ClearHistoryRenderMark()
{
//清空所有的rendermark
if (_gridData.RenderMarkVFXDict != null)
_gridData.RenderMarkVFXDict.Clear();
VFXManagerDict.Clear();
foreach (var key in VFXManagerDict.Keys)
{
VFXManagerDict[key].ClearRenderMark();
}
_playHurtVFX = false;
_playDieVFX = false;
_playDieHintVFX = false;
_stopDieHintVFX = false;
_playTreasureVFX = false;
_playHealVFX = false;
}
//判断各自是否要bounce 并处理bounce动画
private void UpdateBounceAnim()
{
if (needBounce)
{
if (_bounceWaitTime > 0)
_bounceWaitTime -= Time.deltaTime;
else
{
if (isBounceDown)
{
bounceTime += Time.deltaTime / bounceDownFullTime;
_ROGrid.transform.position = Vector3.Lerp(bounceUpPos, bounceDownPos, bounceTime);
if (bounceTime >= 1f)
{
isBounceDown = false;
bounceTime = 0f;
}
}
else
{
bounceTime += Time.deltaTime / bounceUpFullTime;
_ROGrid.transform.position = Vector3.Lerp(bounceDownPos, bounceUpPos, bounceTime);
if (bounceTime >= 1f)
needBounce = false;
}
}
}
}
//读取gridData的VFXRendermark
private void ChangeVFXRenderMarkToVFXSignal()
{
//如果当前有迷雾直接清空然后return
if (_fog.activeSelf)
{
if(_gridData.RenderMarkVFXDict != null)
foreach (var vfxPair in _gridData.RenderMarkVFXDict)
{
if (vfxPair.Value.RenderMark)
vfxPair.Value.RenderMark = false;
}
_gridData.VFXRenderMarkHurt = false;
_gridData.VFXRenderMarkDie = false;
_gridData.VFXRenderMarkDieHintStart = false;
_gridData.VFXRenderMarkDieHintEnd = false;
_gridData.VFXRenderMarkTreasure = false;
_gridData.VFXRenderMarkFog = false;
_gridData.VFXRenderMarkHeal = false;
}
//遍历gridData的rendermarkVFXDict,看看有没有什么VFX的rendermark是true,那么就需要出发特效播放
if(_gridData.RenderMarkVFXDict != null )
foreach (var vfxPair in _gridData.RenderMarkVFXDict)
{
if (vfxPair.Value.RenderMark)
{
if (VFXManagerDict.TryGetValue(vfxPair.Key, out var vfxRenderer))
{
if (vfxPair.Value.PlayOrStop)
{
//更新vfrenderer的特殊参数比如civId或者damage之类的就是有些特殊参数的VFX需要先设置一下参数
var t = new GridVFXParams(vfxPair.Value);
vfxRenderer.UpdateSpecialParam(t);
vfxRenderer.SetPlay();
}
else
vfxRenderer.SetStop();
}
vfxPair.Value.RenderMark = false;
}
}
if (_gridData.VFXRenderMarkHurt)
{
_gridData.VFXRenderMarkHurt = false;
SetHurtVFXAnim();
}
if (_gridData.VFXRenderMarkDie)
{
_gridData.VFXRenderMarkDie = false;
SetDieVFXAnim();
}
if (_gridData.VFXRenderMarkDieHintStart)
{
_gridData.VFXRenderMarkDieHintStart = false;
//用param传递是普通死亡hint还是反击死亡hint
if(_gridData.VFXRenderMarkDieHintStartParam == 0)
SetDieHintVFXAnim();
else if(_gridData.VFXRenderMarkDieHintStartParam == 1)
SetDieHintVFXAnim(true);
}
if (_gridData.VFXRenderMarkDieHintEnd)
{
_gridData.VFXRenderMarkDieHintEnd = false;
SetStopDieHintVFXAnim();
}
if (_gridData.VFXRenderMarkTreasure)
{
_gridData.VFXRenderMarkTreasure = false;
SetTreasureVFXAnim();
}
if (_gridData.VFXRenderMarkFog)
{
_gridData.VFXRenderMarkFog = false;
SetFogAnim(false);
}
if (_gridData.VFXRenderMarkHeal)
{
_gridData.VFXRenderMarkHeal = false;
SetHealVFXAnim();
}
_ROGrid.transform.Find("Effect/Fire").gameObject.SetActive(false);
//判断是否着火
if (_mapData.GetCityDataByGid(_gridId,out var city) && _mapData.GetUnitDataByGid(_gridId,out var unit))
if (_mapData.GetPlayerDataByCityId(city.Id, out var player1) &&
_mapData.GetPlayerDataByUnitId(unit.Id, out var player2))
if(player1.Id != player2.Id)
_ROGrid.transform.Find("Effect/Fire").gameObject.SetActive(true);
}
//处理VFXManagerDict下每个Effect的Update
private void UpdateVFX()
{
foreach (var vfxPair in VFXManagerDict)
vfxPair.Value.Update();
//TODO 把下面的结构都转化为ManagerDict内的结构
if (_playHurtVFX)
{
_playHurtVFX = false;
PlayHurtVFX();
}
if (_playDieVFX)
{
_playDieVFX = false;
PlayDieVFX();
}
if (_playDieHintVFX)
{
_playDieHintVFX = false;
PlayDieHintVFX();
}
if (_stopDieHintVFX)
{
_stopDieHintVFX = false;
StopDieHintVFX();
}
if (_playTreasureVFX)
{
_playTreasureVFX = false;
PlayTreasureVFX();
}
if (_playHealVFX)
{
_playHealVFX = false;
PlayHealVFX();
}
if (_playFogEffect)
{
if (RandomWait > 0)
{
RandomWait -= Time.deltaTime;
}
else
{
_playFogEffect = false;
PlayFogEffect();
}
}
if (_gridData.RenderMark)
{
_gridData.RenderMark = false;
RenderUpdateGridWithoutCityBuilding();
}
if (_gridData.CityBuildingRenderMark)
{
_gridData.CityBuildingRenderMark = false;
RenderUpdateCityBuilding(_cityData.Id);
}
}
public void Update()
{
_mapData.GridMap.GetGridDataByGid(_gridId, out _gridData);
_freeland = !_mapData.GetCityDataByTerritoryGid(_gridId, out _cityData);
if (!_freeland)
_mapData.GetPlayerDataByCityId(_cityData.Id, out _playerData);
//读取gridData的VFXRendermark
//这里有个潜规则就是如果有视野也就是没有fog才会判断gridData的VFXRendermark
bool tt = _playDieVFX;
ChangeVFXRenderMarkToVFXSignal();
//查看城市边界的更新情况,这个没有视野也会显示的
UpdateCityBorder();
//判断各自是否要bounce
UpdateBounceAnim();
//处理VFXManagerDict下每个Effect的Update
UpdateVFX();
}
private void RenderUpdateDebug()
{
if (DebugCenter.Instance.DebugMode)
{
if(!_RODebugText.activeSelf)
_RODebugText.SetActive(true);
}
else
{
_RODebugText.SetActive(false);
return;
}
_debugText.text = "";
_debugText.text += $"ID={_gridId}";
_debugText.text += $" pos={_gridData.Pos.X} {_gridData.Pos.Y}\n";
if(_gridData.buildingLevel > 0)
_debugText.text += $"lv = {_gridData.buildingLevel}\n";
if(_gridData.Feature == TerrainFeature.Road)
_debugText.text += $"road\n";
}
private void Init(GridData t)
{
x = (int)t.Pos.X;
y = (int)t.Pos.Y;
//Vector3 pos = transform.position;
//pos.z = GridData.pos.x + GridData.pos.y;
//transform.position = pos;
_land = _ROGrid.transform.Find("Land").gameObject;
_road = _ROGrid.transform.Find("Road").gameObject;
_mountain = _ROGrid.transform.Find("Mountain").gameObject;
_forest = _ROGrid.transform.Find("Forest").gameObject;
_resource = _ROGrid.transform.Find("Resource").gameObject;
_cityBuilding = _ROGrid.transform.Find("cityBuilding").gameObject;
_cityWall = _ROGrid.transform.Find("cityWall").gameObject;
_fog = _ROGrid.transform.Find("Fog").gameObject;
_borderUpLeft = _ROGrid.transform.Find("BorderUpLeft").gameObject;
_borderUpRight = _ROGrid.transform.Find("BorderUpRight").gameObject;
_borderDownLeft = _ROGrid.transform.Find("BorderDownLeft").gameObject;
_borderDownRight = _ROGrid.transform.Find("BorderDownRight").gameObject;
_cityBorderUpLeft = _ROGrid.transform.Find("CityBorderUpLeft").gameObject;
_cityBorderUpRight = _ROGrid.transform.Find("CityBorderUpRight").gameObject;
_cityBorderDownLeft = _ROGrid.transform.Find("CityBorderDownLeft").gameObject;
_cityBorderDownRight = _ROGrid.transform.Find("CityBorderDownRight").gameObject;
_selectHighlight = _ROGrid.transform.Find("SelectHighlight").gameObject;
_moveHighlight = _ROGrid.transform.Find("MoveHighlight").gameObject;
_effect = _ROGrid.transform.Find("Effect").gameObject;
_RODebugText = _ROGrid.transform.Find("DebugText").gameObject;
_debugText = _RODebugText.GetComponent<TextMeshPro>();
foreach(Transform child in _effect.transform)
child.gameObject.SetActive(false);
civName = Table.Instance.QueryCivsName(_gridData.CivId);
//初始化VFXManagerDict
FogEffectAnim = Resources.Load<AnimationClip>("Animations/VFX/PlayFog");
HurtVFXAnim = Resources.Load<AnimationClip>("Animations/VFX/PlayAttack");
DieVFXAnim = Resources.Load<AnimationClip>("Animations/VFX/PlayDie");
DieHintVFXAnim = Resources.Load<AnimationClip>("Animations/VFX/PlayDieHint");
TreasureVFXAnim = Resources.Load<AnimationClip>("Animations/VFX/PlayTreasure");
HealVFXAnim = Resources.Load<AnimationClip>("Animations/VFX/PlayHeal");
_dieHint = Resources.Load<Sprite>("ArtResources/TH1VFX/TH1VFX_Die");
_counterDieHint = Resources.Load<Sprite>("ArtResources/TH1VFX/TH1VFX_CounterDie");
VFXManagerDict = new Dictionary<GridVFXType, GridVFXRenderer>();
//初始化flag特效
GridVFXParams flagParam = new GridVFXParams(GridVFXType.Flag,Resources.Load<AnimationClip>("Animations/VFX/PlayHeal"),null,_effect.transform.Find("Flag")?.gameObject);
VFXManagerDict[GridVFXType.Flag] = GridVFXRendererFactory.Create(flagParam);
//初始化damage特效
GridVFXParams damageParam = new GridVFXParams(GridVFXType.Damage,Resources.Load<AnimationClip>("Animations/VFX/PlayDamage"),null,_effect.transform.Find("Damage")?.gameObject);
VFXManagerDict[GridVFXType.Damage] = GridVFXRendererFactory.Create(damageParam);
//初始化皇家烈焰特效
Sprite ROYALFLAMESSprite = Resources.Load<Sprite>("ArtResources/TH1UI/Common/SkillIcon/Skill_ROYALFLAMES");
GridVFXParams ROYALFLAMESParam = new GridVFXParams(GridVFXType.ROYALFLAMES,ResourceCache.Instance.AnimCache.GridVFXShowUp,ROYALFLAMESSprite,_effect.transform.Find("Skill")?.gameObject);
VFXManagerDict[GridVFXType.ROYALFLAMES] = GridVFXRendererFactory.Create(ROYALFLAMESParam);
//初始化Fog特效
GridVFXParams fogParam = new GridVFXParams(GridVFXType.Fog,ResourceCache.Instance.AnimCache.GridVFXShowOut,null,_effect.transform.Find("Fog")?.gameObject);
VFXManagerDict[GridVFXType.Fog] = GridVFXRendererFactory.Create(fogParam);
UpdateLand();
UpdateRoad();
UpdateForest();
UpdateMountain();
UpdateResource();
UpdateCityWall();
UpdateCityBorder();
UpdateFog();
RenderUpdateDebug();
//UpdateBorder();fog自带updateborder
}
private void RenderUpdateGridWithoutCityBuilding()
{
UpdateLand();
UpdateRoad();
UpdateMountain();
UpdateForest();
UpdateResource();
UpdateCityWall();
UpdateCityBorder();
UpdateFog();
if (DebugCenter.Instance.DebugMode)
RenderUpdateDebug();
//UpdateBorder();fog自带updateborder
}
public void RenderUpdateCityBuilding(uint cityId)
{
_mapData.CityMap.GetCityById(cityId,out CityData cityData);
_mapData.GetPlayerDataByCityId(cityId, out PlayerData playerData);
uint civId = playerData.PlayerCivId;
int citylevel = cityData.Level;
int houseEdge = Table.Instance.cityLevel2HouseEdge[citylevel];
int houseSize = houseEdge * houseEdge;
int houseCount = Table.Instance.cityLevel2HouseNumber[citylevel];
int houseHeight = Table.Instance.cityLevel2HouseHeight[citylevel];
int[] housePosHeight = new int[houseSize];
int[,] textureType = new int[houseHeight, houseCount];
for (int k = 0; k < houseSize; k++)
{
for (int l = 0; l < houseHeight; l++)
textureType[l, k] = 0; //初始化
housePosHeight[k] = 1;
textureType[0, k] = Random.Range(0, Table.Instance.cityLevel2HouseType[citylevel]);
}
for (int k = houseSize; k < houseCount; k++)
{
int randPos = Random.Range(0, houseSize);
if (housePosHeight[randPos] >= houseHeight)
for (randPos = houseSize - 1; randPos >= 0; randPos--)
if (housePosHeight[randPos] < houseHeight)
break;
textureType[housePosHeight[randPos]++, randPos] = Random.Range(0, Table.Instance.cityLevel2HouseType[citylevel]);
}
//清空原来的城市图像
foreach (UnityEngine.Transform child in _cityBuilding.transform)
Object.Destroy(child.gameObject);
//开始设置城市图像
for (int x = 0; x < houseEdge; x++)
for (int y = 0; y < houseEdge; y++)
for (int z = 0; z < housePosHeight[x * houseEdge + y]; z++)
{
GameObject house = new GameObject($"house{x}_{y}_{z}");
SpriteRenderer sr = house.AddComponent<SpriteRenderer>();
string forcesName = Table.Instance.QueryForcesName(playerData.PlayerForceId);
string civName = Table.Instance.QueryCivsName(playerData.PlayerCivId);
//Debug.Log($"ArtResources/TH1Buildings/TH1Buildings{forcesName}/{civName}/{forcesName}_{civName}_House_{z + 1}");
sr.sprite = Resources.Load<Sprite>(
$"ArtResources/TH1Buildings/TH1Buildings{forcesName}/{civName}/{forcesName}_{civName}_House_{textureType[z,x*houseEdge +y] + 1}");
house.transform.parent = _cityBuilding.transform;
Vector3 tpos = _ROGrid.transform.position;
//每层的层高
float levelHeight = 1.2f;
tpos = new Vector3(tpos.x + 1.22f * (x - y),
tpos.y + 0.7f * (x + y) + z * levelHeight - 7.5f + 0.7f * (4 - houseEdge),
tpos.z + 0.9f - (30 + z - x - y) * 0.001f);
house.transform.position = tpos;
}
}
public void RenderUpdataHighlight()
{
_moveHighlight.SetActive(IsMoveHighlight);
_selectHighlight.SetActive(IsSelectHighlight);
}
public void SetSelectHighlight(bool v)
{
if (IsSelectHighlight == v)
return;
IsSelectHighlight = v;
MapRenderer.Instance.HighlightGridIdSet.Add(_gridId);
MapRenderer.Instance.HighlightGridIdSetRenderMark = true;
}
public void SetMoveHighlight(bool v)
{
if (IsMoveHighlight == v)
return;
IsMoveHighlight = v;
MapRenderer.Instance.HighlightGridIdSet.Add(_gridId);
MapRenderer.Instance.HighlightGridIdSetRenderMark = true;
}
private void UpdateLand()
{
if (_gridData.Terrain == TerrainType.Land)
_land.GetComponent<SpriteRenderer>().sprite =
Resources.Load<Sprite>($"ArtResources/TH1Grounds/TH1Ground_{civName}");
else
{
if (_gridData.Terrain == TerrainType.ShallowSea)
_land.GetComponent<SpriteRenderer>().sprite =
Resources.Load<Sprite>($"ArtResources/TH1Waters/TH1Water_Water");
else
_land.GetComponent<SpriteRenderer>().sprite =
Resources.Load<Sprite>($"ArtResources/TH1Waters/TH1Water_Ocean");
}
}
private void UpdateRoad()
{
//如果当前的feature没有road
if (_gridData.Feature != TerrainFeature.Road)
{
for (int i = 1; i <= 9; i++)
{
int dirForHuman = i;
int dirForComputer = dirForHuman - 1;
var t = _road.transform.Find($"Road{dirForHuman}");
if (t != null)
GameObject.Destroy(t.gameObject);
}
return;
}
//TODO 最好把dir做成enum
for (int i = 1; i <= 9; i++)
{
int dirForHuman = i;
int dirForComputer = dirForHuman - 1;
var t = _road.transform.Find($"Road{dirForHuman}");
if (!_mapData.CheckIfNearByGridRoadCanConnenct(_gridData, dirForComputer))
{
if (t != null)
GameObject.Destroy(t.gameObject);
continue;
}
if (t == null)
{
GameObject road = new GameObject($"Road{dirForHuman}");
SpriteRenderer sr = road.AddComponent<SpriteRenderer>();
ResourceCache.Instance.SpriteCache.Roads.TryGetValue((_gridData.Terrain == TerrainType.Land ? "Road" : "WaterRoad") + dirForComputer,out var tmpSprite);
sr.sprite = tmpSprite;
road.transform.parent = _road.transform;
road.transform.localPosition = new Vector3(0, 0, 0);
}
}
}
private void UpdateMountain()
{
_mountain.GetComponent<SpriteRenderer>().sprite = _gridData.Feature == TerrainFeature.Mountain
? Resources.Load<Sprite>($"ArtResources/TH1Mountains/TH1Mountain_{civName}")
: null;
}
private void UpdateForest()
{
_forest.GetComponent<SpriteRenderer>().sprite = _gridData.Vegetation == Vegetation.Trees
? Resources.Load<Sprite>($"ArtResources/TH1Forests/TH1Forest_{civName}")
: null;
}
private void UpdateResource()
{
if(!_freeland)
forcesName = Table.Instance.QueryForcesName(_playerData.PlayerForceId);
bool glow = (!_freeland && _playerData.Id == _mapData.PlayerMap.SelfPlayerData.Id
&& (_gridData.Resource == ResourceType.Fruit &&
_playerData.TechTree.CheckIfHasTech(TechType.Organization)
|| (_gridData.Resource == ResourceType.Animal &&
_playerData.TechTree.CheckIfHasTech(TechType.Hunting))
|| (_gridData.Resource == ResourceType.Fish &&
_playerData.TechTree.CheckIfHasTech(TechType.Fishing))
|| (_gridData.Resource == ResourceType.Crop &&
_playerData.TechTree.CheckIfHasTech(TechType.Farming))
|| (_gridData.Resource == ResourceType.Metal &&
_playerData.TechTree.CheckIfHasTech(TechType.Mining))));
if (_gridData.Resource == ResourceType.Starfish &&
_mapData.PlayerMap.SelfPlayerData.TechTree.CheckIfHasTech(TechType.Navigation))
glow = true;
bool hasCity = _mapData.GetCityDataByTerritoryGid(_gridId, out var cityData);
//处理隐藏没有科技情况下 metal、starfish、crop的情况
bool skip = false;
if (_gridData.Resource == ResourceType.Crop)
if (!_mapData.PlayerMap.SelfPlayerData.TechTree.CheckIfHasTech(TechType.Organization) &&
!_mapData.PlayerMap.SelfPlayerData.TechTree.CheckIfHasTech(TechType.Farming))
skip = true;
if (_gridData.Resource == ResourceType.Metal)
if (!_mapData.PlayerMap.SelfPlayerData.TechTree.CheckIfHasTech(TechType.Mining) &&
!_mapData.PlayerMap.SelfPlayerData.TechTree.CheckIfHasTech(TechType.Climbing))
skip = true;
if (_gridData.Resource == ResourceType.Starfish)
if (!_mapData.PlayerMap.SelfPlayerData.TechTree.CheckIfHasTech(TechType.Navigation) &&
!_mapData.PlayerMap.SelfPlayerData.TechTree.CheckIfHasTech(TechType.Sailing))
skip = true;
if (skip)
{
_resource.GetComponent<SpriteRenderer>().sprite = null;
return;
}
//注意 playerData可能是null 对于中立格子来说
var resource = Table.Instance.GridAndResourceDataAssets.GetResourceSprite(_gridData.Resource,_playerData,_gridData);
//如果是桥梁 处理mirror的情况
if (_gridData.Resource == ResourceType.Bridge)
{
if(_mapData.GridMap.CalcBridgeMirror(_gridData))
resource = Table.Instance.GridAndResourceDataAssets.GetResourceSprite(_gridData.Resource,_playerData,_gridData,mirror:true);
}
//如果是citycenter并且有城市了就变为null
if (_gridData.Resource == ResourceType.CityCenter && hasCity)
resource = null;
//如果是奇观,替换为对应奇观
if (_gridData.Resource == ResourceType.Wonder)
resource = Table.Instance.GridAndResourceDataAssets.GetWonderSprite(_gridData.Wonder, _playerData);
bool resourceUpdated = false;
if (_resource.GetComponent<SpriteRenderer>().sprite != resource)
{
resourceUpdated = true;
_resource.GetComponent<SpriteRenderer>().sprite = resource;
}
//处理高光效果
_resource.GetComponent<SpriteRenderer>().material = glow ? ResourceCache.Instance.MatCache.TH1URPShaders_Sprite_Glow:
ResourceCache.Instance.MatCache.TH1URPShaders_Default;
}
private void UpdateCityWall()
{
if (_cityWall.activeSelf)
return;
if (!_mapData.GetCityDataByGid(_gridId, out var cityData))
return;
if (!cityData.CityWall)
return;
_cityWallMark = true;
_cityWall.SetActive(true);
}
public void UpdateBorder()
{
//如果不是城市领土不需要生成border
if (_freeland)
{
_borderDownLeft.SetActive(false);
_borderDownRight.SetActive(false);
_borderUpLeft.SetActive(false);
_borderUpRight.SetActive(false);
return;
}
if (Table.Instance.PlayerDataAssets.GetPlayerInfo(_playerData, out var playerInfo))
{
var c = playerInfo.Color;
//c.a = 0.8f;
_borderDownLeft.GetComponent<SpriteRenderer>().color = c;
_borderDownRight.GetComponent<SpriteRenderer>().color = c;
_borderUpRight.GetComponent<SpriteRenderer>().color = c;
_borderUpLeft.GetComponent<SpriteRenderer>().color = c;
}
_borderDownLeft.SetActive(!_mapData.CheckIfNearByGridSamePlayer(_gridData,4));
_borderDownRight.SetActive(!_mapData.CheckIfNearByGridSamePlayer(_gridData,2));
_borderUpRight.SetActive(!_mapData.CheckIfNearByGridSamePlayer(_gridData,6));
_borderUpLeft.SetActive(!_mapData.CheckIfNearByGridSamePlayer(_gridData,8));
}
private void UpdateCityBorder()
{
//如果没有rendermark 直接return
if (!_gridData.CityBorderRenderMark)
{
_cityBorderDownLeft.SetActive(false);
_cityBorderDownRight.SetActive(false);
_cityBorderUpLeft.SetActive(false);
_cityBorderUpRight.SetActive(false);
return;
}
if (!_mapData.GetPlayerDataByTerritoryGridId(_gridData.Id, out var player))
return;
var color = Color.red;
if(player.Id == _mapData.PlayerMap.SelfPlayerId)
color = Color.green;
_cityBorderDownLeft.GetComponent<SpriteRenderer>().color = color;
_cityBorderDownRight.GetComponent<SpriteRenderer>().color = color;
_cityBorderUpRight.GetComponent<SpriteRenderer>().color = color;
_cityBorderUpLeft.GetComponent<SpriteRenderer>().color = color;
_cityBorderDownLeft.SetActive(!_mapData.CheckIfNearByGridSameCity(_gridData,4));
_cityBorderDownRight.SetActive(!_mapData.CheckIfNearByGridSameCity(_gridData,2));
_cityBorderUpRight.SetActive(!_mapData.CheckIfNearByGridSameCity(_gridData,6));
_cityBorderUpLeft.SetActive(!_mapData.CheckIfNearByGridSameCity(_gridData,8));
}
private void UpdateFog()
{
bool isFog = !_mapData.PlayerMap.SelfPlayerData.Sight.CheckIsInSight(_gridData.Id);
if (_fog.activeSelf != isFog)
{
if (isFog)
{
_fog.SetActive(true);
}
else
{
SetFogAnim();
ClearHistoryRenderMark();
Timer.Instance.TimerRegister(this, () =>
{
_fog.SetActive(false);
if(_gridData.Resource == ResourceType.CityCenter || _gridData.Resource == ResourceType.Treasure)
SetTreasureVFXAnim();
},RandomWait,"GridRenderer_UpdateFog");
}
}
_land.SetActive(!isFog);
_road.SetActive(!isFog);
_mountain.SetActive(!isFog);
_forest.SetActive(!isFog);
_cityWall.SetActive(!isFog&&_cityWallMark);
_cityBuilding.SetActive(!isFog);
_resource.SetActive(!isFog);
if (isFog)
{
_borderDownLeft.SetActive(false);
_borderDownRight.SetActive(false);
_borderUpLeft.SetActive(false);
_borderUpRight.SetActive(false);
}
else
UpdateBorder();
}
public void SetBounceAnim(bool NeedRandomWait=false)
{
if (needBounce) return;
if(!NeedRandomWait)
_bounceWaitTime = 0f;
else
{
_bounceWaitTime = Random.Range(0,0.3f);
}
needBounce = true;
isBounceDown = true;
bounceTime = 0f;
bounceUpPos = _ROGrid.transform.position;
bounceDownPos = new Vector3(_ROGrid.transform.position.x, _ROGrid.transform.position.y - 0.8f, _ROGrid.transform.position.z);
}
public void SetFogAnim(bool needRandomWait = true)
{
RandomWait = 0f;
if (needRandomWait)
RandomWait = Random.Range(0,50) * 0.002f;
if (_isPlayingFog) return;
_playFogEffect = true;
}
private void PlayFogEffect()
{
//给preview模块打的补丁
if (_ROGrid.transform.parent.name == "Grid") return;
var fogObj = _ROGrid.transform.Find("Effect/Fog").gameObject;
fogObj.SetActive(true);
var animancer = _ROGrid.transform.Find("Effect/Fog").GetComponent<AnimancerComponent>();
if (FogEffectAnim != null)
{
_isPlayingFog = true;
animancer.Play(FogEffectAnim);
Timer.Instance.TimerRegister(fogObj, () =>
{
fogObj.SetActive(false);
_isPlayingFog = false;
}, FogEffectAnim.length,"GirdRenderer_PlayFogEffect");
}
}
public void SetHurtVFXAnim()
{
if (_fog.activeSelf) return;
if (_isPlayingHurtVFX) return;
_playHurtVFX = true;
}
private void PlayHurtVFX()
{
var VFX = _ROGrid.transform.Find("Effect/Hurt").gameObject;
VFX.SetActive(true);
var animancer = VFX.GetComponent<AnimancerComponent>();
if (HurtVFXAnim != null)
{
_isPlayingHurtVFX = true;
animancer.Play(HurtVFXAnim);
Timer.Instance.TimerRegister(VFX, () =>
{
VFX.SetActive(false);
_isPlayingHurtVFX = false;
}, HurtVFXAnim.length,"GridRenderer_PlayHurtVFX");
}
}
private void SetDieVFXAnim()
{
if (_fog.activeSelf) return;
if (_isPlayingDieVFX) return;
_playDieVFX = true;
}
private void PlayDieVFX()
{
var VFX = _ROGrid.transform.Find("Effect/Die").gameObject;
VFX.SetActive(true);
var animancer = VFX.GetComponent<AnimancerComponent>();
if (DieVFXAnim != null)
{
_isPlayingDieVFX = true;
animancer.Play(DieVFXAnim);
Timer.Instance.TimerRegister(VFX, () =>
{
VFX.SetActive(false);
_isPlayingDieVFX = false;
}, DieVFXAnim.length,"GridRenderer_PlayDieVFX");
}
}
private void SetDieHintVFXAnim(bool isCounter = false)
{
if (_fog.activeSelf) return;
if (_isPlayingDieHintVFX) return;
//根据是否是反击提示,更换图像
_ROGrid.transform.Find("Effect/Die").GetComponent<SpriteRenderer>().sprite = isCounter ? _counterDieHint : _dieHint;
_playDieHintVFX = true;
}
//isCounter用来判断是杀死对方的提示还是被提房杀死的反击提示
private void PlayDieHintVFX()
{
var VFX = _ROGrid.transform.Find("Effect/Die").gameObject;
VFX.SetActive(true);
var animancer = VFX.GetComponent<AnimancerComponent>();
if (DieVFXAnim != null)
{
_isPlayingDieHintVFX = true;
animancer.Play(DieHintVFXAnim);
}
}
public void SetStopDieHintVFXAnim()
{
if (_fog.activeSelf) return;
if (!_isPlayingDieHintVFX) return;
_stopDieHintVFX = true;
}
private void StopDieHintVFX()
{
var VFX = _ROGrid.transform.Find("Effect/Die").gameObject;
var animancer = VFX.GetComponent<AnimancerComponent>();
if (DieVFXAnim != null)
{
_isPlayingDieHintVFX = false;
animancer.Stop(DieHintVFXAnim);
}
VFX.SetActive(false);
}
private void SetTreasureVFXAnim()
{
if (_fog.activeSelf) return;
if (_isPlayingTreasureVFX) return;
_playTreasureVFX = true;
}
private void PlayTreasureVFX()
{
var VFX = _ROGrid.transform.Find("Effect/Treasure").gameObject;
VFX.SetActive(true);
var animancer = VFX.GetComponent<AnimancerComponent>();
if (TreasureVFXAnim != null)
{
_isPlayingTreasureVFX = true;
animancer.Play(TreasureVFXAnim);
Timer.Instance.TimerRegister(VFX, () =>
{
VFX.SetActive(false);
_isPlayingTreasureVFX = false;
}, TreasureVFXAnim.length,"GridRendererPlayTreassureVFX");
}
}
private void SetHealVFXAnim()
{
if (_fog.activeSelf) return;
if (_isPlayingHealVFX) return;
_playHealVFX = true;
}
private void PlayHealVFX()
{
var VFX = _ROGrid.transform.Find("Effect/Heal").gameObject;
VFX.SetActive(true);
var animancer = VFX.GetComponent<AnimancerComponent>();
if (HealVFXAnim != null)
{
_isPlayingHealVFX = true;
animancer.Play(HealVFXAnim);
Timer.Instance.TimerRegister(VFX, () =>
{
if(VFX == null){
Debug.Log("!!!!!!!!!!!!!!!!!!!!!!");
return;
}
VFX.SetActive(false);
_isPlayingHealVFX = false;
}, HealVFXAnim.length,"GridRendererPlayHealVFX");
}
}
}
}