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 isBlocked = _CheckIsBlocked(cellIndex, checkCellIndex); if (isBlocked) { blockedCells.Add(checkCellIndex); } else { canAttackCells.Add(checkCellIndex); } totalCells.Add(checkCellIndex); } } } private static bool _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) { return true; } return false; } } }