private void UpdateVisibilityGrid(List team, bool[,] visibilityGrid)
{
foreach (var teamMember in team)
{
Vector3 position = teamMember.transform.position;
float range = teamMember.sightRange;
// Calculate range around teamMember
int startX = Mathf.Max(0, Mathf.FloorToInt((position.x - range - gridOrigin.x) / cellSize));
int endX = Mathf.Min(gridWidth - 1, Mathf.FloorToInt((position.x + range - gridOrigin.x) / cellSize));
int startZ = Mathf.Max(0, Mathf.FloorToInt((position.z - range - gridOrigin.z) / cellSize));
int endZ = Mathf.Min(gridHeight - 1, Mathf.FloorToInt((position.z + range - gridOrigin.z) / cellSize));
Collider[] obstaclesInRange = Physics.OverlapSphere(position, range, obstacles);
Collider[] visibleBushes = Physics.OverlapSphere(position, 0.5f, LayerMask.GetMask("Bushes"));
foreach (Collider visibleBush in visibleBushes)
{
obstaclesInRange = obstaclesInRange.Where(obstacle => obstacle != visibleBush).ToArray();
}
// Check visibility for cells within the range
for (int x = startX; x <= endX; x++)
{
for (int z = startZ; z <= endZ; z++)
{
Vector3 cellPosition = GetCellWorldPosition(x, z);
if (Vector3.Distance(position, cellPosition) <= range)
{
if (!IsObstacleBetween(position, cellPosition, obstaclesInRange))
{
visibilityGrid[x, z] = true;
}
}
}
}
}
}
private bool IsObstacleBetween(Vector3 start, Vector3 end, Collider[] obstacles)
{
Vector3 direction = (end - start).normalized;
float distance = Vector3.Distance(start, end);
foreach (var obstacle in obstacles)
{
float rayDistance;
// Check if there is obstacle blocking the view
if (obstacle.bounds.IntersectRay(new Ray(start, direction), out rayDistance))
{
if (distance > rayDistance)
{
return true;
}
}
}
return false;
}