Files
broberry/Assets/Scripts/Systems/GameManager.cs

91 lines
2.7 KiB
C#

using System;
using System.Collections;
using Data;
using Sirenix.Serialization;
using UnityEngine;
using UnityEngine.SceneManagement;
using Object = UnityEngine.Object;
namespace Systems
{
public class GameManager : MonoBehaviour
{
private float timer;
public static GameManager Instance { get; private set; }
[OdinSerialize, SerializeField] private int currentRound = 1;
[OdinSerialize, SerializeField] private int coins = 0;
[OdinSerialize, SerializeField] private float roundTime = 60f;
[OdinSerialize, SerializeField] private int maxRounds = 20;
[OdinSerialize, SerializeField] private Object winScene;
[OdinSerialize, SerializeField] private Transform arenaCenter;
[OdinSerialize, SerializeField] private Character player;
public Character Player => player;
public int Coins => coins;
public int CurrentRound => currentRound;
public float RoundTime => roundTime;
public int MaxRounds => maxRounds;
public bool StoreIsClosed { get; set; } = true;
public float RoundTimeLeft => Mathf.Max(0, timer);
public event Action<int> OnRoundStart;
public event Action<int> OnRoundEnd;
public event Action OnStoreOpen;
private void Awake()
{
if (Instance == null)
Instance = this;
else
Destroy(gameObject);
}
private void Start()
{
StartCoroutine(RoundLoop());
}
private IEnumerator RoundLoop()
{
OnStoreOpen?.Invoke();
yield return new WaitUntil(() => StoreIsClosed);
for (currentRound = 1; currentRound <= maxRounds; currentRound++)
{
player.transform.position = new Vector3(arenaCenter.position.x, arenaCenter.position.y, player.transform.position.z);
OnRoundStart?.Invoke(currentRound);
timer = roundTime;
while (timer > 0)
{
timer -= Time.deltaTime;
yield return null;
}
OnRoundEnd?.Invoke(currentRound);
StoreIsClosed = false;
OnStoreOpen?.Invoke();
yield return new WaitUntil(() => StoreIsClosed);
}
SceneManager.LoadScene("win");
}
public void AddCoins(int amount)
{
coins += amount;
}
public void SpendCoins(int amount)
{
if (coins >= amount)
{
coins -= amount;
}
}
}
}