using System; using System.Collections; using System.Collections.Generic; using UnityEngine; namespace Bausatz { public class Track : MonoBehaviour { public GameObject[] prefabs; private List<float> _breaks = new List<float>(); private TrackPiece[] _pieces; public float length; private void Awake() { CalculateBreaks(); } public void CalculateBreaks() { _breaks.Clear(); _pieces = new TrackPiece[transform.childCount]; length = 0f; for (int i = 0; i < transform.childCount; i++) { var trackPiece = transform.GetChild(i).GetComponent<TrackPiece>(); _pieces[i] = trackPiece; trackPiece.CalculateLength(); length += trackPiece.length; _breaks.Add(length); } } public float GetPositionOnTrack(float progress, out float gravity, out Vector3 position, out Quaternion rotation, out float constantSpeed) { // find break progress = Mathf.Repeat(progress, length); var progressInt = 0; var lastDistance = 0f; var progressMod = 0f; foreach (var distance in _breaks) { if (progress <= distance) { progressMod = (progress - lastDistance) / (distance - lastDistance); break; } progressInt++; lastDistance = distance; } progressInt %= _breaks.Count; gravity = _pieces[progressInt].GetPositionOnTrack(progressMod, out position, out rotation, out constantSpeed); return progress; } } }