Danro/Assets/Scripts/Utilities/AdvancedLogging_Test.cs
Danil Iarosh 6b02c76ef3
Some checks failed
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
refactor: LightController + LightSequence, протокол 85XXYY, namespace
LightController / LightMode:
- Новый LightMode.cs: enum эффектов под протокол 85XXYY (13 эффектов + Off)
  значения enum = коды команд XX, Off=-1 генерирует просто '85'
- Новый LightController.cs: управление подсветкой платы
  * SetLight(mode, duration) → строит команду 85XXYY, возвращает LightSequence
  * Blink() / StopBlink() / SetBlinkInterval() — мигание шляпы
  * StopSequence() / StopAllEffects() — остановка эффектов
  * Все параметры (hatOn/hatOff, blinkInterval, defaultMode/Duration) в инспекторе
- Вложенный класс LightSequence — builder цепочек эффектов:
  SetLight(A,3).Then(B,3).Then(C,3).Loop()
  SetLight(A,3).Then(LightMode.Off)
  SetLight(A,5) — одиночный эффект
GameManager:
- Добавлено свойство Light (→ Plate.Light)
- GameWin   → SetLight(FinalWave, 30)
- GameOver  → SetLight(BlueWave, 30)
- NewGame   → SetLight(Rainbow, 99)
- LoadScene MainMenu → SetLight(Off) + Blink()
namespace (добавлены в файлы без namespace):
- Editor/MouseWorldPositionOverlay.cs  → RR.Common.InspectorOverrides
- UI/StatsWindowUIController.cs        → RR.Common.UI
- Utilities/AdvancedLogging_Test.cs    → RR.Common.Utility
- Utilities/DebugSettings.cs           → RR.Common.Utility
2026-02-19 16:52:59 +03:00

177 lines
6.8 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 UnityEngine;
using System;
namespace 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();
}
}
}