public void Unfog(Vector3 position, float radius, float angle, Vector3 forward, int layermask = 0) { FogFill fogfill = new FogFill(this, position, radius, angle, forward); ColliderFogRectList colliderrects = GetExtendedColliders(fogfill, layermask); if (colliderrects == null) { fogfill.UnfogCircle(_values); return; } //if (colliderrects.Count != 1 || !colliderrects[0].ContainsCircle(fogfill.position, fogfill.radius)) // fogfill.UnfogCircle(_values, colliderrects); fogfill.UnfogCircleLineOfSight(_values, colliderrects, layermask); }
ColliderFogRectList GetExtendedColliders(FogFill fogfill, int layermask) { // quick check to see if all raycasts will hit something if (layermask == 0) { return(null); } ColliderFogRectList colliderrects = null; if (mode == FogOfWarMode.Mode2D) { // is there anything overlapping with the area? Collider2D[] colliders = Physics2D.OverlapCircleAll(fogfill.worldPosition, fogfill.worldRadius, layermask); if (colliders.Length == 0) { return(null); } // extend the colliders outwards away from the center colliderrects = new ColliderFogRectList(this); colliderrects.Add(colliders); } else//if (mode == FogOfWarMode.Mode3D) { // is there anything overlapping with the area? Collider[] colliders = Physics.OverlapSphere(fogfill.worldPosition, fogfill.worldRadius, layermask); if (colliders.Length == 0) { return(null); } // extend the colliders outwards away from the center colliderrects = new ColliderFogRectList(this); colliderrects.Add(colliders); } colliderrects.ExtendToCircleEdge(fogfill.position, fogfill.radius); colliderrects.Optimise(); return(colliderrects.Count == 0 ? null : colliderrects); }