using System.Collections.Generic; using Gameplay.Level; using UnityEngine; namespace Gameplay.Area.AttackArea { public class AttackAreaData { public int cellIndex; public int attackDistance; public List canAttackCells; public List blockedCells; public List totalCells; public AttackAreaData(int cellIndex, int attackDistance) { this.cellIndex = cellIndex; this.attackDistance = attackDistance; _CalculateCanAttackCells(); } private void _CalculateCanAttackCells() { canAttackCells = new List(); blockedCells = new List(); totalCells = new List(); var allCellIndex = AreaManager.instance.GetCellIndexsAround(cellIndex, attackDistance); var map = LevelManager.Instance.CurrentLevel.Map; for (int i = 0; i < allCellIndex.Count; i++) { var checkCellIndex = allCellIndex[i]; var blockData = map.GetBlockData(checkCellIndex); if (blockData.GetTerrainTypeProperty().banAttack) { blockedCells.Add(checkCellIndex); } else { var hitCellIndex = _CheckIsBlocked(cellIndex, checkCellIndex); if (hitCellIndex > -1) { if (hitCellIndex == checkCellIndex && AreaManager.instance.attackAreaManager.tempBlockAttackCellMap.TryGetValue(hitCellIndex, out var tempBlockData)) { // 有临时阻挡 if (tempBlockData.canBeAttack) { canAttackCells.Add(checkCellIndex); } else { blockedCells.Add(checkCellIndex); } } else { blockedCells.Add(checkCellIndex); } } else { canAttackCells.Add(checkCellIndex); } totalCells.Add(checkCellIndex); } } } private static int _CheckIsBlocked(int startCellIndex, int endCellIndex) { var startPos = AreaManager.instance.GetCellPosByIndex(startCellIndex); var endPos = AreaManager.instance.GetCellPosByIndex(endCellIndex); var toEnd = endPos - startPos; var distance = toEnd.magnitude; var dir = toEnd / distance; var layerMask = AreaManager.instance.attackAreaManager.hitMask; var hitCount = Physics.RaycastNonAlloc(startPos, dir, AreaManager.instance.attackAreaManager.raycastHits, distance, layerMask); if (hitCount > 0) { var hit = AreaManager.instance.attackAreaManager.raycastHits[0]; var hitObj = hit.collider.gameObject; var pos = hitObj.transform.position; var hitCellIndex = AreaManager.instance.GetCellIndexByPos(pos); return hitCellIndex; } return -1; } } }