using System; using System.Collections.Generic; using System.Linq; using UnityEngine; using UnityEditor; public readonly struct SectorTime { public SectorTime(int i, double t) { Sector = i; Value = t; } public int Sector { get; } public double Value { get; } public override string ToString() => $"{Sector} {Value:0.000}"; } public readonly struct Lap { public Lap(int i, List s) { Sectors = s; Number = i; } public int Number { get; } public List Sectors { get; } public override string ToString() { return $"Lap {Number} : {TimeSpan.FromSeconds(TotalTime()):g} {String.Join(" ", Sectors.ConvertAll(s => s.ToString()))}"; } double TotalTime() { return Sectors.Sum(s => s.Value); } } public class Timing: MonoBehaviour { [SerializeField] public List lapTimes; [SerializeField] public List sectorTimes; public bool timerEnabled; public double sectorTime; double sectorStart; Sector[] sectors; void Awake() { lapTimes = new List(); sectorTimes = new List(); sectorStart = 0.0; sectorTime = 0.0; sectors = GetComponentsInChildren(); Debug.Log("Track Sector Count - " + sectors.Length); } void Update() { if (timerEnabled) sectorTime = Time.timeAsDouble - sectorStart; } public void StartTimer() { if (sectors.Length == 0) { Debug.LogWarning("No Sectors found in timing"); return; } Debug.Log("Started Timer"); timerEnabled = true; sectorStart = Time.timeAsDouble; } public void StopTimer() { sectorTimes = new List(); timerEnabled = false; sectorTime = 0; Debug.Log("Timer Stopped"); EndLap(); } public void NextSector(int sector) { if (!timerEnabled) return; // they turned around or somethin? if (sectorTimes.Any(s => s.Sector == sector)) return; // this basically makes sure the timer doesn't do anything weird // due to respawns, driving in the wrong direction etc // you have to hit the sectors in numbered order // --------------- // make sure sectors are only accessible by being hit by following // the track correctly! if (sector != sectorTimes.Count + 1) return; double sTime = Time.timeAsDouble - sectorStart; SectorTime s = new SectorTime(sector, sTime); sectorTimes.Add(s); if (sectorTimes.Count == sectors.Length) { EndLap(); NextLap(); } } void NextLap() { Debug.Log("NextLap" + lapTimes.Count); sectorTimes = new List(); StartTimer(); } public void EndLap() { // when live reloading this happens if (sectorTimes == null) Awake(); if (sectorTimes.Count > 0) { Lap l = new Lap(lapTimes.Count, sectorTimes); Debug.Log($"EndLap {l}"); lapTimes.Add(l); } } }