Files
SimUL/Assets/Scripts/TimeManager.cs
T
2023-03-14 06:09:21 +02:00

124 lines
3.4 KiB
C#

using System;
using System.Collections;
using UnityEngine;
public class TimeManager : MonoBehaviour
{
public static TimeManager Instance { get; private set; }
private const float MINUTE_TIME = 0.5f;
public static Action OnMinuteChanged;
[SerializeField]
private float _startHour;
//[SerializeField]
//private Light _sunLight;
[SerializeField]
private float _sunriseHour;
[SerializeField]
private float _sunsetHour;
private TimeSpan _sunriseTime;
private TimeSpan _sunsetTime;
private float _timer;
private float _sunInitialIntensity;
private float _minuteToRealTime;
private static TimeSpan _currentTime;
public static TimeSpan CurrentTime => _currentTime;
private TimeSpan _timeToStop;
private Action _callBackOnFastForward;
private void Awake()
{
if (Instance == null)
{
Instance = this;
DontDestroyOnLoad(gameObject);
}
else
Destroy(gameObject);
}
// Start is called before the first frame update
void Start()
{
// _sunInitialIntensity = _sunLight.intensity;
_timer = _minuteToRealTime;
_currentTime = TimeSpan.Zero + TimeSpan.FromHours(_startHour);
_timeToStop = _currentTime;
_sunriseTime = TimeSpan.FromHours(_sunriseHour);
_sunsetTime = TimeSpan.FromHours(_sunsetHour);
}
// Update is called once per frame
void Update()
{
UpdateTime();
RotateSun();
}
private void UpdateTime()
{
_timer -= Time.deltaTime;
if (_timer <= 0)
{
_currentTime = _currentTime.Add(TimeSpan.FromMinutes(1));
OnMinuteChanged?.Invoke();
if (_currentTime.TotalMinutes >= _timeToStop.TotalMinutes)
{
_minuteToRealTime = MINUTE_TIME;
_timeToStop = TimeSpan.MaxValue;
_callBackOnFastForward?.Invoke();
}
_timer = _minuteToRealTime;
}
}
public void FastForward(TimeSpan timeToStop,Action callBack)
{
_timeToStop = _currentTime.Add(timeToStop);
_minuteToRealTime = 0.03f;
_callBackOnFastForward= callBack;
}
private void RotateSun()
{
float intensityMultiplier = 1;
float timeofDay = (float)(CurrentTime.TotalDays - CurrentTime.Days);
//_sunLight.transform.localRotation = Quaternion.Euler((timeofDay * 360f) - 90, 170, 0);
if (timeofDay > _sunriseTime.TotalDays && timeofDay < _sunsetTime.TotalDays)
{
if (timeofDay <= _sunsetTime.TotalDays)
intensityMultiplier = Mathf.Clamp01((timeofDay - ((float)_sunsetTime.TotalDays - 0.02f)) * (1 / 0.02f));
if (timeofDay >= _sunriseTime.TotalDays)
intensityMultiplier = Mathf.Clamp01(1 - (timeofDay - ((float)_sunriseTime.TotalDays - 0.02f) * (1 / 0.02f)));
}
else
{
intensityMultiplier = 0;
}
// _sunLight.intensity = _sunInitialIntensity * intensityMultiplier;
}
private TimeSpan CalculateTimeDifference(TimeSpan from, TimeSpan to)
{
TimeSpan diff = to - from;
if (diff.TotalSeconds < 0)
{
diff += TimeSpan.FromHours(24);
}
return diff;
}
}