(client) feat:UI更新 chore:LogUI性能更好,并且修复反复打开Log消失的bug,删除部分非预期的警告

This commit is contained in:
m0_75251201
2025-08-30 00:26:27 +08:00
parent 34abe845b1
commit 7252698764
58 changed files with 4849 additions and 508 deletions

View File

@ -1,7 +1,7 @@
using System;
using System.Collections.Generic;
using Prefab;
using TMPro;
using Prefab; // 假设 TextPrefab 在 Prefab 命名空间下
using TMPro; // 假设 TextPrefab 内部使用了 TextMeshPro
using UnityEngine;
namespace UI
@ -21,66 +21,80 @@ namespace UI
{ LogType.Assert, new Color(0.8f, 0.4f, 1f) }
};
private List<Transform> _logItems = new List<Transform>(); // 已创建的日志条目
// 逻辑修改将_logItems改为存储TextPrefab实例避免频繁GetComponent
private List<TextPrefab> _logItems = new List<TextPrefab>(); // 已创建的日志条目
private int _lastLogCount = 0; // 上次显示的日志数量
private void Start()
// 逻辑修改在Update中周期性检查日志数量变化并刷新UI
private void Update()
{
Logging.LogCapturer.Clear();
// 获取当前LogCapturer中的日志数量最旧在前
var currentCapturerLogCount = Logging.LogCapturer.GetLogs(reverseOrder: false).Count;
if (_lastLogCount != currentCapturerLogCount)
{
RefreshLogDisplay();
}
}
public override void Show()
{
base.Show();
RefreshLogDisplay();
RefreshLogDisplay(); // 首次显示时刷新
}
private void RefreshLogDisplay()
{
var logs = Logging.LogCapturer.GetLogs();
// 逻辑修改:获取"最旧在前,最新在后"的日志列表与UI显示顺序匹配
var currentLogsInCapturer = Logging.LogCapturer.GetLogs(reverseOrder: false);
var newLogCount = currentLogsInCapturer.Count;
var existingUiItemCount = _logItems.Count;
// 如果日志数量减少,清理多余的条目
if (logs.Count < _lastLogCount)
// 逻辑修改处理日志数量减少的情况日志被从LogCapturer的队列前端移除即最旧的日志
if (newLogCount < existingUiItemCount)
{
for (var i = logs.Count; i < _lastLogCount; i++)
// 计算需要移除的UI条目数量
var itemsToRemove = existingUiItemCount - newLogCount;
// 从_logItems的开头移除销毁最旧的UI元素
for (var i = 0; i < itemsToRemove; i++)
{
// 确保销毁对应的GameObject避免内存泄露
Destroy(_logItems[i].gameObject);
}
_logItems.RemoveRange(logs.Count, _logItems.Count - logs.Count);
_logItems.RemoveRange(0, itemsToRemove); // 从列表中移除引用
}
// 更新现有条目
for (var i = 0; i < Math.Min(logs.Count, _logItems.Count); i++)
// 逻辑修改处理日志数量增加的情况LogCapturer中新增日志
else if (newLogCount > existingUiItemCount)
{
UpdateLogEntry(_logItems[i], logs[logs.Count - 1 - i]);
}
// 添加新的条目
if (logs.Count > _lastLogCount)
{
for (var i = _lastLogCount; i < logs.Count; i++)
// 从现有UI条目数量开始创建新的UI条目并添加到_logItems末尾
for (var i = existingUiItemCount; i < newLogCount; i++)
{
CreateLogEntry(logs[logs.Count - 1 - i]);
CreateLogEntry(currentLogsInCapturer[i]); // 创建并添加新的UI元素会自动追加到_logItems
}
}
_lastLogCount = logs.Count;
// 逻辑修改:更新所有现有/剩余的UI条目内容确保与LogCapturer中的数据一致
// 这一步确保了UI元素能准确反映其对应的日志数据处理了任何可能的日志内容更新或初始设置。
for (var i = 0; i < newLogCount; i++)
{
UpdateLogEntry(_logItems[i], currentLogsInCapturer[i]);
}
_lastLogCount = newLogCount; // 更新上次显示的日志数量
}
private void CreateLogEntry(Logging.LogCapturer.LogEntry entry)
{
// 实例化文本预制体
// 实例化文本预制体,并将其添加到内容面板
var logItem = Instantiate(textPrefab, contentPanel);
_logItems.Add(logItem.transform);
_logItems.Add(logItem); // 逻辑修改直接添加TextPrefab实例
UpdateLogEntry(logItem.transform, entry);
UpdateLogEntry(logItem, entry); // 逻辑修改直接传入TextPrefab实例进行更新
}
private void UpdateLogEntry(Transform logItemTransform, Logging.LogCapturer.LogEntry entry)
// 逻辑修改UpdateLogEntry现在直接接收TextPrefab实例更高效
private void UpdateLogEntry(TextPrefab logItem, Logging.LogCapturer.LogEntry entry)
{
var logItem = logItemTransform.GetComponent<TextPrefab>();
// 设置文本内容
logItem.Label = entry.ToString();
@ -96,5 +110,22 @@ namespace UI
logItem.text.alignment = TextAlignmentOptions.TopLeft;
}
// 逻辑修改添加OnDestroy方法来清理动态创建的UI元素
private void OnDestroy()
{
if (_logItems != null)
{
foreach (var item in _logItems)
{
// 检查item及其gameObject是否仍有效以防在其他地方已经被销毁或为空
if (item != null && item.gameObject != null)
{
Destroy(item.gameObject);
}
}
_logItems.Clear(); // 清空列表引用
}
}
}
}
}