182 lines
5.6 KiB
C#
182 lines
5.6 KiB
C#
using Code.DI;
|
|
using Code.Input;
|
|
using Code.Records;
|
|
using Code.UI;
|
|
using DG.Tweening;
|
|
using TMPro;
|
|
using UnityEngine;
|
|
using UnityEngine.SceneManagement;
|
|
using UnityEngine.UI;
|
|
|
|
namespace Code.Gameplay
|
|
{
|
|
public class RaceManager : MonoBehaviour
|
|
{
|
|
[SerializeField] private TMP_Text countdownText;
|
|
[SerializeField] private TMP_Text timerText;
|
|
[SerializeField] private GameObject resultsWrapper;
|
|
[SerializeField] private GameObject youLoseWrapper;
|
|
|
|
[SerializeField] private float countdownDuration = 3f;
|
|
[SerializeField] private float startDelayAfterGo = 0.5f;
|
|
|
|
[SerializeField] private AICarController aiCar;
|
|
|
|
private float _startTime;
|
|
private float _elapsedTime;
|
|
private bool _isRaceActive;
|
|
private IInputService _inputService;
|
|
|
|
private TMP_InputField _nameField;
|
|
private Button _restartButton;
|
|
private Button _toMenuButton;
|
|
|
|
private Button _restartButtonLose;
|
|
private Button _toMenuButtonLose;
|
|
|
|
private void Awake()
|
|
{
|
|
var container = FindFirstObjectByType<DIContainer>();
|
|
_inputService = container.Resolve<IInputService>();
|
|
|
|
_nameField = resultsWrapper.transform.Find("EnterNameField")?.GetComponent<TMP_InputField>();
|
|
_restartButton = resultsWrapper.transform.Find("RestartButton")?.GetComponent<Button>();
|
|
_restartButtonLose = youLoseWrapper.transform.Find("RestartButton")?.GetComponent<Button>();
|
|
_toMenuButton = resultsWrapper.transform.Find("ToMenuButton")?.GetComponent<Button>();
|
|
_toMenuButtonLose = youLoseWrapper.transform.Find("ToMenuButton")?.GetComponent<Button>();
|
|
|
|
resultsWrapper.SetActive(false);
|
|
youLoseWrapper.SetActive(false);
|
|
}
|
|
|
|
private void Start()
|
|
{
|
|
StartCountdown();
|
|
}
|
|
|
|
private void Update()
|
|
{
|
|
if (_isRaceActive)
|
|
{
|
|
_elapsedTime = Time.time - _startTime;
|
|
UpdateTimer();
|
|
}
|
|
}
|
|
|
|
private void StartCountdown()
|
|
{
|
|
_isRaceActive = false;
|
|
_startTime = Time.time + countdownDuration + startDelayAfterGo;
|
|
|
|
countdownText.text = "3";
|
|
Invoke(nameof(Show2), 1f);
|
|
}
|
|
|
|
private void Show2()
|
|
{
|
|
countdownText.text = "2";
|
|
Invoke(nameof(Show1), 1f);
|
|
}
|
|
|
|
private void Show1()
|
|
{
|
|
countdownText.text = "1";
|
|
Invoke(nameof(ShowGo), 1f);
|
|
}
|
|
|
|
private void ShowGo()
|
|
{
|
|
countdownText.text = "GO!";
|
|
Invoke(nameof(StartRace), startDelayAfterGo);
|
|
}
|
|
|
|
private void StartRace()
|
|
{
|
|
_inputService.EnableMap(ActionMapping.Gameplay);
|
|
_isRaceActive = true;
|
|
_startTime = Time.time;
|
|
countdownText.gameObject.SetActive(false);
|
|
|
|
var trackData = FindFirstObjectByType<GameplayController>().currentTrack;
|
|
aiCar.transform.position = trackData.Waypoints[0] + Random.insideUnitSphere * 2f;
|
|
aiCar.GetComponent<AICarController>().SetRoute(trackData.Waypoints.ToArray());
|
|
}
|
|
|
|
private void UpdateTimer()
|
|
{
|
|
var totalMs = (int)(_elapsedTime * 1000f);
|
|
var minutes = totalMs / 60000;
|
|
var seconds = (totalMs % 60000) / 1000;
|
|
var milliseconds = totalMs % 1000;
|
|
|
|
timerText.text = $"{minutes:D2}:{seconds:D2}:{milliseconds:D2}";
|
|
}
|
|
|
|
public void OnFinish()
|
|
{
|
|
_isRaceActive = false;
|
|
countdownText.gameObject.SetActive(false);
|
|
|
|
resultsWrapper.SetActive(true);
|
|
aiCar.speed = 0;
|
|
|
|
var rect = resultsWrapper.GetComponent<RectTransform>();
|
|
rect.localScale = Vector3.zero;
|
|
rect.DOScale(Vector3.one, 0.3f).SetEase(Ease.OutBack);
|
|
|
|
_inputService.DisableMap(ActionMapping.Gameplay);
|
|
|
|
_restartButton.onClick.AddListener(RestartRace);
|
|
_toMenuButton.onClick.AddListener(LoadMainMenu);
|
|
}
|
|
|
|
public void OnLoose()
|
|
{
|
|
_isRaceActive = false;
|
|
countdownText.gameObject.SetActive(false);
|
|
|
|
youLoseWrapper.SetActive(true);
|
|
aiCar.speed = 0;
|
|
|
|
var rect = youLoseWrapper.GetComponent<RectTransform>();
|
|
rect.localScale = Vector3.zero;
|
|
rect.DOScale(Vector3.one, 0.3f).SetEase(Ease.OutBack);
|
|
|
|
_inputService.DisableMap(ActionMapping.Gameplay);
|
|
|
|
_restartButtonLose.onClick.AddListener(RestartRaceLose);
|
|
_toMenuButtonLose.onClick.AddListener(LoadMainMenuLose);
|
|
}
|
|
|
|
private void SaveResult()
|
|
{
|
|
var totalMs = (long)(_elapsedTime * 1000f);
|
|
var player = _nameField?.text?.Trim() ?? "Player";
|
|
if (string.IsNullOrWhiteSpace(player)) player = "Player";
|
|
|
|
RecordsService.AddRecord(player, totalMs);
|
|
}
|
|
|
|
private void RestartRace()
|
|
{
|
|
SaveResult();
|
|
SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
|
|
}
|
|
|
|
private void RestartRaceLose()
|
|
{
|
|
SaveResult();
|
|
SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
|
|
}
|
|
|
|
private void LoadMainMenu()
|
|
{
|
|
SceneManager.LoadScene("MainMenu");
|
|
}
|
|
|
|
private void LoadMainMenuLose()
|
|
{
|
|
SceneManager.LoadScene("MainMenu");
|
|
}
|
|
}
|
|
} |