using UnityEngine;
|
|
|
|
public class SplineWalker : MonoBehaviour {
|
|
|
|
public BezierSpline spline;
|
|
|
|
public float duration;
|
|
|
|
public bool lookForward;
|
|
|
|
public SplineWalkerMode mode;
|
|
|
|
private float progress;
|
|
private bool goingForward = true;
|
|
|
|
private void Update () {
|
|
if (goingForward) {
|
|
progress += Time.deltaTime / duration;
|
|
if (progress > 1f) {
|
|
if (mode == SplineWalkerMode.Once) {
|
|
progress = 1f;
|
|
}
|
|
else if (mode == SplineWalkerMode.Loop) {
|
|
progress -= 1f;
|
|
}
|
|
else {
|
|
progress = 2f - progress;
|
|
goingForward = false;
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
progress -= Time.deltaTime / duration;
|
|
if (progress < 0f) {
|
|
progress = -progress;
|
|
goingForward = true;
|
|
}
|
|
}
|
|
|
|
Vector3 position = spline.GetPoint(progress);
|
|
transform.localPosition = position;
|
|
if (lookForward) {
|
|
transform.LookAt(position + spline.GetDirection(progress));
|
|
}
|
|
}
|
|
}
|