Newer
Older
CGTrack / Assets / Scripts / Bausatz / Track.cs
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;
        }
    }
}