GameManager: Pause und Resume

This commit is contained in:
Simon Lübeß 2024-04-04 18:05:27 +02:00
parent 8013ec62a0
commit 85b4f86b31
1 changed files with 44 additions and 5 deletions

View File

@ -20,8 +20,11 @@ public class GameManager : MonoBehaviour
[SerializeField]
private List<Developer> _developers = new();
[SerializeField]
private MultiFalsableBool _gameRunning = new(false);
/// <summary>
/// Wie weit das Spiel bereits fortgeschritten ist, in Prozent.
/// Wie weit das Spiel bereits fortgeschritten ist.
/// </summary>
public double GameProgress => 1.0 - (_remainingGameDurationSeconds / _baseGameDurationSeconds);
@ -31,10 +34,12 @@ public class GameManager : MonoBehaviour
public double CurrentEfficiency => _currentEfficiency;
/// <summary>
/// Wie viele Sekunden das Spiel voraussichtlich noch dauern wird, würden die Effizienz sich nicht verändern.
/// Wie viele Sekunden das Spiel voraussichtlich noch dauern wird, würde die Effizienz sich nicht verändern.
/// </summary>
public double ExpectedRemainingGameDuration => _remainingGameDurationSeconds / _currentEfficiency;
public bool IsGameRunning => _gameRunning.IsTrue;
private void Awake()
{
if (Instance == null)
@ -46,13 +51,47 @@ public class GameManager : MonoBehaviour
Debug.LogError("GameManager already exists. Deleting duplicate.");
Destroy(gameObject);
}
InvokeRepeating(nameof(UpdateProgress), 0.0f, 1.0f);
}
private void Start()
{
StartGame();
}
/// <summary>
/// Startet ein neues Spiel.
/// </summary>
[ContextMenu("Start Game")]
private void StartGame()
{
_remainingGameDurationSeconds = _baseGameDurationSeconds;
ResumeGame();
}
/// <summary>
/// Hebt eine Pausierung auf und setzt das Spiel fort, wenn alle Pausierungen aufgehoben wurden.
/// </summary>
/// <remarks>Hinweis: Für jedes PauseGame muss ein ResumeGame aufgerufen werden.</remarks>
[ContextMenu("Resume Game")]
public void ResumeGame()
{
if (_gameRunning.MakeTruer())
{
InvokeRepeating(nameof(UpdateProgress), 0.0f, 1.0f);
}
}
/// <summary>
/// Pausiert das Spiel. Ist Stapelbar.
/// </summary>
/// <remarks>Hinweis: Für jedes PauseGame muss ein ResumeGame aufgerufen werden.</remarks>
[ContextMenu("Pause Game")]
public void PauseGame()
{
_gameRunning.MakeFalslier();
CancelInvoke(nameof(UpdateProgress));
}
void UpdateProgress()