/* --------------------------------------- * Author: Martin Pane (martintayx@gmail.com) (@martinTayx) * Contributors: https://github.com/Tayx94/graphy/graphs/contributors * Project: Graphy - Ultimate Stats Monitor * Date: 05-Dec-17 * Studio: Tayx * * Git repo: https://github.com/Tayx94/graphy * * This project is released under the MIT license. * Attribution is not required, but it is always welcomed! * -------------------------------------*/ using UnityEngine; using UnityEngine.UI; #if GRAPHY_XR using UnityEngine.XR; #endif using System.Collections.Generic; using System.Text; using Tayx.Graphy.UI; using Tayx.Graphy.Utils; using Tayx.Graphy.Utils.NumString; namespace Tayx.Graphy.Advanced { public class G_AdvancedData : MonoBehaviour, IMovable, IModifiableState { #region Variables -> Serialized Private [SerializeField] private List m_backgroundImages = new List(); [SerializeField] private Text m_graphicsDeviceVersionText = null; [SerializeField] private Text m_processorTypeText = null; [SerializeField] private Text m_operatingSystemText = null; [SerializeField] private Text m_systemMemoryText = null; [SerializeField] private Text m_graphicsDeviceNameText = null; [SerializeField] private Text m_graphicsMemorySizeText = null; [SerializeField] private Text m_screenResolutionText = null; [SerializeField] private Text m_gameWindowResolutionText = null; [SerializeField] private Text m_gameVRResolutionText = null; #if GRAPHY_XR private readonly List m_displaySubsystems = new List(); #endif [Range( 1, 60 )] [SerializeField] private float m_updateRate = 1f; // 1 update per sec. #endregion #region Variables -> Private private GraphyManager m_graphyManager = null; private RectTransform m_rectTransform = null; private Vector2 m_origPosition = Vector2.zero; private float m_deltaTime = 0.0f; private StringBuilder m_sb = null; private GraphyManager.ModuleState m_previousModuleState = GraphyManager.ModuleState.FULL; private GraphyManager.ModuleState m_currentModuleState = GraphyManager.ModuleState.FULL; private readonly string[] m_windowStrings = { "Window: ", "x", "@", "Hz", "[", "dpi]" }; private readonly string[] m_vrStrings = { "VR: (", "*2)x", "@", "Hz" }; #endregion #region Methods -> Unity Callbacks private void Awake() { Init(); } private void Update() { m_deltaTime += Time.unscaledDeltaTime; if( m_deltaTime > 1f / m_updateRate ) { // Update screen window resolution m_sb.Length = 0; m_sb.Append( m_windowStrings[ 0 ] ).Append( Screen.width.ToStringNonAlloc() ) .Append( m_windowStrings[ 1 ] ).Append( Screen.height.ToStringNonAlloc() ) .Append( m_windowStrings[ 2 ] ).Append( #if UNITY_2022_2_OR_NEWER ((int)Screen.currentResolution.refreshRateRatio.value).ToStringNonAlloc() #else Screen.currentResolution.refreshRate.ToStringNonAlloc() #endif ) .Append( m_windowStrings[ 3 ] ) .Append( m_windowStrings[ 4 ] ).Append( ((int) Screen.dpi).ToStringNonAlloc() ) .Append( m_windowStrings[ 5 ] ); m_gameWindowResolutionText.text = m_sb.ToString(); #if GRAPHY_XR // If XR enabled, update screen XR resolution if( XRSettings.enabled ) { m_sb.Length = 0; #if UNITY_2020_2_OR_NEWER SubsystemManager.GetSubsystems( m_displaySubsystems ); #else SubsystemManager.GetInstances( m_displaySubsystems ); #endif float refreshRate = -1; if( m_displaySubsystems.Count > 0 ) { m_displaySubsystems[ 0 ].TryGetDisplayRefreshRate( out refreshRate ); } m_sb.Append( m_vrStrings[ 0 ] ).Append( XRSettings.eyeTextureWidth.ToStringNonAlloc() ) .Append( m_vrStrings[ 1 ] ).Append( XRSettings.eyeTextureHeight.ToStringNonAlloc() ) .Append( m_vrStrings[ 2 ] ).Append( Mathf.RoundToInt( refreshRate ).ToStringNonAlloc() ) .Append( m_vrStrings[ 3 ] ); m_gameVRResolutionText.text = m_sb.ToString(); } #endif // Reset variables m_deltaTime = 0f; } } #endregion #region Methods -> Public public void SetPosition( GraphyManager.ModulePosition newModulePosition, Vector2 offset ) { if ( newModulePosition == GraphyManager.ModulePosition.FREE ) return; m_rectTransform.anchoredPosition = m_origPosition; float xSideOffset = Mathf.Abs( m_rectTransform.anchoredPosition.x ) + offset.x; float ySideOffset = Mathf.Abs( m_rectTransform.anchoredPosition.y ) + offset.y; switch( newModulePosition ) { case GraphyManager.ModulePosition.TOP_LEFT: m_rectTransform.anchorMax = Vector2.up; m_rectTransform.anchorMin = Vector2.up; m_rectTransform.anchoredPosition = new Vector2( xSideOffset, -ySideOffset ); break; case GraphyManager.ModulePosition.TOP_RIGHT: m_rectTransform.anchorMax = Vector2.one; m_rectTransform.anchorMin = Vector2.one; m_rectTransform.anchoredPosition = new Vector2( -xSideOffset, -ySideOffset ); break; case GraphyManager.ModulePosition.BOTTOM_LEFT: m_rectTransform.anchorMax = Vector2.zero; m_rectTransform.anchorMin = Vector2.zero; m_rectTransform.anchoredPosition = new Vector2( xSideOffset, ySideOffset ); break; case GraphyManager.ModulePosition.BOTTOM_RIGHT: m_rectTransform.anchorMax = Vector2.right; m_rectTransform.anchorMin = Vector2.right; m_rectTransform.anchoredPosition = new Vector2( -xSideOffset, ySideOffset ); break; } switch( newModulePosition ) { case GraphyManager.ModulePosition.TOP_LEFT: case GraphyManager.ModulePosition.BOTTOM_LEFT: m_processorTypeText.alignment = TextAnchor.UpperLeft; m_systemMemoryText.alignment = TextAnchor.UpperLeft; m_graphicsDeviceNameText.alignment = TextAnchor.UpperLeft; m_graphicsDeviceVersionText.alignment = TextAnchor.UpperLeft; m_graphicsMemorySizeText.alignment = TextAnchor.UpperLeft; m_screenResolutionText.alignment = TextAnchor.UpperLeft; m_gameWindowResolutionText.alignment = TextAnchor.UpperLeft; m_gameVRResolutionText.alignment = TextAnchor.UpperLeft; m_operatingSystemText.alignment = TextAnchor.UpperLeft; break; case GraphyManager.ModulePosition.TOP_RIGHT: case GraphyManager.ModulePosition.BOTTOM_RIGHT: m_processorTypeText.alignment = TextAnchor.UpperRight; m_systemMemoryText.alignment = TextAnchor.UpperRight; m_graphicsDeviceNameText.alignment = TextAnchor.UpperRight; m_graphicsDeviceVersionText.alignment = TextAnchor.UpperRight; m_graphicsMemorySizeText.alignment = TextAnchor.UpperRight; m_screenResolutionText.alignment = TextAnchor.UpperRight; m_gameWindowResolutionText.alignment = TextAnchor.UpperRight; m_gameVRResolutionText.alignment = TextAnchor.UpperRight; m_operatingSystemText.alignment = TextAnchor.UpperRight; break; } } public void SetState( GraphyManager.ModuleState state, bool silentUpdate = false ) { if( !silentUpdate ) { m_previousModuleState = m_currentModuleState; } m_currentModuleState = state; bool active = state == GraphyManager.ModuleState.FULL || state == GraphyManager.ModuleState.TEXT || state == GraphyManager.ModuleState.BASIC; gameObject.SetActive( active ); m_backgroundImages.SetAllActive( active && m_graphyManager.Background ); } /// /// Restores state to the previous one. /// public void RestorePreviousState() { SetState( m_previousModuleState ); } public void UpdateParameters() { foreach( var image in m_backgroundImages ) { image.color = m_graphyManager.BackgroundColor; } SetPosition( m_graphyManager.AdvancedModulePosition, Vector2.zero ); SetState( m_graphyManager.AdvancedModuleState ); } public void RefreshParameters() { foreach( var image in m_backgroundImages ) { image.color = m_graphyManager.BackgroundColor; } SetPosition( m_graphyManager.AdvancedModulePosition, Vector2.zero ); SetState( m_currentModuleState, true ); } #endregion #region Methods -> Private private void Init() { G_IntString.Init( 0, 7680 ); m_graphyManager = transform.root.GetComponentInChildren(); m_sb = new StringBuilder(); m_rectTransform = GetComponent(); m_processorTypeText.text = "CPU: " + SystemInfo.processorType + " [" + SystemInfo.processorCount + " cores]"; m_systemMemoryText.text = "RAM: " + SystemInfo.systemMemorySize + " MB"; m_graphicsDeviceVersionText.text = "Graphics API: " + SystemInfo.graphicsDeviceVersion; m_graphicsDeviceNameText.text = "GPU: " + SystemInfo.graphicsDeviceName; m_graphicsMemorySizeText.text = "VRAM: " + SystemInfo.graphicsMemorySize + "MB. Max texture size: " + SystemInfo.maxTextureSize + "px. Shader level: " + SystemInfo.graphicsShaderLevel; Resolution res = Screen.currentResolution; m_screenResolutionText.text = "Screen: " + res.width + "x" + res.height + "@" #if UNITY_2022_2_OR_NEWER + ((int)Screen.currentResolution.refreshRateRatio.value).ToStringNonAlloc() #else + res.refreshRate #endif + "Hz"; m_operatingSystemText.text = "OS: " + SystemInfo.operatingSystem + " [" + SystemInfo.deviceType + "]"; m_gameVRResolutionText.text = "VR: Not active"; float preferredWidth = 0; // Resize the background overlay List texts = new List() { m_graphicsDeviceVersionText, m_processorTypeText, m_systemMemoryText, m_graphicsDeviceNameText, m_graphicsMemorySizeText, m_screenResolutionText, m_gameWindowResolutionText, m_gameVRResolutionText, m_operatingSystemText }; foreach( var text in texts ) { if( text.preferredWidth > preferredWidth ) { preferredWidth = text.preferredWidth; } } m_rectTransform.SetSizeWithCurrentAnchors ( axis: RectTransform.Axis.Horizontal, size: preferredWidth + 25 ); m_rectTransform.anchoredPosition = new Vector2 ( x: m_rectTransform.anchoredPosition.x - m_rectTransform.rect.width / 2 + m_rectTransform.rect.width / 2 * Mathf.Sign( m_rectTransform.anchoredPosition.x ), y: m_rectTransform.anchoredPosition.y ); m_origPosition = m_rectTransform.anchoredPosition; UpdateParameters(); } #endregion } }