127 lines
3.4 KiB
C#
127 lines
3.4 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;
|
|
|
|
protected override void OnAwake()
|
|
{
|
|
OnTycoonPreparing();
|
|
}
|
|
|
|
private void Start()
|
|
{
|
|
EventManager.OnTycoonGameStarted += OnTycoonOpened;
|
|
EventManager.OnTycoonGameOvered += 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;
|
|
|
|
EventManager.OnTycoonGameStarted -= OnTycoonOpened;
|
|
EventManager.OnTycoonGameOvered -= 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());
|
|
}
|
|
}
|
|
} |