FM/Assets/Scripts/Editor/Tools/DevLoggerWindow.cs

338 lines
12 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

namespace HK.Editor
{
using UnityEngine;
using UnityEditor;
using System.Collections.Generic;
using System.IO;
using System;
// 移除了System.Windows.Forms引用
public class DevLoggerWindow : EditorWindow
{
// 日志分类选项
public enum LogCategory
{
,
BUG,
,
,
,
,
}
// 日志数据类
[Serializable]
public class DevLogEntry
{
public string timestamp; // 时间戳
public string content; // 开发内容
public bool isCompleted; // 是否完成
public string date; // 日期(用于分组)
public string category; // 分类标签
}
// 日志列表
private List<DevLogEntry> logEntries = new List<DevLogEntry>();
// 窗口状态
private string newLogContent = "";
private bool newLogCompleted = false;
private LogCategory selectedCategory = LogCategory.;
private string customCategory = "";
private Vector2 scrollPosition;
private string savePath;
private string copyFeedback = ""; // 复制成功提示
private float feedbackTimer = 0; // 提示信息计时器
// 菜单栏打开窗口
[MenuItem("Tool/开发日志")]
public static void ShowWindow()
{
GetWindow<DevLoggerWindow>("开发日志", true);
GetWindow<DevLoggerWindow>().minSize = new Vector2(600, 400);
}
private void OnEnable()
{
// 初始化保存路径(项目根目录/DevLogs.json
savePath = Path.Combine(Application.dataPath, "../DevLogs.json");
LoadLogs();
}
private void Update()
{
// 处理复制成功提示的显示时间
if (feedbackTimer > 0)
{
feedbackTimer -= Time.deltaTime;
if (feedbackTimer <= 0)
{
copyFeedback = "";
Repaint();
}
}
}
private void OnGUI()
{
// 显示复制成功提示
if (!string.IsNullOrEmpty(copyFeedback))
{
GUIStyle feedbackStyle = new GUIStyle(EditorStyles.helpBox);
feedbackStyle.normal.textColor = Color.green;
EditorGUILayout.LabelField(copyFeedback, feedbackStyle);
}
GUILayout.Label("添加新日志", EditorStyles.boldLabel);
// 分类选择
EditorGUILayout.BeginHorizontal();
GUILayout.Label("日志分类:", GUILayout.Width(80));
selectedCategory = (LogCategory)EditorGUILayout.EnumPopup(selectedCategory);
// 自定义分类输入框
if (selectedCategory == LogCategory.)
{
customCategory = EditorGUILayout.TextField(customCategory);
}
EditorGUILayout.EndHorizontal();
// 输入新日志内容
newLogContent = EditorGUILayout.TextArea(newLogContent, GUILayout.Height(80));
// 完成状态选择
newLogCompleted = EditorGUILayout.Toggle("是否完成", newLogCompleted);
// 添加按钮
if (GUILayout.Button("添加日志"))
{
if (!string.IsNullOrEmpty(newLogContent.Trim()))
{
// 验证自定义分类
if (selectedCategory == LogCategory. && string.IsNullOrEmpty(customCategory.Trim()))
{
EditorUtility.DisplayDialog("提示", "请输入自定义分类名称", "确定");
return;
}
AddNewLogEntry();
newLogContent = ""; // 清空输入框
newLogCompleted = false;
}
else
{
EditorUtility.DisplayDialog("提示", "日志内容不能为空", "确定");
}
}
GUILayout.Space(20);
GUILayout.Label("历史日志", EditorStyles.boldLabel);
// 显示日志列表
scrollPosition = EditorGUILayout.BeginScrollView(scrollPosition);
// 按日期分组显示
string currentDate = "";
for (int i = logEntries.Count - 1; i >= 0; i--)
{
var entry = logEntries[i];
// 显示日期分组标题
if (entry.date != currentDate)
{
currentDate = entry.date;
GUILayout.Space(10);
GUILayout.Label(currentDate, EditorStyles.centeredGreyMiniLabel);
GUILayout.Space(5);
}
// 日志条目样式
EditorGUILayout.BeginHorizontal();
// 分类标签
GUIStyle categoryStyle = new GUIStyle(EditorStyles.miniButton)
{
fontSize = 10,
fixedWidth = 80,
alignment = TextAnchor.MiddleCenter
};
SetCategoryStyleColors(categoryStyle, entry.category);
GUILayout.Label(entry.category, categoryStyle);
// 完成状态标记
string statusLabel = entry.isCompleted ? "✓ 已完成" : "○ 进行中";
GUIStyle statusStyle = entry.isCompleted
? new GUIStyle(EditorStyles.label) { normal = { textColor = Color.green } }
: new GUIStyle(EditorStyles.label) { normal = { textColor = Color.yellow } };
EditorGUILayout.LabelField(statusLabel, statusStyle, GUILayout.Width(80));
// 日志内容
EditorGUILayout.LabelField(entry.content, GUILayout.ExpandWidth(true));
// 时间戳
EditorGUILayout.LabelField(entry.timestamp, EditorStyles.miniLabel, GUILayout.Width(80));
// 复制按钮
if (GUILayout.Button("复制", EditorStyles.miniButtonLeft, GUILayout.Width(50)))
{
CopyLogToClipboard(entry);
}
// 删除按钮
if (GUILayout.Button("删除", EditorStyles.miniButtonRight, GUILayout.Width(50)))
{
if (EditorUtility.DisplayDialog("确认", "确定要删除这条日志吗?", "是", "否"))
{
logEntries.RemoveAt(i);
SaveLogs();
}
}
EditorGUILayout.EndHorizontal();
GUILayout.Space(2);
}
EditorGUILayout.EndScrollView();
}
// 将日志内容复制到剪贴板使用Unity内置方法
private void CopyLogToClipboard(DevLogEntry entry)
{
try
{
// 格式化复制内容,包含完整信息
string formattedLog = $"{entry.date} {entry.timestamp} [{entry.category}] {entry.content} ({(entry.isCompleted ? "" : "")})";
// 使用Unity编辑器的剪贴板功能
EditorGUIUtility.systemCopyBuffer = formattedLog;
// 显示复制成功提示
copyFeedback = "日志内容已复制到剪贴板!";
feedbackTimer = 2f; // 显示2秒
}
catch (Exception e)
{
Debug.LogError("复制日志失败: " + e.Message);
copyFeedback = "复制失败: " + e.Message;
feedbackTimer = 3f;
}
}
// 设置分类标签的样式颜色
private void SetCategoryStyleColors(GUIStyle style, string category)
{
switch (category)
{
case "功能开发":
style.normal.textColor = Color.white;
style.normal.background = MakeTex(2, 2, new Color(0.2f, 0.4f, 0.8f, 0.8f));
break;
case "BUG修复":
style.normal.textColor = Color.white;
style.normal.background = MakeTex(2, 2, new Color(0.8f, 0.3f, 0.3f, 0.8f));
break;
case "优化改进":
style.normal.textColor = Color.white;
style.normal.background = MakeTex(2, 2, new Color(0.3f, 0.7f, 0.3f, 0.8f));
break;
case "文档编写":
style.normal.textColor = Color.white;
style.normal.background = MakeTex(2, 2, new Color(0.7f, 0.7f, 0.3f, 0.8f));
break;
case "测试验证":
style.normal.textColor = Color.white;
style.normal.background = MakeTex(2, 2, new Color(0.6f, 0.3f, 0.8f, 0.8f));
break;
case "会议讨论":
style.normal.textColor = Color.white;
style.normal.background = MakeTex(2, 2, new Color(0.8f, 0.5f, 0.2f, 0.8f));
break;
default: // 自定义分类
style.normal.textColor = Color.white;
style.normal.background = MakeTex(2, 2, new Color(0.6f, 0.6f, 0.6f, 0.8f));
break;
}
}
// 创建简单的纹理用于GUI样式
private Texture2D MakeTex(int width, int height, Color col)
{
Color[] pix = new Color[width * height];
for (int i = 0; i < pix.Length; i++)
pix[i] = col;
Texture2D result = new Texture2D(width, height);
result.SetPixels(pix);
result.Apply();
return result;
}
// 添加新日志条目
private void AddNewLogEntry()
{
string category = selectedCategory.ToString();
if (selectedCategory == LogCategory.)
{
category = customCategory.Trim();
}
var newEntry = new DevLogEntry
{
timestamp = DateTime.Now.ToString("HH:mm:ss"),
date = DateTime.Now.ToString("yyyy-MM-dd"),
content = newLogContent,
isCompleted = newLogCompleted,
category = category
};
logEntries.Add(newEntry);
SaveLogs();
}
// 保存日志到文件
private void SaveLogs()
{
try
{
string json = JsonUtility.ToJson(new LogWrapper { entries = logEntries }, true);
File.WriteAllText(savePath, json);
}
catch (Exception e)
{
Debug.LogError("保存日志失败: " + e.Message);
}
}
// 从文件加载日志
private void LoadLogs()
{
try
{
if (File.Exists(savePath))
{
string json = File.ReadAllText(savePath);
LogWrapper wrapper = JsonUtility.FromJson<LogWrapper>(json);
if (wrapper != null && wrapper.entries != null)
{
logEntries = wrapper.entries;
}
}
}
catch (Exception e)
{
Debug.LogError("加载日志失败: " + e.Message);
logEntries = new List<DevLogEntry>();
}
}
// 用于JSON序列化的包装类
[Serializable]
private class LogWrapper
{
public List<DevLogEntry> entries;
}
}
}