RUDPClient/Assets/Scripts/UI/NetworkDiagnosticsOverlay.cs

101 lines
3.2 KiB
C#

using System;
using Network.NetworkTransport;
using UnityEngine;
public sealed class NetworkDiagnosticsOverlay : MonoBehaviour
{
[SerializeField] private KeyCode _toggleKey = KeyCode.F3;
[SerializeField] private bool _visible = true;
[SerializeField] private float _refreshIntervalSeconds = 1f;
[SerializeField] private Vector2 _panelSize = new Vector2(560f, 420f);
[SerializeField] private Vector2 _panelOffset = new Vector2(16f, 16f);
private readonly GUIStyle _panelStyle = new GUIStyle();
private readonly GUIStyle _headerStyle = new GUIStyle();
private readonly GUIStyle _bodyStyle = new GUIStyle();
private Vector2 _scrollPosition;
private string _diagnosisText = "暂无诊断报告。";
private string _reportPath = "未找到";
private float _nextRefreshAt;
private void Awake()
{
ConfigureStyles();
RefreshDiagnosis();
}
private void Update()
{
if (Input.GetKeyDown(_toggleKey))
{
_visible = !_visible;
}
if (Time.unscaledTime >= _nextRefreshAt)
{
RefreshDiagnosis();
}
}
private void OnGUI()
{
if (!_visible)
{
return;
}
var area = new Rect(_panelOffset.x, _panelOffset.y, _panelSize.x, _panelSize.y);
GUILayout.BeginArea(area, GUIContent.none, _panelStyle);
GUILayout.Label("Network Diagnosis", _headerStyle);
GUILayout.Label("网络诊断面板", _headerStyle);
GUILayout.Space(6f);
GUILayout.Label("Toggle: F3", _bodyStyle);
GUILayout.Label("最新报告: " + _reportPath, _bodyStyle);
GUILayout.Space(8f);
_scrollPosition = GUILayout.BeginScrollView(_scrollPosition);
GUILayout.Label(_diagnosisText, _bodyStyle);
GUILayout.EndScrollView();
GUILayout.EndArea();
}
private void ConfigureStyles()
{
_panelStyle.normal.background = MakeBackground(new Color(0.08f, 0.11f, 0.15f, 0.92f));
_panelStyle.padding = new RectOffset(14, 14, 12, 12);
_headerStyle.fontSize = 16;
_headerStyle.fontStyle = FontStyle.Bold;
_headerStyle.normal.textColor = new Color(0.92f, 0.96f, 0.98f);
_headerStyle.wordWrap = false;
_bodyStyle.fontSize = 13;
_bodyStyle.normal.textColor = new Color(0.82f, 0.88f, 0.92f);
_bodyStyle.wordWrap = true;
_bodyStyle.richText = false;
}
private void RefreshDiagnosis()
{
_nextRefreshAt = Time.unscaledTime + Mathf.Max(0.25f, _refreshIntervalSeconds);
try
{
var path = TransportMetricsReportLocator.TryGetLatestDiagnosisPath();
_reportPath = string.IsNullOrWhiteSpace(path) ? "未找到" : path;
_diagnosisText = TransportMetricsReportLocator.ReadLatestDiagnosisText() ?? "暂无诊断报告。";
}
catch (Exception exception)
{
_reportPath = "读取失败";
_diagnosisText = "读取诊断报告失败:\n" + exception.Message;
}
}
private static Texture2D MakeBackground(Color color)
{
var texture = new Texture2D(1, 1, TextureFormat.RGBA32, false);
texture.SetPixel(0, 0, color);
texture.Apply();
return texture;
}
}