- Created AdvancedLoggingExample class demonstrating composite and file loggers - Implemented multi-file logging setup with separate error and full logs - Added game event and performance logging methods - Included key input handling for log operations (flush, clear) - Setup proper resource disposal on application quit
135 lines
4.4 KiB
C#
135 lines
4.4 KiB
C#
using System;
|
|
using System.Collections;
|
|
using UnityEngine;
|
|
using UnityEngine.UI;
|
|
using TMPro;
|
|
|
|
using RR.Common.UI;
|
|
using RR.Game2D.Core.Managers;
|
|
using UnityEngine.EventSystems;
|
|
|
|
public class LoseBannerController : MonoBehaviour
|
|
{
|
|
[SerializeField] private GameEndUIController bannersController;
|
|
|
|
[Header("Кнопки")]
|
|
[SerializeField] private TextMeshProUGUI loseText;
|
|
[SerializeField] private Button continueButton;
|
|
[SerializeField] private TextMeshProUGUI continueButtonText;
|
|
[SerializeField] private float continueButtonCountdown = 10f;
|
|
|
|
private Coroutine continueCountdownCoroutine;
|
|
|
|
public event Action ContinueClicked;
|
|
|
|
private void OnEnable()
|
|
{
|
|
bannersController.LoseBannerShown += OnLoseBannerShown;
|
|
}
|
|
|
|
private void OnDisable()
|
|
{
|
|
bannersController.LoseBannerShown -= OnLoseBannerShown;
|
|
// Остановим корутину, если объект деактивируется
|
|
if (continueCountdownCoroutine != null)
|
|
{
|
|
StopCoroutine(continueCountdownCoroutine);
|
|
continueCountdownCoroutine = null;
|
|
}
|
|
}
|
|
|
|
private void Awake()
|
|
{
|
|
if (continueButton) continueButton.onClick.AddListener(OnContinueClicked);
|
|
|
|
// Инициализируем видимость/интерактивность кнопок в безопасное состояние
|
|
if (continueButton) continueButton.gameObject.SetActive(false);
|
|
if (continueButton && continueButtonText) continueButtonText.text = string.Empty;
|
|
}
|
|
|
|
private void OnLoseBannerShown(float gameTime)
|
|
{
|
|
// EventSystem.current.firstSelectedGameObject = continueButton.gameObject;
|
|
EventSystem.current.SetSelectedGameObject(continueButton.gameObject);
|
|
|
|
loseText.text = $"Время игры: {GameEndUIController.FormatTime(gameTime)}";
|
|
|
|
if (continueButtonCountdown <= 0f)
|
|
{
|
|
ContinueClicked?.Invoke();
|
|
GameManager.Instance.SetPause(false);
|
|
GameManager.Instance.LoadScene("MainMenu", false);
|
|
}
|
|
|
|
if (continueButton)
|
|
{
|
|
continueButton.gameObject.SetActive(true);
|
|
continueButton.interactable = true;
|
|
}
|
|
|
|
// Остановим предыдущую корутину, если есть
|
|
if (continueCountdownCoroutine != null)
|
|
{
|
|
StopCoroutine(continueCountdownCoroutine);
|
|
continueCountdownCoroutine = null;
|
|
}
|
|
|
|
continueCountdownCoroutine = StartCoroutine(ContinueCountdownCoroutine(continueButtonCountdown));
|
|
}
|
|
|
|
private IEnumerator ContinueCountdownCoroutine(float duration)
|
|
{
|
|
|
|
float elapsed = 0f;
|
|
// Обновляем сразу первоначальный текст
|
|
int initialSeconds = Mathf.RoundToInt(duration);
|
|
UpdateContinueText(initialSeconds);
|
|
|
|
while (elapsed < duration)
|
|
{
|
|
// Using yield return null and manual timing with unscaled time for more reliable updates
|
|
float startTime = Time.unscaledTime;
|
|
yield return null;
|
|
|
|
// Wait for approximately 1 second using unscaled time
|
|
while (Time.unscaledTime - startTime < 1.0f)
|
|
{
|
|
yield return null;
|
|
}
|
|
|
|
elapsed += 1f;
|
|
int remaining = Mathf.Max(0, Mathf.RoundToInt(duration - elapsed));
|
|
UpdateContinueText(remaining);
|
|
}
|
|
|
|
if (continueButton)
|
|
{
|
|
ContinueClicked?.Invoke();
|
|
GameManager.Instance.SetPause(false);
|
|
GameManager.Instance.LoadScene("MainMenu", false);
|
|
}
|
|
|
|
continueCountdownCoroutine = null;
|
|
}
|
|
|
|
private void UpdateContinueText(int secondsRemaining)
|
|
{
|
|
if (continueButtonText)
|
|
continueButtonText.text = $"Продолжить? ({secondsRemaining})";
|
|
}
|
|
|
|
private void OnContinueClicked()
|
|
{
|
|
// При клике на "Продолжить" — остановим таймер и продолжим игру
|
|
if (continueCountdownCoroutine != null)
|
|
{
|
|
StopCoroutine(continueCountdownCoroutine);
|
|
continueCountdownCoroutine = null;
|
|
}
|
|
|
|
ContinueClicked?.Invoke();
|
|
GameManager.Instance.SetPause(false);
|
|
GameManager.Instance.ContinueGame();
|
|
}
|
|
}
|