130 lines
3.4 KiB
C#
130 lines
3.4 KiB
C#
namespace IchniOnline.Online.Util
|
|
{
|
|
using System;
|
|
using System.IO;
|
|
using System.Text;
|
|
using UnityEditor;
|
|
using UnityEngine;
|
|
|
|
[InitializeOnLoad]
|
|
public static class EditorFileLogger
|
|
{
|
|
private static readonly object LockObj = new();
|
|
private static StreamWriter writer;
|
|
|
|
static EditorFileLogger()
|
|
{
|
|
try
|
|
{
|
|
string logDir = Path.Combine(
|
|
Environment.GetFolderPath(Environment.SpecialFolder.Desktop),
|
|
"UnityEditorLogs");
|
|
|
|
Directory.CreateDirectory(logDir);
|
|
|
|
string logFile = Path.Combine(
|
|
logDir,
|
|
$"Editor_{DateTime.Now:yyyyMMdd_HHmmss}.log");
|
|
|
|
writer = new StreamWriter(
|
|
new FileStream(
|
|
logFile,
|
|
FileMode.Create,
|
|
FileAccess.Write,
|
|
FileShare.ReadWrite,
|
|
4096,
|
|
FileOptions.WriteThrough),
|
|
Encoding.UTF8);
|
|
|
|
writer.AutoFlush = true;
|
|
|
|
Application.logMessageReceivedThreaded += OnLog;
|
|
|
|
EditorApplication.quitting += Shutdown;
|
|
EditorApplication.playModeStateChanged += OnPlayModeStateChanged;
|
|
|
|
WriteLine("====================================");
|
|
WriteLine($"Unity Version : {Application.unityVersion}");
|
|
WriteLine($"Project : {Application.productName}");
|
|
WriteLine($"Started : {DateTime.Now:yyyy-MM-dd HH:mm:ss.fff}");
|
|
WriteLine("====================================");
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
Debug.LogException(e);
|
|
}
|
|
}
|
|
|
|
private static void OnPlayModeStateChanged(PlayModeStateChange state)
|
|
{
|
|
switch (state)
|
|
{
|
|
case PlayModeStateChange.ExitingEditMode:
|
|
WriteLine("[EDITOR] >>> Preparing To Enter Play Mode");
|
|
break;
|
|
|
|
case PlayModeStateChange.EnteredPlayMode:
|
|
WriteLine("[EDITOR] >>> Entered Play Mode");
|
|
break;
|
|
|
|
case PlayModeStateChange.ExitingPlayMode:
|
|
WriteLine("[EDITOR] <<< Exiting Play Mode");
|
|
break;
|
|
|
|
case PlayModeStateChange.EnteredEditMode:
|
|
WriteLine("[EDITOR] <<< Returned To Edit Mode");
|
|
break;
|
|
}
|
|
}
|
|
|
|
private static void OnLog(
|
|
string condition,
|
|
string stackTrace,
|
|
LogType type)
|
|
{
|
|
lock (LockObj)
|
|
{
|
|
if (writer == null)
|
|
return;
|
|
|
|
writer.WriteLine(
|
|
$"[{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff}] [{type}] {condition}");
|
|
|
|
if (!string.IsNullOrWhiteSpace(stackTrace))
|
|
{
|
|
writer.WriteLine(stackTrace);
|
|
}
|
|
|
|
writer.Flush();
|
|
}
|
|
}
|
|
|
|
private static void WriteLine(string message)
|
|
{
|
|
lock (LockObj)
|
|
{
|
|
if (writer == null)
|
|
return;
|
|
|
|
writer.WriteLine(
|
|
$"[{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff}] {message}");
|
|
|
|
writer.Flush();
|
|
}
|
|
}
|
|
|
|
private static void Shutdown()
|
|
{
|
|
EditorApplication.playModeStateChanged -= OnPlayModeStateChanged;
|
|
EditorApplication.quitting -= Shutdown;
|
|
Application.logMessageReceivedThreaded -= OnLog;
|
|
|
|
lock (LockObj)
|
|
{
|
|
writer?.Flush();
|
|
writer?.Dispose();
|
|
writer = null;
|
|
}
|
|
}
|
|
}
|
|
} |