Some checks failed
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
- Добавлена система ввода текста через модальное окно с ячейками для аркадного автомата - Реализован TextInputModal с поддержкой кастомных алфавитов и навигации - Добавлен TextInputCell для ввода отдельных символов с циклической навигацией - Создан TextInputSettingsBinder для интеграции ввода текста с системой настроек - Реализована компактная сериализация настроек (только нужные поля в JSON) - Внедрена система баланса игрока (BalanceManager) - Баланс начисляется при оплате импульсом, списывается при начале/продолжении игры - Добавлен InactivityManager для выхода в меню при отсутствии активности (5 минут) - Улучшена система настроек - Добавлены флаги shownInSettings и exposed для управления видимостью настроек - Реализована автоматическая регистрация/отписка SettingsButtonBinder при активации/деактивации - Исправлена загрузка настроек с проверкой типов через Sanitize() - SettingsApplier упрощен - оставлена только поддержка AudioManager - Добавлен ValueSelectorRow для выбора целочисленных значений с шагом - Удалены примеры и документация из production кода (QUICK_SETUP.md, TextInputExample, AdvancedLoggingExample) - Убран весь отладочный вывод Debug.Log из системы настроек и ввода текста - Очищены неразрывные пробелы из файлов проекта - Добавлены префабы UI (InputCell)
176 lines
6.3 KiB
C#
176 lines
6.3 KiB
C#
using UnityEngine;
|
||
using System;
|
||
using RR.Common.Utility;
|
||
|
||
/// <summary>
|
||
/// Продвинутый пример использования системы логирования.
|
||
/// Демонстрирует различные сценарии использования FileLogger и CompositeLogger.
|
||
/// </summary>
|
||
public class AdvancedLogging_Test : MonoBehaviour
|
||
{
|
||
private CompositeLogger compositeLogger;
|
||
private FileLogger mainFileLogger;
|
||
private FileLogger errorFileLogger;
|
||
|
||
void Start()
|
||
{
|
||
SetupAdvancedLogging();
|
||
DemonstrateLogging();
|
||
}
|
||
|
||
/// <summary>
|
||
/// Настройка продвинутой системы логирования с несколькими выходными файлами
|
||
/// </summary>
|
||
private void SetupAdvancedLogging()
|
||
{
|
||
// Создаём композитный логгер
|
||
compositeLogger = new CompositeLogger();
|
||
compositeLogger.Initialize();
|
||
|
||
// Главный файл - все логи
|
||
mainFileLogger = new FileLogger(
|
||
System.IO.Path.Combine(Application.persistentDataPath, "full_log.txt"),
|
||
append: true
|
||
);
|
||
mainFileLogger.filterLogType = LogType.Log; // Все типы сообщений
|
||
|
||
// Отдельный файл только для ошибок и исключений
|
||
errorFileLogger = new FileLogger(
|
||
System.IO.Path.Combine(Application.persistentDataPath, "errors_only.txt"),
|
||
append: true
|
||
);
|
||
errorFileLogger.filterLogType = LogType.Warning; // Только Warning, Error, Exception
|
||
|
||
// Добавляем оба логгера
|
||
compositeLogger.AddLoggers(mainFileLogger, errorFileLogger);
|
||
|
||
Debug.Log($"Логирование настроено. Файлы в: {Application.persistentDataPath}");
|
||
}
|
||
|
||
/// <summary>
|
||
/// Демонстрация различных типов логирования
|
||
/// </summary>
|
||
private void DemonstrateLogging()
|
||
{
|
||
// Простые сообщения
|
||
compositeLogger.Log("=== Демонстрация системы логирования ===");
|
||
|
||
// Сообщения с тегами
|
||
compositeLogger.Log("SYSTEM", "Игра инициализирована");
|
||
compositeLogger.LogWarning("AUDIO", "Громкость музыки установлена в 0.5");
|
||
|
||
// Форматированные сообщения
|
||
string playerName = "Player1";
|
||
int score = 1000;
|
||
compositeLogger.LogFormat(LogType.Log, "Игрок {0} набрал {1} очков", playerName, score);
|
||
|
||
// Логирование с контекстом
|
||
compositeLogger.Log("Объект создан", this.gameObject);
|
||
|
||
// Имитация ошибки
|
||
compositeLogger.LogError("ERROR", "Это тестовая ошибка - будет в обоих файлах!");
|
||
|
||
// Имитация исключения
|
||
try
|
||
{
|
||
throw new InvalidOperationException("Тестовое исключение для демонстрации");
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
compositeLogger.LogException(ex, this.gameObject);
|
||
}
|
||
|
||
// Информация о путях
|
||
Debug.Log($"Полный лог: {Application.persistentDataPath}/full_log.txt");
|
||
Debug.Log($"Только ошибки: {Application.persistentDataPath}/errors_only.txt");
|
||
}
|
||
|
||
/// <summary>
|
||
/// Пример метода для логирования игровых событий
|
||
/// </summary>
|
||
public void LogGameEvent(string eventName, params object[] parameters)
|
||
{
|
||
string paramStr = string.Join(", ", parameters);
|
||
compositeLogger.Log("GAME_EVENT", $"{eventName}: {paramStr}");
|
||
}
|
||
|
||
/// <summary>
|
||
/// Пример метода для логирования производительности
|
||
/// </summary>
|
||
public void LogPerformance(string operation, float duration)
|
||
{
|
||
if (duration > 0.016f) // Больше 16мс (60 FPS)
|
||
{
|
||
compositeLogger.LogWarning("PERFORMANCE", $"{operation} занял {duration * 1000:F2}мс");
|
||
}
|
||
else
|
||
{
|
||
compositeLogger.Log("PERFORMANCE", $"{operation} выполнен за {duration * 1000:F2}мс");
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Пример обёртки для измерения времени выполнения
|
||
/// </summary>
|
||
public void PerformOperationWithLogging(string operationName, Action operation)
|
||
{
|
||
float startTime = Time.realtimeSinceStartup;
|
||
|
||
try
|
||
{
|
||
operation.Invoke();
|
||
float duration = Time.realtimeSinceStartup - startTime;
|
||
LogPerformance(operationName, duration);
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
compositeLogger.LogException(ex);
|
||
compositeLogger.LogError("OPERATION", $"Операция '{operationName}' завершилась с ошибкой");
|
||
}
|
||
}
|
||
|
||
void Update()
|
||
{
|
||
// Пример: логируем нажатия клавиш
|
||
if (Input.GetKeyDown(KeyCode.L))
|
||
{
|
||
LogGameEvent("KeyPress", "L", Time.time);
|
||
}
|
||
|
||
if (Input.GetKeyDown(KeyCode.F))
|
||
{
|
||
// Принудительная запись на диск
|
||
mainFileLogger.Flush();
|
||
errorFileLogger.Flush();
|
||
compositeLogger.Log("SYSTEM", "Логи принудительно сохранены на диск");
|
||
}
|
||
|
||
if (Input.GetKeyDown(KeyCode.C))
|
||
{
|
||
// Очистка логов
|
||
mainFileLogger.Clear();
|
||
errorFileLogger.Clear();
|
||
compositeLogger.Log("SYSTEM", "Файлы логов очищены");
|
||
}
|
||
}
|
||
|
||
void OnApplicationQuit()
|
||
{
|
||
compositeLogger.Log("SYSTEM", "Приложение завершается...");
|
||
|
||
// Важно: освобождаем ресурсы
|
||
mainFileLogger?.Dispose();
|
||
errorFileLogger?.Dispose();
|
||
|
||
Debug.Log("Файловые логгеры закрыты");
|
||
}
|
||
|
||
void OnDestroy()
|
||
{
|
||
// На всякий случай
|
||
mainFileLogger?.Dispose();
|
||
errorFileLogger?.Dispose();
|
||
}
|
||
}
|
||
|