private void LateUpdate() { float t = NormalizedT; BezierSplineAdvanced spline = Spline; bool forward = MovingForward; for (int i = 0; i < tailObjects.Count; i++) { Transform tailObject = tailObjects[i]; float dt = Time.deltaTime; if (forward) { tailObject.position = spline.MoveAlongSpline(ref t, -tailObjectDistances[i]); if (lookForward) { tailObject.rotation = Quaternion.Lerp(tailObject.rotation, Quaternion.LookRotation(spline.GetTangent(t)), rotationLerpModifier * dt); } } else { tailObject.position = spline.MoveAlongSpline(ref t, tailObjectDistances[i]); if (lookForward) { tailObject.rotation = Quaternion.Lerp(tailObject.rotation, Quaternion.LookRotation(-spline.GetTangent(t)), rotationLerpModifier * dt); } } } }
private void Update() { float targetSpeed = (isGoingForward) ? speed : -speed; Vector3 targetPos = spline.MoveAlongSpline(ref progress, targetSpeed * Time.deltaTime); cachedTransform.position = targetPos; //cachedTransform.position = Vector3.Lerp( cachedTransform.position, targetPos, movementLerpModifier * Time.deltaTime ); bool movingForward = MovingForward; if (lookForward) { Quaternion targetRotation; if (movingForward) { targetRotation = Quaternion.LookRotation(spline.GetTangent(progress)); } else { targetRotation = Quaternion.LookRotation(-spline.GetTangent(progress)); } cachedTransform.rotation = Quaternion.Lerp(cachedTransform.rotation, targetRotation, rotationLerpModifier * Time.deltaTime); } if (movingForward) { if (progress >= 1f) { if (!onPathCompletedCalledAt1) { onPathCompleted.Invoke(); onPathCompletedCalledAt1 = true; } if (travelMode == TravelMode.Once) { progress = 1f; } else if (travelMode == TravelMode.Loop) { progress -= 1f; } else { progress = 2f - progress; isGoingForward = !isGoingForward; } } else { onPathCompletedCalledAt1 = false; } } else { if (progress <= 0f) { if (!onPathCompletedCalledAt0) { onPathCompleted.Invoke(); onPathCompletedCalledAt0 = true; } if (travelMode == TravelMode.Once) { progress = 0f; } else if (travelMode == TravelMode.Loop) { progress += 1f; } else { progress = -progress; isGoingForward = !isGoingForward; } } else { onPathCompletedCalledAt0 = false; } } }