CapersProject/Assets/02.Scripts/GameTimeManager.cs

130 lines
3.5 KiB
C#

using System;
using BlueWater.Tycoons;
using Sirenix.OdinInspector;
using UnityEngine;
namespace BlueWater
{
public class GameTimeManager : Singleton<GameTimeManager>
{
[SerializeField, Required]
private GameTimeDataSo _gameTimeDataSo;
[SerializeField]
private bool _isPaused;
[Title("현재 시간 정보")]
[SerializeField]
private int _currentDays = 1;
private TimeSpan _gameTime;
private TimeSpan _closeTime;
private float _timeIncrementPerMinutes;
public Action OnTycoonClosedTime;
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());
OnTycoonClosedTime?.Invoke();
}
}
}