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; } } } } }
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); } }