101 lines
3.2 KiB
C#
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;
|
|
}
|
|
}
|