Beispiel #1
0
    public void VisionMatrixUpdate(UnitVisionInfo info)
    {
        //Color[] pixels = visibilityMap.GetPixels();
        int     row   = 0;
        Vector3 begin = WorldToMinimapPoint(new Vector3(info.unitPosition.x - info.viewDistance, 0, info.unitPosition.z - info.viewDistance));
        Vector3 end   = WorldToMinimapPoint(new Vector3(info.unitPosition.x + info.viewDistance, 0, info.unitPosition.z + info.viewDistance));

        for (int i = (int)(begin.x + begin.y * visibilityMap.width); i < (int)(end.x + end.y * visibilityMap.width); i++)
        {
            row++;
            //Color pixel = black;
            int     x        = i % visibilityMap.width;
            int     y        = i / visibilityMap.width;
            Vector2 minPoint = new Vector2(x, y);
            float   distance = Vector3.Distance(MinimapToWorldPoint(minPoint, info.unitPosition.y), info.unitPosition);
            if (distance < info.viewDistance)
            {
                for (int j = 0; j < info.borderPoints.Count; j++)
                {
                    if (IsPointInTri(MinimapToWorldPoint(minPoint, 0), info.unitPosition, info.borderPoints[j], info.borderPoints[(j + 1) % info.borderPoints.Count]))
                    {
                        Debug.DrawLine(info.borderPoints[j], info.borderPoints[(j + 1) % info.borderPoints.Count], Color.green, 0.5f);
                        visionMatrix[x, y] = 1;
                        //pixel = white;
                        //visibilityMap.SetPixel(x, y, pixel);
                        break;
                    }
                }
            }
        }
    }
Beispiel #2
0
 private void VisionCalculation()
 {
     if (previousPosition != transform.position)
     {
         previousPosition = transform.position;
         List <Vector3> points       = new List <Vector3>();
         List <Vector3> borderPoints = new List <Vector3>();
         Collider[]     blockers     = Physics.OverlapSphere(transform.position, viewDistance);
         points.Add(new Vector3(transform.position.x + viewDistance, transform.position.y, transform.position.z - viewDistance));
         points.Add(new Vector3(transform.position.x + viewDistance, transform.position.y, transform.position.z + viewDistance));
         points.Add(new Vector3(transform.position.x - viewDistance, transform.position.y, transform.position.z + viewDistance));
         points.Add(new Vector3(transform.position.x - viewDistance, transform.position.y, transform.position.z - viewDistance));
         foreach (Collider block in blockers)
         {
             BoxCollider blocker = block.transform.GetComponent <BoxCollider>();
             if (blocker is null || (!(visibilityBlocker is null) && blocker.gameObject.Equals(gameObject)))
             {
                 continue;
             }
             Vector3 pos = blocker.transform.position;
             points.Add(new Vector3(pos.x + blocker.size.x * blocker.transform.lossyScale.x / 2, transform.position.y, pos.z + blocker.size.z * blocker.transform.lossyScale.z / 2));
             points.Add(new Vector3(pos.x - blocker.size.x * blocker.transform.lossyScale.x / 2, transform.position.y, pos.z + blocker.size.z * blocker.transform.lossyScale.z / 2));
             points.Add(new Vector3(pos.x - blocker.size.x * blocker.transform.lossyScale.x / 2, transform.position.y, pos.z - blocker.size.z * blocker.transform.lossyScale.z / 2));
             points.Add(new Vector3(pos.x + blocker.size.x * blocker.transform.lossyScale.x / 2, transform.position.y, pos.z - blocker.size.z * blocker.transform.lossyScale.z / 2));
         }
         int counter = 0;
         foreach (Vector3 point in points)
         {
             counter++;
             visibility.origin = new Vector3(transform.position.x, point.y + 0.1f, transform.position.z);
             Vector3 original = (point - visibility.origin);
             original = new Vector3(original.x, 0.1f, original.z).normalized;
             float angle = 10 / original.magnitude;
             for (float i = -angle; i <= angle; i += angle)
             {
                 if (angle != 0)
                 {
                     visibility.direction = Quaternion.Euler(0, i, 0) * original;
                 }
                 else
                 {
                     visibility.direction = original;
                 }
                 RaycastHit rh;
                 if (!Physics.Raycast(visibility, out rh, viewDistance))
                 {
                     borderPoints.Add(visibility.GetPoint(viewDistance * 1.41421356237f));
                     //Debug.DrawLine(visibility.origin, visibility.GetPoint(viewDistance), Color.green, 1);
                 }
                 else
                 {
                     borderPoints.Add(rh.point);
                     //Debug.DrawLine(visibility.origin, rh.point,Color.green,1);
                 }
             }
         }
         borderPoints.Sort(new ReverserClass(transform.position));
         //if (!(Owner is null)) Owner.minimap.VisionUpdateRun(borderPoints, transform.position, viewDistance);
         unitVisionInfo = new UnitVisionInfo(borderPoints, transform.position, viewDistance);
     }
 }