private EdgeInfo FindEdge(VisionCastInfo minVisionCast, VisionCastInfo maxVisionCast) { var minAngle = minVisionCast.Angle; var maxAngle = maxVisionCast.Angle; var minPoint = Vector3.zero; var maxPoint = Vector3.zero; for (int i = 0; i < EdgeResolveIterations; i++) { var angle = (minAngle + maxAngle) / 2; var newVisionCast = VisionCast(angle); var edgeDistanceThresholdExceeded = Mathf.Abs(minVisionCast.Distance - newVisionCast.Distance) > EdgeDistanceThreshold; if (newVisionCast.Hit == minVisionCast.Hit && !edgeDistanceThresholdExceeded) { minAngle = angle; minPoint = newVisionCast.Point; } else { maxAngle = angle; maxPoint = newVisionCast.Point; } } return(new EdgeInfo(minPoint, maxPoint)); }
private void DrawVision() { int stepCount = Mathf.RoundToInt((Angle / 10) * VisionMeshResolution); var stepAngleSize = Angle / stepCount; var vertices = new List <Vector3>(); var oldVisionCast = new VisionCastInfo(); for (int i = 0; i <= stepCount; i++) { var angle = _unitVisionDisplayInstance.transform.eulerAngles.y - Angle / 2 + stepAngleSize * i; var newVisionCast = VisionCast(angle); if (i > 0) { var edgeDistanceThresholdExceeded = Mathf.Abs(oldVisionCast.Distance - newVisionCast.Distance) > EdgeDistanceThreshold; if (oldVisionCast.Hit != newVisionCast.Hit || (oldVisionCast.Hit && newVisionCast.Hit && edgeDistanceThresholdExceeded)) { var edge = FindEdge(oldVisionCast, newVisionCast); if (edge.PointA != Vector3.zero) { vertices.Add(_unitVisionDisplayInstance.transform.InverseTransformPoint(edge.PointA)); } if (edge.PointB != Vector3.zero) { vertices.Add(_unitVisionDisplayInstance.transform.InverseTransformPoint(edge.PointB)); } } } vertices.Add(_unitVisionDisplayInstance.transform.InverseTransformPoint(newVisionCast.Point)); oldVisionCast = newVisionCast; } vertices.Insert(0, Vector3.zero); int numTriangles = (vertices.Count - 2); int[] triangles = new int[numTriangles * 3]; for (int i = 0; i < numTriangles; i++) { triangles[i * 3] = 0; triangles[i * 3 + 1] = i + 1; triangles[i * 3 + 2] = i + 2; } _visionMesh.Clear(); _visionMesh.vertices = vertices.ToArray(); _visionMesh.triangles = triangles; _visionMesh.RecalculateNormals(); }