v2_5DPathPoint GetStartPoint(Vector3 position) { var distance = Mathf.Infinity; v2_5DPathPoint point = new v2_5DPathPoint(); for (int i = 0; i < points.Length; i++) { var _distance = Vector3.Distance(points[i].position, position); if (_distance < distance) { distance = _distance; point.center = points[i]; if (i + 1 < points.Length) { point.forward = points[i + 1]; } else if (i == points.Length - 1 && loopPath) { point.forward = points[0]; } if (i - 1 > -1) { point.backward = points[i - 1]; } else if (i == 0 && loopPath) { point.backward = points[points.Length - 1]; } } } return(point); }
v2_5DPathPoint GetNextPoint(Transform center) { v2_5DPathPoint point = new v2_5DPathPoint(); point.center = center; var pointIndex = System.Array.IndexOf(points, center); if (pointIndex + 1 < points.Length) { point.forward = points[pointIndex + 1]; } else if (pointIndex == points.Length - 1 && loopPath) { point.forward = points[0]; } if (pointIndex - 1 > -1) { point.backward = points[pointIndex - 1]; } else if (pointIndex == 0 && loopPath) { point.backward = points[points.Length - 1]; } return(point); }
public Vector3 ConstraintPosition(Vector3 pos, bool checkChangePoint = true) { var position = pos; if (currentPoint == null) { currentPoint = GetStartPoint(pos); } if (currentPoint.center) { if (!reference) { var obj = new GameObject("Reference"); reference = obj.transform; } position.y = currentPoint.center.position.y; if (checkChangePoint) { if (isNearBackward(position)) { currentPoint = GetNextPoint(currentPoint.backward); } if (isNearForward(position)) { currentPoint = GetNextPoint(currentPoint.forward); } } if (currentPoint.forward != null) { var dirA = (currentPoint.backward) ? currentPoint.backward.position - currentPoint.center.position : -reference.right; var pA = currentPoint.center.position + dirA; var dirB = (currentPoint.forward) ? currentPoint.forward.position - currentPoint.center.position : reference.right; var pB = currentPoint.center.position + dirB; reference.position = currentPoint.center.position; var distanceA = currentPoint.backward ? Vector3.Distance(currentPoint.center.position, currentPoint.backward.position) : Mathf.Infinity; var distanceB = currentPoint.forward ? Vector3.Distance(currentPoint.center.position, currentPoint.forward.position) : Mathf.Infinity; if (Vector3.Distance(pA, position) > distanceA + 0.1f) { reference.right = dirB; } else if (Vector3.Distance(pB, position) > distanceB + 0.1f) { reference.right = -dirA; } } if (autoUpdateCameraAngle && vThirdPersonCamera.instance) { var rot = Quaternion.LookRotation(reference.forward, Vector3.up); var angle = rot.eulerAngles.NormalizeAngle().y; vThirdPersonCamera.instance.lerpState.fixedAngle.x = angle; } var localPosition = reference.InverseTransformPoint(pos); localPosition.z = 0; return(reference.TransformPoint(localPosition)); } return(position); }
public void Init() { currentPoint = null; }