Some checks failed
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
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
177 lines
6.8 KiB
C#
177 lines
6.8 KiB
C#
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();
|
||
}
|
||
}
|
||
}
|