Exemplo n.º 1
0
    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));
    }
Exemplo n.º 2
0
    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();
    }