using System; using BlueWater.Tycoons; using Sirenix.OdinInspector; using UnityEngine; namespace BlueWater { public class GameTimeManager : Singleton { [SerializeField, Required] private GameTimeDataSo _gameTimeDataSo; [SerializeField] private bool _isPaused; [Title("현재 시간 정보")] [SerializeField] private int _currentDays = 1; private TimeSpan _gameTime; private TimeSpan _closeTime; private float _timeIncrementPerMinutes; protected override void OnAwake() { OnTycoonPreparing(); } private void Start() { TycoonManager.Instance.OnTycoonOpenedEvent += OnTycoonOpened; TycoonManager.Instance.OnTycoonClosedEvent += OnTycoonClosed; _timeIncrementPerMinutes = _gameTimeDataSo.TimeIncrementPerMinutes; } private void Update() { if (_isPaused) return; var incrementTime = _timeIncrementPerMinutes * Time.deltaTime; _gameTime = _gameTime.Add(TimeSpan.FromMinutes(incrementTime)); if (_gameTime >= _closeTime) { OnTycoonClosed(); } } private void OnDestroy() { if (Quitting) return; TycoonManager.Instance.OnTycoonOpenedEvent -= OnTycoonOpened; TycoonManager.Instance.OnTycoonClosedEvent -= OnTycoonClosed; } public void PauseGameTime() { _isPaused = true; } public void ResumeGameTime() { _isPaused = false; } public void AddDays() { _currentDays++; } public void SetDays(int days) { if (days <= 0) { Debug.LogWarning("날짜 규격이 맞지않습니다."); return; } _currentDays = days; } public void SetGameTime(int hours, int minutes = 0) { if (hours < 0 || hours >= 24 || minutes < 0 || minutes >= 60) { Debug.LogWarning("시간 규격이 맞지않습니다."); return; } _gameTime = new TimeSpan(_gameTime.Days, hours, minutes, 0); } public int GetCurrentDays() => _currentDays; public TimeSpan GetCurrentGameTime() => _gameTime; public string GetFormattedGameTime() { return $"{_gameTime.Hours:D2}:{_gameTime.Minutes:D2}"; } public int GetTycoonOpenTime() => _gameTimeDataSo.TycoonOpenTime; public int GetTycoonCloseTime() => _gameTimeDataSo.TycoonCloseTime; public TimeSpan GetTycoonOpenTimeSpan() => new(_gameTime.Days, GetTycoonOpenTime(), 0, 0); public TimeSpan GetTycoonCloseTimeSpan() => new(_gameTime.Days, GetTycoonCloseTime(), 0, 0); private void OnTycoonPreparing() { PauseGameTime(); SetGameTime(GetTycoonOpenTime()); } private void OnTycoonOpened() { _closeTime = GetTycoonCloseTimeSpan(); SetGameTime(GetTycoonOpenTime()); ResumeGameTime(); } private void OnTycoonClosed() { PauseGameTime(); SetGameTime(GetTycoonCloseTime()); } } }