ReplayPuzzleGame/Assets/Scripts/Manager/GameManager.cs

161 lines
3.6 KiB
C#
Raw Normal View History

using UnityEngine;
using UnityEngine.SceneManagement;
public enum GameState
{
2026-02-08 13:13:32 +00:00
Lobby, Preview, Playing, Die, GameOver, Clear
}
2026-02-08 13:13:32 +00:00
public class GameManager : MonoBehaviour
{
[SerializeField] private LevelData[] levelData;
public static GameManager instance;
public GameState currentState;
public LevelUI levelUI;
public int clearLevelIndex { get; private set; }
private int currentStageLevel;
2026-02-06 08:21:16 +00:00
public int currentLives { get; private set; }
public float timeForLive { get; private set; }
private float stageTimer;
private void Awake()
{
if (instance == null)
{
instance = this;
DontDestroyOnLoad(gameObject);
}
else
{
Destroy(gameObject);
}
clearLevelIndex = PlayerPrefs.GetInt("ClearLevelIndex", 1);
}
private void Update()
{
if (currentState == GameState.Playing)
{
stageTimer -= Time.deltaTime;
2026-02-08 13:13:32 +00:00
levelUI.timer.text = $"{Mathf.RoundToInt(stageTimer)}";
if (stageTimer <= 0)
{
2026-02-06 08:21:16 +00:00
currentLives = 0;
2026-02-07 14:41:29 +00:00
EndGame();
}
}
}
public void PlayerDie()
{
if (currentLives > 0)
{
2026-02-07 14:41:29 +00:00
currentLives--;
2026-02-08 13:13:32 +00:00
levelUI.livesCount.text = $"X {currentLives}";
ChangeState(GameState.Die);
RecordingManager.instance.StopPlayingRecord();
}
}
public void PlayerAlive()
{
ChangeState(GameState.Playing);
}
public void EnterLevel(int level)
{
LevelData data = levelData[level - 1];
if (data == null)
{
return;
}
currentStageLevel = data.levelIndex;
currentLives = data.maxLives;
timeForLive = data.timeLimit;
stageTimer = timeForLive;
ChangeState(GameState.Preview);
2026-02-08 13:13:32 +00:00
if (SoundManager.instance != null)
{
SoundManager.instance.PlayStageBGM();
}
}
public void LevelClear()
{
2026-02-08 13:13:32 +00:00
ChangeState(GameState.Clear);
if (Camera.main != null)
{
CameraEffect camEffect = Camera.main.GetComponent<CameraEffect>();
if (camEffect != null)
{
camEffect.SetLookDown(false);
}
}
2026-02-07 14:41:29 +00:00
if (currentStageLevel >= clearLevelIndex)
{
clearLevelIndex = currentStageLevel + 1;
PlayerPrefs.SetInt("ClearLevelIndex", clearLevelIndex);
2026-02-07 14:41:29 +00:00
}
2026-02-07 14:41:29 +00:00
Invoke("NextLevel", 3f);
}
public void RetryLevel()
{
OpenLevel(currentStageLevel);
}
public void NextLevel()
{
if (levelData.Length + 1 > currentStageLevel)
{
OpenLevel(levelData[currentStageLevel].levelIndex);
}
else
{
ExitLevel();
}
}
public void ExitLevel()
{
SceneManager.LoadScene("LevelSelction");
ChangeState(GameState.Lobby);
2026-02-08 13:13:32 +00:00
if (SoundManager.instance != null)
{
SoundManager.instance.PlayLobbyBGM();
}
}
2026-02-08 13:13:32 +00:00
public void EndGame()
{
ChangeState(GameState.GameOver);
2026-02-07 14:41:29 +00:00
Invoke("RetryLevel", 2f);
}
private void ChangeState(GameState newState)
{
currentState = newState;
}
public void OpenLevel(int level)
{
string sceneName = "Level_" + level.ToString();
if (Application.CanStreamedLevelBeLoaded(sceneName))
{
SceneManager.LoadScene(sceneName);
EnterLevel(level);
}
}
2026-02-08 13:13:32 +00:00
}