using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class GraphicEqualizer : MonoBehaviour { public Text offMultiplierText; public Text amMultiplierText; public Text pmMultiplierText; public Slider[] sliders = new Slider[24]; public float[] trafficCoefficients = new float[] { .5f,.5f,.3f,.4f,.4f,1.8f, 0.7f,1.6f,0.7f, 1.3f,1.2f,1.2f,1.2f,1.2f,1.2f,1.3f, 0.7f,1.6f,0.7f,1.5f,1.0f,1.0f,1.0f,1.0f }; public UILineRenderer lineOff0; public UILineRenderer lineAM; public UILineRenderer lineOff1; public UILineRenderer linePM; public UILineRenderer lineOff2; private float offMultiplier = 0; private float amMultiplier = 0; private float pmMultiplier = 0; private bool onStart = true; //---------------------------------------------------------------- const float AM_RUSH_INIT = 6.0f; const float AM_RUSH_END = 9.0f; const float AM_RUSH_DUR = AM_RUSH_END - AM_RUSH_INIT; const float PM_RUSH_INIT = 16.0f; const float PM_RUSH_END = 19.0f; const float PM_RUSH_DUR = PM_RUSH_END - PM_RUSH_INIT; const float OFF_PEAK_DUR = 24.0f - AM_RUSH_DUR - PM_RUSH_DUR; const float SECONDS_DAY = 86400.0f; const float SECONDS_HOUR = 3600.0f; //---------------------------------------------------------------- public void Start() { } //---------------------------------------------------------------- public void OnEnable() { RefreshSliders(); } //---------------------------------------------------------------- private void RefreshSliders() { int index = 0; foreach (float coeff in trafficCoefficients) { if (index < sliders.Length && sliders[index] != null) { if (onStart) //execute only on start { Slider slider = sliders[index]; sliders[index].onValueChanged.AddListener(delegate { ChangedSlider(slider); }); } sliders[index].value = coeff; } index++; } onStart = false; } //---------------------------------------------------------------- public void ChangedSlider(Slider slider) { ShowValueText(slider, slider.value); ShowLines(); CalculateMultipliers(out amMultiplier, out pmMultiplier, out offMultiplier); if (amMultiplierText != null) amMultiplierText.text = "x"+(Mathf.Round(amMultiplier*1000)/1000).ToString("0.000"); if (pmMultiplierText != null) pmMultiplierText.text = "x" + (Mathf.Round(pmMultiplier * 1000) / 1000).ToString("0.000"); if (offMultiplierText != null) offMultiplierText.text = "x" + (Mathf.Round(offMultiplier * 1000) / 1000).ToString("0.000"); for (int i = 0; i < sliders.Length; i++) if (sliders[i] == slider) { trafficCoefficients[i] = slider.value; break; } } //---------------------------------------------------------------- private void CalculateMultipliers(out float amMult, out float pmMult, out float offMult) { amMult = 0; pmMult = 0; offMult = 0; for (int hourOfDay = 0; hourOfDay < trafficCoefficients.Length; hourOfDay++) { if (hourOfDay >= AM_RUSH_INIT && hourOfDay < AM_RUSH_END) { amMult += sliders[hourOfDay].value; } else if (hourOfDay >= PM_RUSH_INIT && hourOfDay < PM_RUSH_END) { pmMult += sliders[hourOfDay].value; } else { offMult+= sliders[hourOfDay].value; } } amMult = amMult / AM_RUSH_DUR; pmMult = pmMult / PM_RUSH_DUR; offMult = offMult / OFF_PEAK_DUR; } //---------------------------------------------------------------- private void ShowValueText(Slider slider, float value) { Transform valueText = slider.transform.Find("ValueText"); if (valueText != null) { Text text = valueText.GetComponent(); if (text != null) text.text = value.ToString("0.00"); } } //---------------------------------------------------------------- private void ShowLines() { if (lineOff0!=null) { for (int i = 0; i < (int)AM_RUSH_INIT; i++) { lineOff0.points[i] = new Vector2(lineOff0.points[i].x, sliders[i].value * 13 / 2 + 1); } lineOff0.Redraw(); } if (lineAM != null) { int index = 0; for (int i = (int)AM_RUSH_INIT; i < (int)AM_RUSH_END; i++) { lineAM.points[index] = new Vector2(lineAM.points[index].x, sliders[i].value * 13 / 2 + 1); index++; } lineAM.Redraw(); } if (lineOff1 != null) { int index = 0; for (int i = (int)AM_RUSH_END; i < (int)PM_RUSH_INIT; i++) { lineOff1.points[index] = new Vector2(lineOff1.points[index].x, sliders[i].value * 13 / 2 + 1); index++; } lineOff1.Redraw(); } if (linePM != null) { int index = 0; for (int i = (int)PM_RUSH_INIT; i < (int)PM_RUSH_END; i++) { linePM.points[index] = new Vector2(linePM.points[index].x, sliders[i].value * 13 / 2 + 1); index++; } linePM.Redraw(); } if (lineOff2 != null) { int index = 0; for (int i = (int)PM_RUSH_END; i < 24; i++) { lineOff2.points[index] = new Vector2(lineOff2.points[index].x, sliders[i].value * 13 / 2 + 1); index++; } lineOff2.Redraw(); } } }