using System; using System.Collections.Generic; using UnityEngine; using RuntimeData; using Animancer; using Logic; using Logic.AI; using NUnit.Framework; 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 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) { return; } //遍历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 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(); foreach(Transform child in _effect.transform) child.gameObject.SetActive(false); civName = Table.Instance.QueryCivsName(_gridData.CivId); //初始化VFXManagerDict FogEffectAnim = Resources.Load("Animations/VFX/PlayFog"); HurtVFXAnim = Resources.Load("Animations/VFX/PlayAttack"); DieVFXAnim = Resources.Load("Animations/VFX/PlayDie"); DieHintVFXAnim = Resources.Load("Animations/VFX/PlayDieHint"); TreasureVFXAnim = Resources.Load("Animations/VFX/PlayTreasure"); HealVFXAnim = Resources.Load("Animations/VFX/PlayHeal"); _dieHint = Resources.Load("ArtResources/TH1VFX/TH1VFX_Die"); _counterDieHint = Resources.Load("ArtResources/TH1VFX/TH1VFX_CounterDie"); VFXManagerDict = new Dictionary(); //初始化flag特效 GridVFXParams flagParam = new GridVFXParams(GridVFXType.Flag,Resources.Load("Animations/VFX/PlayHeal"),null,_effect.transform.Find("Flag")?.gameObject); VFXManagerDict[GridVFXType.Flag] = GridVFXRendererFactory.Create(flagParam); //初始化damage特效 GridVFXParams damageParam = new GridVFXParams(GridVFXType.Damage,Resources.Load("Animations/VFX/PlayDamage"),null,_effect.transform.Find("Damage")?.gameObject); VFXManagerDict[GridVFXType.Damage] = GridVFXRendererFactory.Create(damageParam); //初始化皇家烈焰特效 Sprite ROYALFLAMESSprite = Resources.Load("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(); 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( $"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().sprite = Resources.Load($"ArtResources/TH1Grounds/TH1Ground_{civName}"); else { if (_gridData.Terrain == TerrainType.ShallowSea) _land.GetComponent().sprite = Resources.Load($"ArtResources/TH1Waters/TH1Water_Water"); else _land.GetComponent().sprite = Resources.Load($"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(); 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().sprite = _gridData.Feature == TerrainFeature.Mountain ? Resources.Load($"ArtResources/TH1Mountains/TH1Mountain_{civName}") : null; } private void UpdateForest() { _forest.GetComponent().sprite = _gridData.Vegetation == Vegetation.Trees ? Resources.Load($"ArtResources/TH1Forests/TH1Forest_{civName}") : null; } private void UpdateResource( bool bridgeMirror = false) { 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().sprite = null; return; } //注意 playerData可能是null 对于中立格子来说 var resource = Table.Instance.GridAndResourceDataAssets.GetResourceSprite(_gridData.Resource,_playerData,_gridData); //如果是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().sprite != resource) { resourceUpdated = true; _resource.GetComponent().sprite = resource; } //处理高光效果 _resource.GetComponent().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().color = c; _borderDownRight.GetComponent().color = c; _borderUpRight.GetComponent().color = c; _borderUpLeft.GetComponent().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().color = color; _cityBorderDownRight.GetComponent().color = color; _cityBorderUpRight.GetComponent().color = color; _cityBorderUpLeft.GetComponent().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(); 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(); 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(); 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().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(); 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(); 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(); 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(); if (HealVFXAnim != null) { _isPlayingHealVFX = true; animancer.Play(HealVFXAnim); Timer.Instance.TimerRegister(VFX, () => { VFX.SetActive(false); _isPlayingHealVFX = false; }, HealVFXAnim.length,"GridRendererPlayHealVFX"); } } } }