118 lines
3.3 KiB
C#
118 lines
3.3 KiB
C#
using FishNet.Managing.Timing;
|
|
using UnityEngine;
|
|
|
|
namespace FishNet.Component.Utility
|
|
{
|
|
/// <summary>
|
|
/// Add to any object to display current ping(round trip time).
|
|
/// </summary>
|
|
[AddComponentMenu("FishNet/Component/PingDisplay")]
|
|
public class PingDisplay : MonoBehaviour
|
|
{
|
|
#region Types.
|
|
private enum Corner
|
|
{
|
|
TopLeft,
|
|
TopRight,
|
|
BottomLeft,
|
|
BottomRight
|
|
}
|
|
#endregion
|
|
|
|
#region Serialized.
|
|
/// <summary>
|
|
/// Color for text.
|
|
/// </summary>
|
|
[Tooltip("Color for text.")]
|
|
[SerializeField]
|
|
private Color _color = Color.white;
|
|
/// <summary>
|
|
/// Which corner to display ping in.
|
|
/// </summary>
|
|
[Tooltip("Which corner to display ping in.")]
|
|
[SerializeField]
|
|
private Corner _placement = Corner.TopRight;
|
|
/// <summary>
|
|
/// True to show the real ping. False to include tick rate latency within the ping.
|
|
/// </summary>
|
|
[Tooltip("True to show the real ping. False to include tick rate latency within the ping.")]
|
|
[SerializeField]
|
|
private bool _hideTickRate = true;
|
|
#endregion
|
|
|
|
#region Private.
|
|
/// <summary>
|
|
/// Style for drawn ping.
|
|
/// </summary>
|
|
private GUIStyle _style = new GUIStyle();
|
|
#endregion
|
|
|
|
private void OnGUI()
|
|
{
|
|
//No need to perform these actions on server.
|
|
#if !UNITY_EDITOR && UNITY_SERVER
|
|
return;
|
|
#endif
|
|
|
|
//Only clients can see pings.
|
|
if (!InstanceFinder.IsClient)
|
|
return;
|
|
|
|
_style.normal.textColor = _color;
|
|
_style.fontSize = 15;
|
|
float width = 85f;
|
|
float height = 15f;
|
|
float edge = 10f;
|
|
|
|
float horizontal;
|
|
float vertical;
|
|
|
|
if (_placement == Corner.TopLeft)
|
|
{
|
|
horizontal = 10f;
|
|
vertical = 10f;
|
|
}
|
|
else if (_placement == Corner.TopRight)
|
|
{
|
|
horizontal = Screen.width - width - edge;
|
|
vertical = 10f;
|
|
}
|
|
else if (_placement == Corner.BottomLeft)
|
|
{
|
|
horizontal = 10f;
|
|
vertical = Screen.height - height - edge;
|
|
}
|
|
else
|
|
{
|
|
horizontal = Screen.width - width - edge;
|
|
vertical = Screen.height - height - edge;
|
|
}
|
|
|
|
long ping;
|
|
TimeManager tm = InstanceFinder.TimeManager;
|
|
if (tm == null)
|
|
{
|
|
ping = 0;
|
|
}
|
|
else
|
|
{
|
|
ping = tm.RoundTripTime;
|
|
long deduction = 0;
|
|
if (_hideTickRate)
|
|
{
|
|
deduction = (long)(tm.TickDelta * 1000d);
|
|
/* If host subtract two ticks, if client only subtract one tick.
|
|
* This will reflect the users real ping without the tick rate latency. */
|
|
if (InstanceFinder.IsHost)
|
|
deduction *= 2;
|
|
}
|
|
|
|
ping = (long)Mathf.Max(0, ping - deduction);
|
|
}
|
|
|
|
GUI.Label(new Rect(horizontal, vertical, width, height), $"Ping: {ping}ms", _style);
|
|
}
|
|
}
|
|
|
|
|
|
} |