void Start() { walls = new List <Wall>(FindObjectsOfType <Wall>()); player = FindObjectOfType <Player>(); turret = FindObjectOfType <Turret>(); visibilityPolygonCalculator = new VisibilityPolygonCSharp <Vector2>(new Vector2Adapter()); gameOverText = FindObjectOfType <Text>(); gameOverText.enabled = false; }
void Update() { // Render Player Field of View var polygons = walls.Select(wall => wall.points).ToArray(); var segments = VisibilityPolygonCSharp <Vector2> .ConvertToSegments(polygons); // `player.transform.right` is the 'front' direction // Cheesy hack to restrict player's field of view segments.Add(new Segment <Vector2>( player.transform.position - player.transform.right * 0.001F, player.transform.position + player.transform.right + player.transform.up )); segments.Add(new Segment <Vector2>( player.transform.position - player.transform.right * 0.001F, player.transform.position + player.transform.right - player.transform.up )); segments = visibilityPolygonCalculator.BreakIntersections(segments); var visibility = visibilityPolygonCalculator.Compute(player.transform.position, segments); // Triangulate to render. Too low level for my taste, honestly. Triangulator tr = new Triangulator(visibility.ToArray()); int [] triangles = tr.Triangulate(); player.mesh.Clear(); player.mesh.vertices = visibility.Select(v => (Vector3)v).ToArray(); player.mesh.triangles = triangles; player.mesh.RecalculateNormals(); if (turret.enabled) { // Render Turret Field of View polygons = walls.Select(wall => wall.points).ToArray(); segments = VisibilityPolygonCSharp <Vector2> .ConvertToSegments(polygons); segments = visibilityPolygonCalculator.BreakIntersections(segments); var turretVisibility = visibilityPolygonCalculator.Compute(turret.transform.position, segments); tr = new Triangulator(turretVisibility.ToArray()); triangles = tr.Triangulate(); turret.mesh.Clear(); turret.mesh.vertices = turretVisibility.Select(v => (Vector3)v).ToArray(); turret.mesh.triangles = triangles; turret.mesh.RecalculateNormals(); } }