My goal is to make the orange field of view that is visible in the editor (left) appear when the game is running.
I am not sure if I am meant to do something in the editor or if the problem is my code
Here is my code:
public class FieldOFView : MonoBehaviour
{
public float viewRadius;
[Range(0, 360)]
public float viewAngle;
public LayerMask playerMask;
public LayerMask levelMask;
[HideInInspector]
public List<Transform> visiblePlayer = new List<Transform>();
public float meshResolution;
public int edgeResolveIterations;
public MeshFilter viewMeshFilter;
Mesh viewMesh;
void Start()
{
viewMesh = new Mesh();
viewMesh.name = "View Mesh";
viewMeshFilter.mesh = viewMesh;
StartCoroutine("FindPlayerWithDelay", .2f);
}
IEnumerator FindPlayerWithDelay(float delay)
{
while (true)
{
yield return new WaitForSeconds(delay);
FindVisibleTargets();
}
}
private void LateUpdate()
{
DrawFieldOFView();
}
void FindVisibleTargets()
{
visiblePlayer.Clear();
Collider2D[] playerInViewRadius = Physics2D.OverlapCircleAll(transform.position, viewRadius, playerMask);
for (int i = 0; i < playerInViewRadius.Length; i++)
{
Transform player = playerInViewRadius[i].transform;
Vector3 DirecToPlayer = (player.position - transform.position).normalized;
if(Vector2.Angle (transform.right, DirecToPlayer) < viewAngle / 2)
{
float distToPlayer = Vector2.Distance(transform.position, player.position);
if(!Physics2D.Raycast(transform.position, DirecToPlayer, distToPlayer, levelMask))
{
//what to do to player once seen
visiblePlayer.Add(player);
}
}
}
}
void DrawFieldOFView()
{
int rayCount = Mathf.RoundToInt(viewAngle * meshResolution);
float rayAngleSize = viewAngle / rayCount;
List<Vector3> viewPoints = new List<Vector3>();
ViewCastInfo oldViewCast = new ViewCastInfo();
for (int i = 0; i <= rayCount ; i++)
{
float angle = transform.eulerAngles.z - viewAngle / 2 + rayAngleSize * i;
ViewCastInfo newViewCast = ViewCast(angle);
if (i > 0)
{
if(oldViewCast.hit != newViewCast.hit)
{
EdgeInfo edge = FindEdge(oldViewCast, newViewCast);
if(edge.pointA != Vector3.zero)
{
viewPoints.Add(edge.pointA);
}
if (edge.pointB != Vector3.zero)
{
viewPoints.Add(edge.pointB);
}
}
}
viewPoints.Add(newViewCast.point);
oldViewCast = newViewCast;
}
int vertexCount = viewPoints.Count + 1;
Vector3[] vertices = new Vector3[vertexCount];
int[] triangles = new int[(vertexCount - 2) * 3];
vertices[0] = Vector3.zero;
for (int i = 0; i < vertexCount- 1; i++)
{
vertices[i + 1] = transform.InverseTransformPoint(viewPoints[i]);
if (i < vertexCount - 2)
{
triangles[i * 3] = 0;
triangles[i * 3 + 1] = i + 1;
triangles[i * 3 + 2] = i + 2;
}
}
viewMesh.Clear();
viewMesh.vertices = vertices;
viewMesh.triangles = triangles;
viewMesh.RecalculateNormals();
}
EdgeInfo FindEdge(ViewCastInfo minViewCast, ViewCastInfo maxViewCast)
{
float minAngle = minViewCast.angle;
float maxAngle = maxViewCast.angle;
Vector3 minPoint = Vector3.zero;
Vector3 maxPoint = Vector3.zero;
for (int i = 0; i < edgeResolveIterations; i++)
{
float angle = (minAngle + maxAngle) / 2;
ViewCastInfo newViewCast = ViewCast(angle);
if(newViewCast.hit == minViewCast.hit)
{
minAngle = angle;
minPoint = newViewCast.point;
}
else
{
maxAngle = angle;
maxPoint = newViewCast.point;
}
}
return new EdgeInfo(minPoint, maxPoint);
}
ViewCastInfo ViewCast(float globalAngle)
{
Vector3 direc = DirecFromAngle(globalAngle, true);
RaycastHit2D hit = Physics2D.Raycast(transform.position, new Vector3(direc.x, direc.y, 0), viewRadius, levelMask);
if (hit.collider != null)
{
return new ViewCastInfo(true, hit.point, hit.distance, globalAngle);
}
else
{
return new ViewCastInfo(false, (Vector3)transform.position + direc * viewRadius, viewRadius, globalAngle);
}
}
public Vector2 DirecFromAngle(float angleInDegrees, bool angleIsGlobal)
{
if (!angleIsGlobal)
{
angleInDegrees += transform.eulerAngles.z;
}
return new Vector2(Mathf.Cos(angleInDegrees * Mathf.Deg2Rad), Mathf.Sin(angleInDegrees * Mathf.Deg2Rad));
}
public struct ViewCastInfo
{
public bool hit;
public Vector3 point;
public float dist;
public float angle;
public ViewCastInfo(bool _hit, Vector3 _point, float _dist, float _angle)
{
hit = _hit;
point = _point;
dist = _dist;
angle = _angle;
}
}
public struct EdgeInfo
{
public Vector3 pointA;
public Vector3 pointB;
public EdgeInfo(Vector3 _pointA, Vector3 _pointB)
{
pointA = _pointA;
pointB = _pointA;
}
}
}