void Update() { if (boundary == null) { return; } var min = new Helper.LinePoint { Distance = Mathf.Infinity }; Boundary closestLine = null; foreach (Boundary line in boundary) { Helper.LinePoint point = line.ClosestPoint(myTransform.position); if (point.Distance < min.Distance) { min = point; closestLine = line; } } if (closestLine != null) { BoundaryVertex pointA = closestLine.GetPoint(min.Index); Vector3 normal = pointA.Normal.normalized; if (min.Index < closestLine.PointCount - 1 && min.ProjectionDistance > 0) { BoundaryVertex pointB = closestLine.GetPoint(min.Index + 1); normal = Vector3.Lerp(normal, pointB.Normal.normalized, min.ProjectionDistance); } normal = closestLine.transform.TransformDirection(normal); float lookDot = Vector3.Dot(myTransform.forward, normal); float dot = Vector3.Dot(myTransform.position - min.Point, normal); if (lookDot <= 0) { ResetFog(); } else if (dot > 0) { ShowFog(lookDot); Slowdown(min.Distance, lookDot); } else if (min.Distance <= FogStartDistance) { float fogFactor = 1 - min.Distance / FogStartDistance; fogFactor *= lookDot; ShowFog(fogFactor); } else { ResetFog(); } } else { ResetFog(); } }
public override Helper.LinePoint ClosestPoint(Vector3 pos) { var min = new Helper.LinePoint { Distance = Mathf.Infinity }; for (var i = 1; i < points.Count; i++) { Vector3 a = transform.TransformPoint(points[i - 1].Position); Vector3 b = transform.TransformPoint(points[i].Position); Helper.LinePoint point = Helper.PointToLine(pos, a, b, i - 1); if (point.Distance < min.Distance) { min = point; } } return(min); }