KeepItUp/Assets/_Scripts/Managers/UIManager.cs
2022-07-30 21:33:47 +03:00

193 lines
7.3 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Linq;
using System.Threading.Tasks;
using DatabaseModels.DataTransferObjets;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
public class UIManager : MonoBehaviour
{
[Header("UI Canvas")]
[SerializeField] private Animator _mainMenuAnimator;
[SerializeField] private Animator _gameMenuAnimator;
[SerializeField] private Animator _gameOverMenuAnimator;
[Header("Game Menu -> Score")]
[SerializeField] private TextMeshProUGUI _currentScoreText;
[SerializeField] private TextMeshProUGUI _rewardMultiplierText;
[SerializeField] private Slider _experienceSlider;
[SerializeField] private float _sliderSmoothTime;
private float _sliderVelocity;
[Header("Game Over Menu")]
[SerializeField] private TextMeshProUGUI _gameOverScoreText;
[Header("Authentication Menu")]
[SerializeField] public GameObject _authenticationMenu;
[SerializeField] private TMP_InputField _usernameInputField;
[SerializeField] private TMP_InputField _passwordInputField;
[SerializeField] private TextMeshProUGUI _authenticationErrorText;
[Header("Scoreboard")]
[SerializeField] private RectTransform _scoreboardScrollViewContent;
[SerializeField] public GameObject _scoreboardLoadingScreen;
[SerializeField] public GameObject _scoreboardLoginTip;
[SerializeField] private GameObject _scoreboardRecordPrefab;
[SerializeField] private Color _scoreboardRecordColor1;
[SerializeField] private Color _scoreboardRecordColor2;
[SerializeField] private Color _scoreboardPlayerRecordColor;
private void Awake()
{
GameStateManager.Instance.OnGameStateChange += OnGameStateChange;
}
private void OnDestroy()
{
GameStateManager.Instance.OnGameStateChange -= OnGameStateChange;
}
public void SetScoreText(int score)
{
_currentScoreText.text = $"{score}";
}
public void SetRewardMultiplierText(int multiplier)
{
_rewardMultiplierText.text = $"×{multiplier}";
}
public void SetExperienceSliderValue(int value)
{
_experienceSlider.value = value;
}
public void SetExperienceSliderMaxValue(int value)
{
_experienceSlider.maxValue = value;
}
public void UpdateExperienceSlider(int targetValue, out bool isFull)
{
_experienceSlider.value = Mathf.SmoothDamp(_experienceSlider.value, targetValue, ref _sliderVelocity, _sliderSmoothTime);
isFull = Math.Abs(_experienceSlider.value - _experienceSlider.maxValue) < 0.1f;
}
public Task InstantiateScoreboardRecords(ScoreboardRecordDto[] records, int firstRecordIndex)
{
_scoreboardScrollViewContent.sizeDelta = new Vector2(0, records.Length * 100);
float yPos = 0;
if (records.Last().User.Username == SessionStore.UserData.Username)
{
yPos = _scoreboardScrollViewContent.sizeDelta.y / records.Length / 100;
}
else if (records.First().User.Username == SessionStore.UserData.Username)
{
yPos = 0;
}
else
{
yPos = _scoreboardScrollViewContent.sizeDelta.y / records.Length * 2f;
}
_scoreboardScrollViewContent.localPosition = new Vector3(0, yPos);
for (int i = 0; i < records.Length; i++)
{
var record = Instantiate(_scoreboardRecordPrefab, Vector3.zero, Quaternion.identity, _scoreboardScrollViewContent.transform);
record.GetComponent<RectTransform>().localPosition = new Vector2(218, -50 - 100 * i);
if (records[i].User.Username == SessionStore.UserData.Username)
{
record.GetComponent<Image>().color = _scoreboardPlayerRecordColor;
}
else
{
record.GetComponent<Image>().color = i % 2 == 0 ? _scoreboardRecordColor1 : _scoreboardRecordColor2;
}
record.GetComponentInChildren<TextMeshProUGUI>().text = $"{firstRecordIndex + i + 1}. {records[i].User.Username}: {records[i].Score}";
}
return Task.CompletedTask;
}
public Task DestroyAllScoreboardRecords()
{
for (int i = 0; i < _scoreboardScrollViewContent.transform.childCount; i++)
{
Destroy(_scoreboardScrollViewContent.transform.GetChild(i).gameObject);
}
return Task.CompletedTask;
}
public void SetGameOverScore(int value)
{
_gameOverScoreText.text = value.ToString();
}
public (string username, string password) GetAuthenticationCredentials()
{
return (_usernameInputField.text, _passwordInputField.text);
}
public void SetAuthenticationErrorMessage(string message)
{
_authenticationErrorText.text = message;
}
private async void OnGameStateChange(GameState newGameState)
{
switch (newGameState)
{
case GameState.Loading:
break;
case GameState.Menu:
if (_gameOverMenuAnimator.gameObject.activeSelf)
{
_gameOverMenuAnimator.CrossFade("FadeOut", 0);
await Task.Delay((int) (Math.Abs(_gameOverMenuAnimator.GetCurrentAnimatorClipInfo(0)[0].clip.length / _gameOverMenuAnimator.GetCurrentAnimatorStateInfo(0).speed) * 1000));
_gameOverMenuAnimator.gameObject.SetActive(false);
}
_mainMenuAnimator.gameObject.SetActive(true);
_mainMenuAnimator.CrossFade("FadeIn", 0);
break;
case GameState.PreGame:
if (_gameOverMenuAnimator.gameObject.activeSelf)
{
_gameOverMenuAnimator.CrossFade("FadeOut", 0);
await Task.Delay((int) (Math.Abs(_gameOverMenuAnimator.GetCurrentAnimatorClipInfo(0)[0].clip.length / _gameOverMenuAnimator.GetCurrentAnimatorStateInfo(0).speed) * 1000));
_gameOverMenuAnimator.gameObject.SetActive(false);
}
if (_mainMenuAnimator.gameObject.activeSelf)
{
_mainMenuAnimator.CrossFade("FadeOut", 0);
await Task.Delay(10);
await Task.Delay((int) (Math.Abs(_mainMenuAnimator.GetCurrentAnimatorClipInfo(0)[0].clip.length / _mainMenuAnimator.GetCurrentAnimatorStateInfo(0).speed) * 1000));
_mainMenuAnimator.gameObject.SetActive(false);
}
_mainMenuAnimator.gameObject.SetActive(false);
_gameOverMenuAnimator.gameObject.SetActive(false);
_gameMenuAnimator.gameObject.SetActive(true);
_gameMenuAnimator.CrossFade("FadeIn", 0);
break;
case GameState.Game:
break;
case GameState.GameOver:
_gameMenuAnimator.CrossFade("FadeOut", 0);
await Task.Delay((int) (Math.Abs(_gameMenuAnimator.GetCurrentAnimatorClipInfo(0)[0].clip.length / _gameMenuAnimator.GetCurrentAnimatorStateInfo(0).speed) * 1000));
_gameMenuAnimator.gameObject.SetActive(false);
_gameOverMenuAnimator.gameObject.SetActive(true);
_gameOverMenuAnimator.CrossFade("FadeIn", 0);
break;
default:
throw new ArgumentOutOfRangeException(nameof(newGameState), newGameState, null);
}
}
}